Partage
  • Partager sur Facebook
  • Partager sur Twitter

Poblème de mouvement dans mon Tétris

Sujet résolu
    28 juillet 2007 à 22:13:33

    Salut à tous, j'essaie de coder un Tétris avec ce que je sait du C/C++ grâce à ce que j'ai appris sur ce site, mais j'ai un problème avec la méthode qui fait bouger les blocs. Là voici :
    void Blocs::mouvement(SDL_Surface *ecran, SDL_Surface *bloc, bool cases[][NB_BLOCS_HAUTEUR], int mouv_x, int mouv_y)
    {
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); // On vide l'écran
        SDL_Rect positionBlit; // Un rect qui servira pour blitter notre bloc
        if (collision(cases, mouv_x, mouv_y)) // si il y a une collision
        {
            if (mouv_x == 0 && mouv_y !=0) // et si c'est un mouvement vers le bas, c'est qu'il à touché quelque chose qui doit le faire s'arreter
            {
                for (int i = 0; i < 4; i++)
                    cases[m_xyBloc[i].x][m_xyBloc[i].y] = 1; // On dit au tableau que les cases vides d'avant sont maintenant des blocs

                delete this; // et on supprime l'objet actuel (je sais pas si ça marche, mais ça plante pas à la compilation)
            }
        }

        else // si il y a pas de collision
        {
            for (int i = 0; i < 4; i++)
            {
                if (mouv_x == 0 && mouv_y !=0) // si c'ets un mouvement vers le bas
                    m_xyBloc[i].y += m_vitesse; // on fait descendre le bloc

                else if (mouv_y == 0 && mouv_x !=0) // sinon, si c'est un mouvement horizontal
                    m_xyBloc[i].x += mouv_x; // on le bouge à droite ou à gauche

                positionBlit.x = m_xyBloc[i].x * TAILLE_BLOC;
                positionBlit.y = m_xyBloc[i].y * TAILLE_BLOC;

                SDL_BlitSurface(bloc, NULL, ecran, &positionBlit); // puis on blitte le bloc actuel à sa nouvelle position
            }
        }

        for (int i = 0; i < NB_BLOCS_LIGNE; i++)
        {
            for (int j = 0; j = NB_BLOCS_HAUTEUR; j++)
            {
                if (cases[i][j] == 1) // ensuite on parcourt toutes les cases du tableau, et si c'est égal à un
                {
                    positionBlit.x = i * TAILLE_BLOC;
                    positionBlit.y = j * TAILLE_BLOC;
                    SDL_BlitSurface(bloc, NULL, ecran, &positionBlit); // on blitte un petit bloc
                }
            }
        }
    }

    bool Blocs::collision(bool cases[][NB_BLOCS_HAUTEUR], int mouv_x, int mouv_y)
    {
        for (int i = 0; i < 4; i++)
        {
            if (cases[m_xyBloc[i].x + mouv_x][m_xyBloc[i].y + mouv_y] == 1 || // si on touche un bloc
                m_xyBloc[i].x + mouv_x < 0 || // ou si on touche le mur de gauche
                m_xyBloc[i].x + mouv_x > NB_BLOCS_LIGNE || // ou le mur de droite
                m_xyBloc[i].y + mouv_y > NB_BLOCS_HAUTEUR) // ou le sol
                    return 1; // ben on à une collision
        }

        return 0; // on à pas detecté de collision, tout va bien
    }


    Dans le main, je fait appel à la fonction jeu, qui prend en charge le jeu (sans blague :p ) et la boucle principale ne se réitère pas après que je fait appel à ces méthodes, rien de s'affiche à l'écran, donc c'ets un foirage total :(

    Une âme bienvellante pourrait-elle m'indiquer le droit chemin? :ange:

    EDIT : J'ai vu mon erreur : Un = au lieu d'un < dans une boucle :D
    • Partager sur Facebook
    • Partager sur Twitter
      28 juillet 2007 à 22:26:00

      Salut.

      A mon avis tu dois avoir un petit problème de conception.
      Tes méthodes prennent bien trop d'arguments.

      Quelle est à peu près l'organisation de ton programme ? Au niveau des classes je veux dire.
      • Partager sur Facebook
      • Partager sur Twitter
        28 juillet 2007 à 22:35:14

        C'est vrai que j'ai fait ça un peu au feeling, j'en suis conscient, mais je pensais changer ça plus tard, quand j'aurai réussi à faire marcher tout. Donc j'aimerai bien qu'on se centre sur mon problème, avant de voir côté optimisation.

        (Et pour répondre à ta question, j'ai qu'une classe : Blocs qui gèrela génération, le mouvement, et la destruction du bloc, en gros il gère sa vie ^^)
        • Partager sur Facebook
        • Partager sur Twitter
          28 juillet 2007 à 22:51:32

          Citation : bogoss

          C'est vrai que j'ai fait ça un peu au feeling, j'en suis conscient, mais je pensais changer ça plus tard, quand j'aurai réussi à faire marcher tout.


          Ah oui mais non. Ca c'est pas possible :p
          Tu ne peux pas faire un programme de plus de 100 lignes "au feeling". (je dis 100 lignes au pif hein)

          Citation : bogoss

          (Et pour répondre à ta question, j'ai qu'une classe : Blocs qui gèrela génération, le mouvement, et la destruction du bloc, en gros il gère sa vie ^^)


          Le voila le problème, tu dois absolument décomposer ton prog en plusieurs classes.

          Pour un tetris voilà ce qui me vient à l'esprit :
          - Une classe pour la pièce en train de chuter (CPieceEnCours)
          - Une classe pour chaque case du plateau (CCase)
          - Une classe pour le plateau entier (CPlateau)

          En gros tu te débrouille pour qu'un booléen soit associé à chaque case, et comme ça la gestion des collisions et élimination des pièces sera un jeu d'enfant.


          En ce qui concerne le code existant, il est trop "touffu" pour qu'on puisse y comprendre quoi que ce soit. (même si il est bien commenté)
          Tu devrais essayer de le diviser en plusieurs fonctions plus petites et plus spécialisées. :)
          • Partager sur Facebook
          • Partager sur Twitter
            28 juillet 2007 à 23:01:44

            Citation : Kevin Leonhart


            Pour un tetris voilà ce qui me vient à l'esprit :
            - Une classe pour la pièce en train de chuter (CPieceEnCours)
            - Une classe pour chaque case du plateau (CCase)
            - Une classe pour le plateau entier (CPlateau)



            C'ets bien beau, mais je vois aps du tout quoi mettre dedans (enfin, je vois pas quoi mettre pour que ça mérite d'avoir une classe à part entière)?

            Citation : Kevin Leonhart

            En gros tu te débrouille pour qu'un booléen soit associé à chaque case, et comme ça la gestion des collisions et élimination des pièces sera un jeu d'enfant.


            C'ets déjà le cas : j'ai un tableau de bool (c'est le "cases[][]") qui à pour valeur 0 quand la case est vide, et 1 quand il y a un bloc dedans.


            Citation : Kevin Leonhart

            En ce qui concerne le code existant, il est trop "touffu" pour qu'on puisse y comprendre quoi que ce soit. (même si il est bien commenté)
            Tu devrais essayer de le diviser en plusieurs fonctions plus petites et plus spécialisées. :)


            C'ets le genre d'optimisation que je pensait faire à la fin, parce que sinon, ça va finir comme un morpion que j'ai fait que j'ai du réécrire plusieurs fois car je voulais optimiser et clarifier, et au final ça m'a complètement embrouillé.
            • Partager sur Facebook
            • Partager sur Twitter
              28 juillet 2007 à 23:17:37

              Citation : bogoss

              C'ets bien beau, mais je vois aps du tout quoi mettre dedans (enfin, je vois pas quoi mettre pour que ça mérite d'avoir une classe à part entière)?


              Une classe c'est pas forcement gros, faut surtout que ça soit cohérent.

              Dans les grandes lignes ça donne :

              CCase :
              - un booléen pour dire si elle est occupé ou pas.
              - un attribut pour la couleur si elle est occupée. (ou la surface)

              CPlateau :
              - Un tableau 2D de CCase en attribut
              - Une méthode pour gérer l'élimination des pièces : A chaque descente de la pièce tu vérifie une ligne du tableau pour savoir si elle est entièrement pleine ou pas.

              CPieceEnCours :
              - Toutes les pièces de tetris comportent 4 blocks. Donc un tableau de 4 variables contenants chaqune la position en X et Y du block. Tu peux par exemple utiliser un SDL_rect pour ça.
              - Une méthode qui fait bouger la pièce. Donc un paramètre pour la direction, et le tableau de CPlateau pour la detection de collision.

              C'est tout ce qui me vient à l'esprit pour l'instant mais il y a bien plus à faire.
              Toute la partie de gestion du temps par exemple.


              Citation : bogoss

              C'ets le genre d'optimisation que je pensait faire à la fin, parce que sinon, ça va finir comme un morpion que j'ai fait que j'ai du réécrire plusieurs fois car je voulais optimiser et clarifier, et au final ça m'a complètement embrouillé.


              En fait le plus dur c'est de bien concevoir le programme au début.
              Une fois que c'est fait, du fait de l'encapsulation, tu peux optimiser classe par classe sans tout chambouler. :)
              • Partager sur Facebook
              • Partager sur Twitter
                28 juillet 2007 à 23:26:43

                Ok, je comprends. Mais là c'est vraiment foutu? Je suis pas quand même obligé de changer tout ça pour que ça marche? Parce que j'aimerai bien voir mes blocs s'empiler avant de faire tout ça :p .
                • Partager sur Facebook
                • Partager sur Twitter
                  28 juillet 2007 à 23:30:05

                  Bah c'est toi qui vois mais j'ai l'impression que tu vas passer autant de temps à faire marcher le truc actuel que de tout refaire depuis le début. ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 juillet 2007 à 23:45:59

                    Ok, mais je vais attendre l'avis de quelqu'un d'autre, pour voir s'il peut rémédier à mon problème, avant de tout revoir ;) .
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Poblème de mouvement dans mon Tétris

                    × 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