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.


Messages - Tyr

Pages: [1] 2 Suivante »
1
Réseau / Re : [SFML 2.0] Problème socket TCP
« le: Décembre 17, 2013, 11:16:00 pm »
Alors, j'ai trouvé pour le réseau local, il suffisait de faire :
socket.connect(IpAddress("nom de l'ordinateur cible"), 54000);

Cependant, comment cela marche-t-il en WAN ?
Merci d'avance.

2
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 !

3
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 !

4
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 ? =(

5
C / Re : Combiner plusieurs images ?
« le: Mars 01, 2013, 11:42:09 am »
Ah, je pensais que ça allait écraser la valeur de la destination.

6
C / Re : Combiner plusieurs images ?
« le: Février 28, 2013, 11:15:18 pm »
Je ne visualise pas bien la chose ; Copy prend une image source et la copie vers une image destination. Comment puis-je mettre deux images sources ?

7
C / Re : Combiner plusieurs images ?
« le: Février 28, 2013, 08:46:01 pm »
J'utilise la SFML 1.6.

Pourrais-tu me guider en m'indiquant comment faire ?

8
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)

9
C / Re : Gérer plusieurs touches en même temps ?
« le: Février 28, 2013, 07:33:30 pm »
Oui, j'ai un peu de mal à faire le raisonnement de manière automatique, mais ça viendra avec le temps ^^
Merci Laurent :)

10
C / Re : Gérer plusieurs touches en même temps ?
« le: Février 28, 2013, 12:08:05 pm »
Je crois avoir compris mais un point reste assez... obscur, dirons-nous.
J'envoie à sfWindow_GetInput un pointeur de type sfRenderWindow (qui en C n'hérite pas de sfWindow, d'où mon erreur >_<), c'est peut-être pour ça que ça ne marche pas, non ?
Je te donne le code complet afin de mieux visualiser la chose (pour la petite histoire, on doit programmer un jeu du type Choplifter dans le cadre de nos études) :

Main :
#include <stdio.h>
#include <stdlib.h>
#include <SFML/Graphics.h>
#include "map.h"
#include "helico.h"
int main()
{
    sfWindowSettings Settings = {24, 8, 0};
    sfVideoMode Mode = {544, 416, 32};
    sfRenderWindow* App;
    sfEvent Event;

    // Début test

    Map map;
    map.app = &App;
    initMapArrayTo(&map, 1);
    map.tab[0][0] = 2;
    map.tab[16][12] = 2;

    Helico helico;
    helico.app = &App;
    helico.texture = sfSprite_Create();
    helico.coord.x = 0;
    helico.coord.y = 208;
    helico.speed = 1;

    // Fin test

    /* Create the main window */
    App = sfRenderWindow_Create(Mode, "SFML window", sfClose, Settings);

    /* Start the game loop */
    while (sfRenderWindow_IsOpened(App))
    {
        /* Process events */
        while (sfRenderWindow_GetEvent(App, &Event))
        {
            /* Close window : exit */
            if (Event.Type == sfEvtClosed)
            sfRenderWindow_Close(App);
        }

        /* Clear the screen */
        sfRenderWindow_Clear(App, sfBlack);

        drawMap(&map);
        drawHelico(&helico, &map);

        /* Update the window */
        sfRenderWindow_Display(App);
    }

    /* Cleanup resources */
    sfRenderWindow_Destroy(App);

    return EXIT_SUCCESS;
}

Helico.c :
#include "helico.h"

