Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - Tyr

Pages: [1]
1
Réseau / [SFML 2.0] Problème socket TCP
« le: Décembre 17, 2013, 03:44:37 pm »
Hello,

le titre n'est pas exact en ce sens que le problème vient certainement de moi, mais voici mon soucis :
Je cherche à envoyer un message d'un client vers un serveur (deux programmes différents) en réseau local (pour le moment !), càd entre deux postes connectés à une même box.
Je tiens à préciser tout de suite que je suis nul en réseau. ^^"
Lorsque le client et le serveur tournent sur la même machine, tout se passe bien ; en revanche, lorsqu'il s'agit de postes séparés, le serveur de ne reçoit rien.

Voici le code (très simpliste, en guise de tests) :

client :
int main()
{
        unsigned short port = 53000;
        Packet packet;
        string message = "Message de test";
        packet << message;

        TcpSocket socket;
        TcpSocket::Status status = socket.connect(IpAddress::getLocalAddress(), port);
        if (status != TcpSocket::Done)
        {
                cout << "Status != Done" << endl;
        }

        if (socket.send(packet) != Socket::Done)
        {
                cout << "socket.send != Done" << endl;
        }

    socket.disconnect();
        return 0;
}

serveur :
int main()
{
        cout << "En attente du client..." << endl;

        TcpListener listener;
        if (listener.listen(53000) != sf::Socket::Done)
        {
                cout << "listener.listen != Done" << endl;
        }

        TcpSocket client;
        if (listener.accept(client) != sf::Socket::Done)
        {
                cout << "listener.accept != Done" << endl;
        }

        Packet packet;
        client.receive(packet);

        string data;
        packet >> data;
        size_t received = sizeof(data);

        std::cout << "Reçu " << received << " bytes : " << data << std::endl;
    listener.close();
        return 0;
}

Quel est donc le problème ?
Merci d'avance !

2
Graphique / Collisions pixel près
« le: Juillet 21, 2013, 01:21:51 am »
Bonjour !
Je programme un petit jeu de plateforme, et dans le cadre du développement de celui-ci, j'utilise depuis peu un système de collisions au pixel près (qui est, si mes souvenirs sont exacts, quelque part dans la doc), dont voici la méthode supposée me dire s'il y a ou non collision entre deux sprites, ainsi que la classe associée.
Je dois faire en sorte d'empêcher le héros (qui correspond à mon sprite 1, dirons-nous) de passer à travers la map (dont le sprite correspond au sprite 2, pour rester dans ce même esprit).

class BitmaskManager {


        public:

                ~BitmaskManager()
                {
                        map<const Texture*, Uint8*>::const_iterator end = Bitmasks.end();
                        for (map<const Texture*, Uint8*>::const_iterator iter = Bitmasks.begin(); iter != end; iter++)
                                delete [] iter->second;
                }

                Uint8 GetPixel (const Uint8* mask, const Texture* tex, unsigned int x, unsigned int y)
                {
                        if (x > tex->getSize().x || y > tex->getSize().y)
                                return 0;

                        return mask[x + y * tex->getSize().x];
                }

                Uint8* GetMask (const Texture* tex)
                {
                        Uint8* mask;
                        map<const Texture*, Uint8*>::iterator pair = Bitmasks.find(tex);

                        if (pair == Bitmasks.end())
                        {
                                Image img = tex->copyToImage();
                                mask = CreateMask(tex, img);
                        }
                        else mask = pair->second;

                        return mask;
                }

                Uint8* CreateMask (const Texture* tex, const Image& img)
                {
                        Uint8* mask = new Uint8[tex->getSize().y * tex->getSize().x];

                        for (unsigned int y = 0; y < tex->getSize().y; y++)
                        {
                                for (unsigned int x = 0; x < tex->getSize().x; x++)
                                        mask[x + y * tex->getSize().x] = img.getPixel(x, y).a;
                        }

                        Bitmasks.insert(pair<const Texture*, Uint8*>(tex,mask));

                        return mask;
                }

        private:

