Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Tableau bidimensionnel & Collisions ...

Problème très étrange !

Sujet résolu
    28 juin 2006 à 14:07:27

    Salut tout le monde !

    Je m'occupe actuellement de la création d'un jeu en C & SDL. Pour gérer les collisions personnage/décor, j'ai recours à un tableau int bidimensionnel, dont les cellules vont prendre la valeur 0 en absence de sprite (zone walkable) et 1 en cas de sprite (zone non walkable).

    Mes collisions fonctionnent bien, très bien ... à tel point qu'il y en a quand il n'en faut pas.

    J'ai cherché l'origine du problème, et je me rends compte que lors du chargement de la map (par lecture de fichier) et par la même occasion lors du changement des valeurs du tableau ... certaines cellules du tableau prennent la valeur 1 alors qu'elles ne correspondent pas à un sprite (ni à l'affichage, ni dans le fichier lu ...).

    J'ai donc testé le tableau avant l'affichage de la map, et tout était bien initialisé à 0. J'en ai donc conclu que le problème venait de mon algo qui permet de détecter sur quelle(s) cellule(s) se trouvent les sprites.

    (Je précise que la taille des sprites est un multiple de la taille de chaque "bloc")

    Voici mon code, qui pourtant me semble juste, mais qui semble poser problème :


    void affichageMap(SDL_Surface *ecran, SDL_Surface *background, FILE* map, SDL_Surface *spriteChoisi[], int carte[][NB_BLOCS_H])
    {
    //---- Déclaration des variables -----------------------------------------------
    SDL_Rect position;

    int choixSprite = 0,
        position_x = 0,
        position_y = 0,
        largeur_sprite = 0,
        hauteur_sprite = 0;

    char chaine[20];

    int rc, l, h;
    //------------------------------------------------------------------------------

    //---- Affichage du Background -------------------------------------------------
    SDL_BlitSurface(background, NULL, ecran, NULL);
    //------------------------------------------------------------------------------

    //---- On lit le contenu du fichier & on affiche les sprites -------------------
    if (map != NULL)
    {
        while(fgets(chaine, 20, map) != NULL)
        {
            if ( (rc = sscanf(chaine,"%d %d %d %d %d", &choixSprite, &position_x, &position_y, &largeur_sprite, &hauteur_sprite)) != 5)
            {
                exit(EXIT_FAILURE);
            }
            else
            {

                position.x = position_x;
                position.y = position_y;

                SDL_BlitSurface(spriteChoisi[choixSprite], NULL, ecran, &position);

                for(l = 0 ; l < (largeur_sprite / LARGEUR_BLOC) ; l++)
                {
                    for(h = 0 ; h < (hauteur_sprite / HAUTEUR_BLOC) ; h++)
                    {
                        carte[(position.y / HAUTEUR_BLOC) + h][(position.x / LARGEUR_BLOC) + l] = 1;
                    }
                }
            }
        }
        fclose(map);
    }
    else
    {
        exit(EXIT_FAILURE);
    }


    }



    Pour illustrer le problème :

    Voilà un exemple d'affichage des sprites :

    Affichage

    Voilà les valeurs du tableau correspondant ... je ne comprends vraiment pas :

    Valeurs du tableau

    Ou les 2 superposés :

    Affichage & Valeurs


    Merci d'avance pour votre aide !

    PS : je sais que le sujet est déjà posté sur developpez.com, mais le pb est qu'ils délibèrent plus sur l'utilisation du feof que sur l'origine du pb ... mais si ce "double post" n'est pas apprécié, supprimez-le !
    • Partager sur Facebook
    • Partager sur Twitter
      28 juin 2006 à 17:36:51

      Qu'est-ce donc "sscanf" ? C'est pour prendre des nombres sur une chaîne ?
      • Partager sur Facebook
      • Partager sur Twitter
        28 juin 2006 à 17:40:04

        Oui ... fgets + sscanf associés jouent le rôle d'un fscanf ;)

        D'ailleurs, avant j'utilisais fscanf, mais le problème était le même donc ça ne vient pas de là ! Merci de t'y intéresser, je commence à désespérer !

        J'ai jamais eu un bug si déroutant là !
        • Partager sur Facebook
        • Partager sur Twitter
          28 juin 2006 à 17:43:11

          largeur_sprite / LARGEUR_BLOC = 1 obligatoirement non ?
          • Partager sur Facebook
          • Partager sur Twitter
            28 juin 2006 à 17:45:42

            non ... un sprite va avoir une longueur et une largeur égale à un multiple de la largeur / hauteur d'un bloc.

            Les blocs sont des divisions invisibles comme par eemple pour le TP de M@teo sauf qu'ici les sprites ne font pas tous 1 bloc.

            C'est pour ça que j'utilise des boucles, sinon j'aurais simplement mis la ligne carte[...][...] ! ;)
            • Partager sur Facebook
            • Partager sur Twitter
              28 juin 2006 à 17:49:00

              Ok. Ce que je trouve bizarre, c'est que tu déclares les variables position_x et position_y à 0, ensuite tu mets position.x = position_x et pareil pour le y. Donc les sous-variables de position sont égales à 0...

              carte[(position.y / HAUTEUR_BLOC) + h][(position.x / LARGEUR_BLOC) + l] = 1;


              Cela équivaut à:

              carte[h][l] = 1;


              Je capte pas...
              • Partager sur Facebook
              • Partager sur Twitter
                28 juin 2006 à 17:57:31

                Non ... alors je t'explique.

                lorsque je lis le fichier, je stocke la position du sprite à affiche dans les variables position_x et position_y pour une simple et bonne raison. position.x et position.y sont des short int (il me semble), donc je ne peux pas les obtenir avec "%d" avant un *scanf.

                Après quoi, une fois que j'ai récupéré position_x et position_y prenons par exemple position_x = 64 et position_y = 32, je les stocke dans les variables SDL_Rect position.x et position.y.

                J'ai donc : - position.x = 64;
                - position.y = 32;

                A partir de là je dois savoir quel "bloc" correspond à cette position. Je fais donc position.x / LARGEUR_BLOC et de même pour la hauteur.

                donc carte n'équivaut pas à carte[h][l] mais bien à tout ce que j'ai écrit ... à moins qu'on me détrompe :) ;).

                C'est en quoi mon problème est vraiment capilotracté, je n'en vois pas l'issue ni l'origine !
                • Partager sur Facebook
                • Partager sur Twitter
                  28 juin 2006 à 18:05:25

                  Essaie d'inverser les deux dimensions de ton tableau lorsque tu fais carte[h][l] = n (par exemple): on sait jamais l'erreur est peut-être due à ça ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 juin 2006 à 18:18:03

                    Merci, merci merci ! Ce n'était pas exactement ça, c'était dans la définition du tableau bidimensionnel et des constantes qu'il y avait mélange, mais tu m'as mis la puce à l'oreille !

                    Merci beaucoup !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 juin 2006 à 18:21:11

                      De rien, content de t'avoir aidé ;)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [C] Tableau bidimensionnel & Collisions ...

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown