Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Snake] Mouvement du corps

Bugs

Sujet résolu
    13 novembre 2007 à 12:21:47

    Bonjour

    J'ai quelques problèmes pour faire bouger le corps de mon snake.
    Au début, il regarde vers le bas et avance normalement:
    Image utilisateur

    Si je veux le faire aller à gauche, voici ce qui se passe:
    Image utilisateur
    (La croix représente la position où la tête se trouvait, avant que je n'essaie de
    le faire tourner)

    Après l'avoir fait tourner à gauche, la tête se décale donc et le snake reste
    IMMOBILISE dans cette position.

    Pour le débloquer, j'essaie de le faire redescendre et voici ce qui se passe:
    Image utilisateur

    ---
    Voici le code que j'utilise:
    1. case BAS:
    2.                 tete_now = tete_snake[BAS];
    3.                 if(carte[(pos_tete.y)+1][pos_tete.x] == BLOC){
    4.                     continuer = false;
    5.                     cout<<"mur"<<endl;
    6.                 }
    7.                 if(carte[(pos_tete.y)+1][pos_tete.x] == POMME){
    8.                     longueur_snake++;
    9.                     //FSOUND_PlaySound(FSOUND_FREE, croque);
    10.                     cout<<"pomme"<<endl;
    11.                 }
    12.                 for(int m = 0; m < longueur_snake; m++){
    13.                     if((pos_tete.y+1) == pos_snake[m].y){
    14.                         continuer = false;
    15.                         cout<<"queu"<<endl;
    16.                     }
    17.                 }
    18.                 //Si tout est OK, on continue
    19.                 pos_tete.y++;
    20.                 for(int mu = longueur_snake; mu > 0; mu--){
    21.                     pos_snake[mu].y = pos_snake[mu--].y;
    22.                     pos_snake[mu].x = pos_snake[mu--].x;
    23.                 }
    24.                 for(int alpha = longueur_snake; alpha > 0; alpha--){
    25.                     pos_snake[alpha].y++;
    26.                 }
    27.                 break;
    28.                 //Si le snake va à gauche
    29.                 case GAUCHE:
    30.                 tete_now = tete_snake[GAUCHE];
    31.                 if(carte[pos_tete.y][(pos_tete.x) - 1] == BLOC){
    32.                     continuer = false;
    33.                 }
    34.                 if(carte[pos_tete.y][(pos_tete.x) - 1] == POMME){
    35.                     longueur_snake++;
    36.                     //FSOUND_PlaySound(FSOUND_FREE, croque);
    37.                 }
    38.                 //Si tout est OK, on continue
    39.                 for(int beta = longueur_snake;beta > 0; beta--){
    40.                     pos_snake[beta].y = pos_snake[beta--].y;
    41.                     pos_snake[beta].x = pos_snake[beta--].x;
    42.                 }
    43.                 pos_tete.x = pos_snake[1].x;
    44.                 pos_tete.y = pos_snake[1].y;
    45.                 pos_tete.x--;
    46.                 break;

    (La gestion des collisions n'est pas complète [pas encore eu le temps :-° ])

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
    Un traitement de texte léger, rapide et fiable : DadaWord (ou sur GitHub)
      13 novembre 2007 à 13:35:35

      Désolé, c'est du c++, je ne peut donc pas t'aider. Poste ce sujet dans le forum C++. Aussi, montre ton code pour le "case GAUCHE:" pour pouvoir comparer.
      • Partager sur Facebook
      • Partager sur Twitter
        13 novembre 2007 à 13:51:25

        Hum, tu fais la chose suivante :

        - dabord je teste si par exemple pos_snake.y - 1 == POMME alors le serpent s'agrandi .
        moi pour un jeu de snake je verrais plus la chose comme ça :

        - on bouge et ensuite on regarde :
        • POMME : snake s'agrandi
        • RIEN A SIGNALER : on continue


        evidement il y a aussi pleins d'autre chose a prendre en compte par exemple la queue du serpent et le mur.

        De cette façons tu es sure que le serpent ne fera pas de "marche arrière" comme il fait là.

        Aussi je suppose que ton switch est dans la boucle principale je me trompe ?
        Si oui tu devrais faire une class Deplacement :

        1. class Deplacement
        2. {
        3. private:
        4.     SDL_Rect serpent;
        5.     /* et toutes les autres variable dont tu as besoin ... */
        6. public:
        7.     short Gauche ( void ) /* eventuelement des paramètres dont tu as besoin mais avec les variables en private sa devrait suffir */
        8.     {
        9.         /* ton code pour aller a gauche */
        10.     }
        11. };


        Et comme tu fais du C++ je t'invite a choisire SFML comme lib graphique.
        • Partager sur Facebook
        • Partager sur Twitter
          13 novembre 2007 à 14:00:09

          En gros, si je comprends bien, tu fais bouger, a chaque "pas", chacun des maillons du serpent.

          Il y a une optimisation pour moins se casser la tete :
          Les maillons représentent une liste.
          Quand tu avances d'un pas, tu places un nouveau maillon devant, et tu retires le dernier maillon.

          Ainsi, tu ne touches pas aux maillons intermédiaires. Si tu regardes, si un téléphone mobile, un jeu de snake, a chaque coup, il y a juste +1 devant, et -1 derriere, le milieu ne bouge pas.

          Astuce astuce !!
          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            13 novembre 2007 à 15:33:03

            Citation : Fvirtman

            Il y a une optimisation pour moins se casser la tete :
            Les maillons représentent une liste.
            Quand tu avances d'un pas, tu places un nouveau maillon devant, et tu retires le dernier maillon.


            J'ai lu le tuto sur les listes chainées mais j'ai pas très bien compris comment ça fonctionnait.
            De plus, comment créer un liste chainée de SDL_Rect?
            • Partager sur Facebook
            • Partager sur Twitter
            Un traitement de texte léger, rapide et fiable : DadaWord (ou sur GitHub)
              13 novembre 2007 à 15:49:12

              Tu peux créer une liste chainée de n'importe quoi.
              mais au pire, tu meme te débrouiller avec un tableau.
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                13 novembre 2007 à 17:03:17

                Sujet déplacé dans le forum C++
                • Partager sur Facebook
                • Partager sur Twitter
                  13 novembre 2007 à 17:06:29

                  Ah ben tiens ! Si ça devient du C++, jette un oeil sur std::list
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                    13 novembre 2007 à 17:58:43

                    tous les conteneurs de la librairie STL pourront t'aider dans ton cas( d'ailleurs grâce a cette lib la manip des liste chainées est quelque peu simplifiée ^^ )
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Snake] Mouvement du corps

                    × 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