                map<const Texture*, Uint8*> Bitmasks;
        };
       
        BitmaskManager Bitmasks;
 
        // Retourne true s'il y a collision entre deux pixels tels que alpha > 0
        bool pixelPerfectCollision(const Sprite& Object1, const Sprite& Object2, Uint8 AlphaLimit)
        {
                FloatRect Intersection;

                if (Object1.getGlobalBounds().intersects(Object2.getGlobalBounds(), Intersection))
                {
                        IntRect O1SubRect = Object1.getTextureRect();
                        IntRect O2SubRect = Object2.getTextureRect();

                        Uint8* mask1 = Bitmasks.GetMask(Object1.getTexture());
                        Uint8* mask2 = Bitmasks.GetMask(Object2.getTexture());

                        // Loop through our pixels
                        for (int i = (int) Intersection.left; i < Intersection.left+Intersection.width; i++)
                        {
                                for (int j = (int) Intersection.top; j < Intersection.top + Intersection.height; j++)
                                {
                                        Vector2f o1v = Object1.getInverseTransform().transformPoint((float) i, (float) j);
                                        Vector2f o2v = Object2.getInverseTransform().transformPoint((float) i, (float) j);
 
                                        // Make sure pixels fall within the sprite's subrect
                                        if (o1v.x > 0 && o1v.y > 0 && o2v.x > 0 && o2v.y > 0 &&
                                                o1v.x < O1SubRect.width && o1v.y < O1SubRect.height &&
                                                o2v.x < O2SubRect.width && o2v.y < O2SubRect.height) {

                                                        if (Bitmasks.GetPixel(mask1, Object1.getTexture(), (int) o1v.x + O1SubRect.left, (int) o1v.y + O1SubRect.top) > AlphaLimit &&
                                                                Bitmasks.GetPixel(mask2, Object2.getTexture(), (int) o2v.x + O2SubRect.left, (int) o2v.y + O2SubRect.top) > AlphaLimit)
                                                                return true;
                                        }
                                }
                        }
                }
                return false;
        }

Jusqu'ici, tout baigne. Cependant, j'aimerais trouver les coordonnées du point de collision, afin de faire reculer ou avancer le héros en fonction du côté par lequel il rentre en collision avec la map.
Il y a bien une fonction getCollisionRect, mais je ne comprends pas trop son fonctionnement, et ne sais pas trop si elle pourrait ou non être la clé de mon problème.

Merci d'avance !

3
C / Tiles et plantage total...
« le: Mars 11, 2013, 11:12:58 am »
Hello...
Bon, après quelques semaines de recherche infructueuse, je viens demander de l'aide à propos d'un GROS problème dans mon programme.
J'ai implémenté à un projet un système de tiles de 32 * 32 px sur un écran de 544 * 416 px (soit 17 * 13 tiles à l'écran), mais ça plante totalement. Est-dû à une surconsommation de mémoire ?

Voici les portions de code concernées : ma structure Map et la fonction destinée à l'afficher (si je n'appelle pas la fonction, ça tourne normalement et pas de plantage, donc...).

typedef struct
{
    int id, scrolling;                  // ID et scrolling de la map
    int tab[MAP_WIDTH][MAP_HEIGHT];     // Matrice de la map
    sfSprite *tile;                     // Textures des tiles
    Coord coord;                        // Vecteur coordonnées d'un tile
    sfRenderWindow **app;
} Map;

void drawMap(Map* map)
{
    // Indices pour parcourir la matrice
    register int i, j;
    sfImage *img = NULL;

    // (Ré)initialisation du vecteur coordonnées de la map
    map->coord.y = 0;
    map->coord.x = map->scrolling;

    // Boucle d'affichage des tiles
    for (i = 0; i < MAP_WIDTH; i++)
        for (j = 0; j < MAP_HEIGHT; j++)
        {
            // Détermination des coordonnées
            map->coord.x = map->scrolling + TILE_SIZE * i;
            map->coord.y = TILE_SIZE * j;

            if (map->tile != NULL)
                sfSprite_SetPosition(map->tile, map->coord.x, map->coord.y);

            // Affichage du tile correspondant à tab[i][j] si à l'écran
            if (map->coord.x < COORD_MAX && map->coord.x > COORD_MIN)
                switch (map->tab[i][j])
                {
                    // Affichage du tile d'ID 1
                    case 1:
                        img = sfImage_CreateFromFile("210.jpg");
                        sfSprite_SetImage(map->tile, img);
                        sfRenderWindow_DrawSprite(*(map->app), map->tile);
                        break;

                    // Affichage du tile d'ID 2
                    case 2:
                        img = sfImage_CreateFromFile("211.jpg");
                        sfSprite_SetImage(map->tile, img);
                        sfRenderWindow_DrawSprite(*(map->app), map->tile);
                        break;

                    // A venir...
                    case 3:
                    break;

                    case 4:
                    break;

                    case 5:
                    break;

                    default:
                    break;
                }
    }

    sfImage_Destroy(img);
}
 