void drawHelico(Helico *helico, Map *map)
{
    sfImage *img;
    sfInput *input = sfWindow_GetInput(*(helico->app));

    helico->direction = 'd';

    sfBool rightKeyDown    = sfInput_IsKeyDown(input, sfKeyRight),
            leftKeyDown     = sfInput_IsKeyDown(input, sfKeyLeft),
            upKeyDown       = sfInput_IsKeyDown(input, sfKeyUp),
            downKeyDown     = sfInput_IsKeyDown(input, sfKeyDown);

    if (upKeyDown == sfTrue)
        helico->coord.y -= helico->speed;

    if (downKeyDown == sfTrue)
    {
        // Si pas en contact avec le sol
        helico->coord.y += helico->speed;
    }

    if (sfInput_IsKeyDown(input, sfKeyRight) == sfTrue)
    {
        helico->direction = 'd';
        //if (helico->coord.x <= MIDDLESCREEN - MIDDLEWIDTH)
            helico->coord.x += helico->speed;
        //else map->scrolling--;
    }

    if (leftKeyDown == sfTrue)
    {
        helico->direction = 'g';
        //if (helico->coord.x >= MIDDLESCREEN - MIDDLEWIDTH)
            helico->coord.x -= helico->speed;
        //else map->scrolling++;
    }

    if (helico->direction == 'd')
        img = sfImage_CreateFromFile("helico_d.png");
    else if (helico->direction == 'g')
        img = sfImage_CreateFromFile("helico_g.png");

    sfSprite_SetImage(helico->texture, img);
    sfSprite_SetPosition(helico->texture, helico->coord.x, helico->coord.y);
    sfRenderWindow_DrawSprite(*(helico->app), helico->texture);
}

void shoot(Helico *helico)
{
}

void update(Helico *helico)
{
}

Helico.h :
#ifndef HELICO_H_INCLUDED
#define HELICO_H_INCLUDED

#include "struct/coord.h"
#include "map.h"
#include <SFML/Graphics.h>

#define MAX_SPEED 3
#define MAX_LIFE 3
#define MIDDLESCREEN 272
#define MIDDLEWIDTH 32

typedef struct
{
    Coord coord;
    int speed, life;
    char direction;
    sfSprite *texture;
    sfRenderWindow **app;
} Helico;

void drawHelico(Helico *helico, Map *map);
void shoot(Helico *helico);
void update(Helico *helico);

#endif // HELICO_H_INCLUDED
 

Une idée pour reprendre la chose sans se prendre la tête entre Window et RenderWindow ?

EDIT - Résolu !
=> sfRenderWindow_GetInput
Que je suis bête parfois u_u

11
C / Re : Gérer plusieurs touches en même temps ?
« le: Février 27, 2013, 06:28:08 pm »
Je reprends ce topic suite à un autre problème (en C) :

sfInput *input = sfWindow_GetInput(*app);
if (sfInput_IsKeyDown(input, sfKeyRight) == sfTrue)
{
    ...
}

Il semblerait que cette condition n'est jamais validée dans le sens où son contenu n'est jamais effectué quand j'appuie sur la touche droite.
(le contenu est valide par contre, il s'exécute si je retire la condition)

Je ne comprends pas d'où le problème vient.

12
C / Re : Gérer plusieurs touches en même temps ?
« le: Février 21, 2013, 02:08:32 pm »
Super, merci Laurent. :)

13
C / Re : Gérer plusieurs touches en même temps ?
« le: Février 21, 2013, 01:56:56 pm »
J'ai regardé il y a un moment, sans succès (sans m'être vraiment plongé dedans, je l'admets  ::) ), mais il m'est depuis sorti de la tête de poser cette question sur le forum, et n'ai pas eu la présence d'esprit de re-regarder.

Donc, si je ne me trompe pas, on aura le code suivant :
const sfInput *Input = Window_GetInput(App);
C'est bien ça ?

14
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 !

15
Fenêtrage / Re : Problème de curseur
« le: Février 12, 2013, 08:25:31 pm »
http://www.sfml-dev.org/documentation/1.6/classsf_1_1RenderWindow.php#a05c614a2cdc2c2c4e3b473e39b3b9a17

=> à quoi correspond TargetView ?

Sinon, ça marche nickel, merci Laurent =)

Pages: [1] 2 Suivante »
anything