Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Blit d'une surface

Problème lors d'un blit

Sujet résolu
    22 avril 2008 à 18:49:00

    Bonjour tous le monde,
    J'aimerai créer un BomberMan en C++ (pour le fun) et pour l'instant tout marche bien.
    J'arrive a la gestion des bombes et lorsque le joueur appuie sur la touche pour poser la bombe, ma variable-tableau (comme celle du sokoban) change bien de valeur mais lors du blit les bombes ne s'affiche pas (j'ai essayer de les charger au départ de la map et la ça marche, donc c'est pas un problème d'image non trouvé).

    voila le passage qui plante (j'utilise la SDL avec la POO) :

    void Game::DisplayMap()
    {
        for(int i = 0; i < LARGEUR; i++)
        {
            for(int j = 0; j < HAUTEUR; j++)
            {
    
                map_pos.x = (i * CASE);
                map_pos.y = (j * CASE);
    
                switch(m_Map[i][j])
                {
                    //Blitte de la map case par case
                    case BLOC:
                        m_SDL.BlitSurface(m_blocs[BLOC], &map_pos);
                        break;
                    case BRIQUE:
                        m_SDL.BlitSurface(m_blocs[BRIQUE], &map_pos);
                        break;
                    case BOMB:
                        m_SDL.BlitSurface(m_blocs[BOMB], &map_pos);
                        break;
                    default:
                        break;
                }
            }
        }
    }
    


    et j'appelle la fonction dans la classe Game avec :
    this->DisplayMap();
    


    Merci d'avance pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      22 avril 2008 à 19:02:42

      Je ne vois pas d'où vient le problème, mais petite information : tu n'es pas obligé de mettre this->DisplayMap();.
      DisplayMap(); tout court est siffisant ! ;)
      • Partager sur Facebook
      • Partager sur Twitter
        22 avril 2008 à 19:16:20

        Merci pour le conseil mais je préfère garder le this (une habitude) :)
        • Partager sur Facebook
        • Partager sur Twitter
          22 avril 2008 à 20:04:58

          La seul erreur possible que je vois c'est que le "BOMB" dans le switch doit pas être écrit de la même manière que dans l'énumération.
          • Partager sur Facebook
          • Partager sur Twitter
            24 avril 2008 à 18:49:02

            Non mon BOMB est bien enumeré, j'ai essayer de poser des blocs incassables (pour debug) et la non plus ca me les affiche pas.
            • Partager sur Facebook
            • Partager sur Twitter
              25 avril 2008 à 22:24:32

              As tu placer l'image de la bombe au bon endroit? :p

              Sait on jamais...
              • Partager sur Facebook
              • Partager sur Twitter
                25 avril 2008 à 23:12:28

                Oui je l'ai bien placée, j'arrive à la blitter au chargement de la map.
                • Partager sur Facebook
                • Partager sur Twitter
                  26 avril 2008 à 0:35:39

                  ben donne nous le bout du code chargé de modifier la valeur dem_Map[i][j]
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 avril 2008 à 10:15:29

                    La fonction SetBomb()
                    (les commentaires et le cout sont le pour le debug)
                    La valeur de m_Map est bien changer au bon endroit c'est juste au moment du blit

                    void Player::SetBomb()
                    {
                    	//Pour mettre la bombe sous les pieds
                        x = (pos.x+(m_player[0][0]->w/2))/CASE;
                        y = (pos.y+(m_player[0][0]->h/2))/CASE;
                    
                        if(m_Map[x][y] == VIDE)
                        {
                            if(nb_set_bombs < 9 && nb_set_bombs < nb_bombs)
                            {
                                cout << "Bombes ajouté" << endl;
                    
                                m_Map[x][y] = BOMB;
                    
                                this->DisplayMap();
                    
                                /*cout << "This->[" << x << "][" << y << "]" << endl;
                    
                    				for(int i = 0; i < LARGEUR; i++)
                    				{
                    					for(int j = 0; j < HAUTEUR; j++)
                    					{
                    						cout << "["<<i<< "]["<<j<<"]=>"<<m_Map[i][j]<<endl;
                    					}
                    				}//*/
                    
                                nb_set_bombs++;
                            }
                        }
                    
                        this->Check();
                    
                    }
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 avril 2008 à 14:25:48

                      ce qui suit n'est qu'un conseil en dehors du probleme
                      this->DisplayMap();
                      tu ne dois reafficher la map qu'une seule fois par frame!
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 avril 2008 à 16:59:50

                        Merci du conseil, je me demande pourquoi je l'ai mis là d'ailleurs.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 avril 2008 à 14:14:25

                          J'ai trouvé là ou ça bloque

                          void Game::DisplayMap()
                          {
                              for(int i = 0; i < LARGEUR; i++)
                              {
                                  for(int j = 0; j < HAUTEUR; j++)
                                  {
                          
                                      map_pos.x = (i * CASE);
                                      map_pos.y = (j * CASE);
                          
                                      switch(m_Map[i][j]) //<================== BUG ICI
                                      {
                                          //Blitte de la map case par case
                                          case BLOC:
                                              m_SDL.BlitSurface(m_blocs[BLOC], &map_pos);
                                              break;
                                          case BRIQUE:
                                              m_SDL.BlitSurface(m_blocs[BRIQUE], &map_pos);
                                              break;
                                          case BOMB:
                                              m_SDL.BlitSurface(m_blocs[BOMB], &map_pos);
                                              break;
                                          default:
                                              break;
                                      }
                                  }
                              }
                          }
                          


                          Grâce a des test je me suis aperçu que la boucle n'exécute pas le switch maitenant reste a savoir pourquoi :) .
                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 mai 2008 à 9:40:01

                            Salut,

                            Ce switch est inutile:

                            Tu peux faire comme suit:

                            /* ... */
                            m_SDL.BlitSurface(m_blocs[m_Map[i][j]], &map_pos);
                            /* ... */
                            



                            Voilà, essaye comme cela et dis le moi. :soleil:

                            Midoagent47

                            • Partager sur Facebook
                            • Partager sur Twitter
                              1 mai 2008 à 21:12:33

                              Non désolé ça ne marche toujours pas.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                1 mai 2008 à 23:00:21

                                euh ... juste une question ... c'est normal que ton blit n'ai que 2 paramètres au lieu de 4 ? :-°
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  2 mai 2008 à 0:55:07

                                  ouais, je trouve normal!
                                  sinon je trouve que tu n'as pas totalemnt orienté OO application, la preuve, tu passe la position a l'objet alors qu'il doit le seul a la connaitre(bref en private ou en protected)!
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    2 mai 2008 à 15:24:01

                                    Pour la position, j'ai pas trouvé comment faire autrement vu que a chaque tour de boucle je dois recalculer les coordonnées de la "case" à blitter.

                                    Oui c'est normale qu'il y est 2 paramètre, j'ai enlever ceux dont je me sert pas lors de l'orientation objet.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      2 mai 2008 à 16:39:53

                                      c'est la classe meme qui doit faire ces calculs!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        2 mai 2008 à 16:42:23

                                        Ok, crois-tu que l'erreur pourrai venir de là ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 mai 2008 à 18:45:48

                                          Désolé mais je ne vois pas comment faire pour que la classe SDL fasse les calculs, pourriez-vous m'éclairez ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            4 mai 2008 à 19:12:46

                                            non elle ne parvient pas de la. sinon pour que la classe fasse les calculs, je crois que c'est ça le coeur de l'OO. elle doit encapsuler sa position, non?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              4 mai 2008 à 19:43:20

                                              tu pourrais nous mettre tout le code source ? parce que la j'arrive pas bien a voir qui fait quoi et a quoi corresponde tes diverses variables ... :euh:
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                5 mai 2008 à 10:47:46

                                                voila ce queje te propose : chaque fois que tu affiche un objet : tu écris dans un fichier texte un truc du genre "BLIT BOMBE x=10; y=15". Comme ca tu verra si l'appel au blit est bien effecetué.
                                                Si c'est le cas je te soupsonne de faire ca :
                                                1) afficher les bombes
                                                2) afficher le décors
                                                3) afficher le personnage

                                                Alors qu'en vrai il faut faire 2;1;3
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  6 mai 2008 à 14:33:11

                                                  Voici le code source, désolé pour le retard :

                                                  Code source
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    6 mai 2008 à 15:33:07

                                                    class Player : public Game

                                                    deja ça c'est pas tres logique
                                                    et puis m_Map du perso n'est pas la meme de la classe Game
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      6 mai 2008 à 17:51:53

                                                      class Player : public Game

                                                      Ça me permet d'accéder au paramètre du jeu (events, l'objet SDL, les images des blocs, et plus tard les niveaux et bonus)


                                                      Citation : trqtrq

                                                      Si c'est le cas je te soupsonne de faire ca :
                                                      1) afficher les bombes
                                                      2) afficher le décors
                                                      3) afficher le personnage



                                                      Le blit ce fait dans l'ordre que tu a dis (décors, personnages).
                                                      Mais les bombes font parties intégrantes du décor (elle prennent une case).

                                                      Citation : total chaos

                                                      et puis m_Map du perso n'est pas la meme de la classe Game



                                                      Je ne comprend pas je ne l'ai pas redéclaré dans Player donc il devrait l'hériter non ?
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        6 mai 2008 à 20:15:01

                                                        "Ça me permet d'accéder au paramètre du jeu (events, l'objet SDL, les images des blocs, et plus tard les niveaux et bonus)"
                                                        tu te trompe. L'heritage permet certes d'heriter des parametres, mais des instances DIFFERENTES !!!
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        [SDL] Blit d'une surface

                                                        × 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