Partage
  • Partager sur Facebook
  • Partager sur Twitter

Blocs parasite

Dans mon tétris

Sujet résolu
    15 décembre 2007 à 19:30:49

    Bonjour

    Je suis en train de créer un tétris et j'ai un drôle de problème.

    Lorsqu'un nouveau bloc arrive, il tombe normalement, mais lorsqu'il touche le "sol" du jeu, un bloc parasite apparaît à mi-hauteur:
    Image utilisateur

    Le second bloc qui tombe se "fixe" donc sur le bloc parasite (normal, un bloc ne sait pas descendre sur un bloc.

    Le problème est que le second bloc a aussi un "parasite". Voyez plutôt:
    Image utilisateur

    Le jeu est en fait composé d'une carte de INT (comme dans mario Sokoban) qui contient tout le jeu (sauf le menu) ainsi que les blocs "fixes".
    Les coordonnées du bloc qui tombe sont retenues dans un tableau de 4 SDL_Rect.

    Ce tableau est envoyé à une fonction qui regarde si le bloc peut encore descendre et, si ce n'est pas le cas, fixe ses coordonnées dans le tableau "carte" (tableau de INT, tout le jeu). et met à -1 les coordonnées du bloc qui tombe (pour ne pas qu'il s'affiche).

    Le problème se situe dans cette fonction, lorsque les coodonnées du bloc qui "tombe" sont "greffées" dans le tableau de INT.

    Voici le code de ma fonction (pour les test, on ne peut faire tomber qu'une barre horizontale).
    1. void bloc::descente(SDL_Rect *pos, int piece, int carte[][NB_BLOCS_L], bool &forme){
    2.     /*
    3. SDL_Rect *pos est le tableau de 4 contenant les coord. du bloc qui tombe
    4. piece est le tupe de piece (un nombre de 1 à 7) 1 pour la barre horizontale
    5. carte[][NB_BLOCS_L] est la ... carte qui contient tous les blocs qui  ne peuvent plus bouger
    6. &forme est un booléen qui indique si on doit piocher une nouvelle piece ou non.
    7. */
    8. switch(piece){//Suivant la pièce, les manip. seront différentes
    9.         case 1: //Case 1 = barre horizontale
    10.             if(carte[pos[0].x][pos[0].y+1] == 0 && carte[pos[1].x][pos[1].y+1] == 0
    11.         && carte[pos[2].x][pos[2].y+1] == 0 && carte[pos[3].x][pos[3].y+1] == 0
    12.         && pos[0].y+1 < NB_BLOCS_H){
    13.             //SI la barre peut tomber, on la fait descendre d'un cran
    14.             for(int i=0;i<4;i++){
    15.                 pos[i].y++;
    16.             }
    17.         }
    18.         else{
    19.           //Sinon, on la fixe dans le tableau de INT
    20.             for(int i=0;i<4;i++)
    21.                 carte[pos[i].x][pos[i].y] = piece;
    22.                 /*Le nombre "piece" instéré dans la carte indique quelle couleur de
    23. bloc sera blittée"*/
    24.                 pos[i].x = -1;
    25.                 pos[i].y = -1;
    26.             /*Si le bloc ne peut plus tomber (puisqu'il est fixé dans la carte), on
    27. pourra piocher une nouvelle pièce la prochaine fois*/
    28.             forme = true;
    29.         }//Fin du "else"
    30.         break;
    31.     }//Fin du "switch"
    32. }//Fin de la fonction

    J'ai affiché les coordonnées du bloc avant de l'insérer dans la carte et voici ce que ça donne:

    Citation : Tétris

    8 29
    10 29
    11 29
    12 29


    (Coordonnées X puis Y)
    --> Dans le cas où seul 1 barre horizontale est tombée!!!

    Et voici ce que contient la variable "carte" AVANT LA FIN DE LA FONCTION:

    Citation : Tétris

    ...début de la carte....
    carte[8][29] = 1
    ...
    carte[9][9] = 1
    ...
    carte[9][29] = 1
    ...
    carte[10][9] = 1
    ...
    carte[10][29] = 1
    ...
    carte[11][9] = 1
    ...
    carte[11][29] = 1
    ...
    carte[12][9] = 1
    ...Suite de la carte...


    (Les lignes en rouge sont les intrus).

    J'ai essayé de toutes les manière possible mais le bloc intrus est toujours là. Je commence à être désespéré! :colere::'(

    Quelqu'un voit-il le bug?

    Merci d'avance à tous ceux qui pourront m'aider! :)
    • Partager sur Facebook
    • Partager sur Twitter
    Un traitement de texte léger, rapide et fiable : DadaWord (ou sur GitHub)

    Blocs parasite

    × 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