Et enfin le message d'erreur dans la console :



A propos du bug, sinon : j'affiche une map uniforme (tous les tiles sont les mêmes), et au bout d'un moment, ils se mettent à changer d'apparence apparemment aléatoirement plusieurs fois par seconde. Une idée ? =(

4
C / Combiner plusieurs images ?
« le: Février 28, 2013, 08:38:10 pm »
Plop,
ma question va paraître quelque peu particulière, mais je prends le risque :)

J'ai une image A et une image B.
Est-ce possible de les afficher bout à bout et de faire de cette "combinaison" une image C que l'on pourra réutiliser ultérieurement ?

Merci d'avance.

(Avec CreateFromPixels et CreateFromMemory peut-être ? Mais je vois pas du tout comment faire)

5
C / Gérer plusieurs touches en même temps ?
« le: Février 21, 2013, 01:42:24 pm »
Salut !

Je me demandais comment, en C, il était possible de gérer l'appui de plusieurs touches simultanément.
En C++, on peut procéder comme ça :

const sf::Input& Input = App.GetInput();
bool         RightKeyDown     = Input.IsKeyDown(sf::Key::Right);
bool         LeftKeyDown     = Input.IsKeyDown(sf::Key::Left);
bool         RightButtonDown = Input.IsMouseButtonDown(sf::Mouse::Right);
bool         Joy0Button1Down = Input.IsJoystickButtonDown(0, 1);
unsigned int MouseX          = Input.GetMouseX();
unsigned int MouseY          = Input.GetMouseY();
float        Joystick1X      = Input.GetJoystickAxis(1, sf::Joy::AxisX);
float        Joystick1Y      = Input.GetJoystickAxis(1, sf::Joy::AxisY);
float        Joystick1POV    = Input.GetJoystickAxis(1, sf::Joy::AxisPOV);

Cependant, la ligne :
sf::Input& Input = App.GetInput();
pose problème du fait de la référence, non ? Ou je suis passé à côté de quelque chose ? ^^

Merci d'avance !

6
Fenêtrage / Problème de curseur
« le: Février 12, 2013, 07:51:17 pm »
Hello !
J'utilise dans mon programme SFML une image en guise de curseur, cependant quand je redimensionne ma fenêtre, le curseur n'est plus positionné au même endroit que la souris (ses coordonnées sont peut-être également soumises au redimensionnement) ; une idée pour corriger ce problème ?

7
Fenêtrage / [Résolu] SFML et OpenGL
« le: Février 04, 2013, 04:04:11 pm »
Rebonjour,

Me revoilà avec un nouveau problème : je cherche à afficher des images 2D via SFML au sein d'un affichage 3D géré par OpenGL. Or, mon image 2D ne s'affiche pas, ou encore, elle s'affiche, mais le décor 3D ne s'affiche, lui, pas ; d'où ce problème vient-il ?
Voici mon code (attention c'est le bazar, y'a tout et n'importe quoi^^) :

// Includes nécessaires
#include "SceneManager.h"
#include "Game/Scenes/TitleScreen.h"
#include "ScriptingEngine/LuaDatabase.h"

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <GL/gl.h>
#include <GL/glu.h>

// Namespaces utilisés
using namespace sf;

// Point d'entrée du programme
int main()
{
    LuaDatabase lua;
    lua.setWindowSize();
    lua.setWindowTitle();

    // Fenêtre de rendu
    RenderWindow *app =
        new RenderWindow(VideoMode(lua.getWindowSize().width, lua.getWindowSize().height), lua.getWindowTitle());


    // Gestionnaire de scène
    SceneManager *sceneManager = new SceneManager(app);
    Sprite sprite;
    Image img;
    img.LoadFromFile("Graphics/Pictures/Cursor.png");
    sprite.SetImage(img);
    // Create a clock for measuring time elapsed
    sf::Clock Clock;

    // Set color and depth clear value
    glClearDepth(1.f);
    glClearColor(0.f, 0.f, 0.f, 0.f);

    // Enable Z-buffer read and write
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);

    // Setup a perspective projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);

    // Boucle principale
    while (app->IsOpened())
    {

        sprite.SetPosition(app->GetInput().GetMouseX(), app->GetInput().GetMouseY());
        sf::Event Event;
        while (app->GetEvent(Event))
        {
            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                app->Close();

            // Escape key : exit
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                app->Close();

            // Resize event : adjust viewport
            if (Event.Type == sf::Event::Resized)
                glViewport(0, 0, Event.Size.Width, Event.Size.Height);
        }

        app->SetActive();

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0, 0, -200);
        glRotatef(Clock.GetElapsedTime() * 50, 1, 0, 0);
        glRotatef(Clock.GetElapsedTime() * 30, 0, 1, 0);
        glRotatef(Clock.GetElapsedTime() * 90, 0, 0, 1);

        glBegin(GL_QUADS);

            glVertex3f(-50.f, -50.f, -50.f);
            glVertex3f(-50.f,  50.f, -50.f);
            glVertex3f( 50.f,  50.f, -50.f);
            glVertex3f( 50.f, -50.f, -50.f);

            glVertex3f(-50.f, -50.f, 50.f);
            glVertex3f(-50.f,  50.f, 50.f);
            glVertex3f( 50.f,  50.f, 50.f);
            glVertex3f( 50.f, -50.f, 50.f);

            glVertex3f(-50.f, -50.f, -50.f);
            glVertex3f(-50.f,  50.f, -50.f);
            glVertex3f(-50.f,  50.f,  50.f);
            glVertex3f(-50.f, -50.f,  50.f);

            glVertex3f(50.f, -50.f, -50.f);
            glVertex3f(50.f,  50.f, -50.f);
            glVertex3f(50.f,  50.f,  50.f);
            glVertex3f(50.f, -50.f,  50.f);

            glVertex3f(-50.f, -50.f,  50.f);
            glVertex3f(-50.f, -50.f, -50.f);
            glVertex3f( 50.f, -50.f, -50.f);
            glVertex3f( 50.f, -50.f,  50.f);

            glVertex3f(-50.f, 50.f,  50.f);
            glVertex3f(-50.f, 50.f, -50.f);
            glVertex3f( 50.f, 50.f, -50.f);
            glVertex3f( 50.f, 50.f,  50.f);

        glEnd();

        app->Draw(sprite);
        app->Display();
    }

    // On libère l'espace mémoire alloué
    free(app);
    free(sceneManager);
    app = NULL;
    sceneManager = NULL;

    // Fin du programme
    return EXIT_SUCCESS;
}
 

8
Graphique / [Résolu !] Problème d'affichage d'une image
« le: Février 01, 2013, 05:07:18 pm »
Rebonjour ^^
Je cherche à afficher une image là où est supposée apparaître la souris, cependant... Un screen sera plus parlant ^^" :



Le rectangle bleu est supposé être cette image :



Voici le code en question (je ne mets que les parties relatives à l'affichage de l'image pour davantage de clarté). Update et draw sont appelées en boucle, et l'objet cursor est une instance de la classe Sprite.

#include "SceneManager.h"

SceneManager::SceneManager(RenderWindow *app)
{
    // Initialisation
    this->app = app;

    // Icône de la souris
    Image curs;
    curs.LoadFromFile("Graphics/Pictures/Cursor.png");
    this->cursor.SetImage(curs); // cursor est un Sprite !
}

void SceneManager::update()
{
    // Màj des coordonnées du curseur
    this->cursor.SetPosition(this->app->GetInput().GetMouseX(), this->app->GetInput().GetMouseY());

    // ...
}

void SceneManager::draw()
{
    // Efface l'écran (remplissage avec du blanc)
    this->app->Clear(Color(255, 255, 255));

    // Affichage de la souris
    this->cursor.SetColor(Color(0, 255, 255, 128));
    this->app->Draw(this->cursor);

    // Affichage du contenu de la fenêtre à l'écran
    this->app->Display();
}

9
Fenêtrage / [Résolu] Masquer la souris ?
« le: Février 01, 2013, 02:15:03 pm »
Dans le cadre de mon projet vidéoludique, je voudrais savoir s'il était possible de masquer la souris pour afficher une image autre en tant que curseur lorsque la souris survole la fenêtre.
Est-ce possible, et comment ?

Merci d'avance.

Pages: [1]
anything