Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Déplacement de surfaces

Lorsque l'une touche un mur, elle change de direction

Sujet résolu
    15 avril 2006 à 12:02:52

    Salut à tous
    Je me permet de faire un nouveau topic, puisque l'autre n'avait plus du tout le bon titre...
    Je suis en trai nde programmer un ptit jeu en SDL (genre Space Invaders) et il y'a des monstres (appelés petes). Ils sont censés bouger et lorsqu'ils rencontrent un mur, il doivent partir dans une autre direction, et ça ne marche pas, ils avancent quand même (mais ils ne dépassent pas les murs).
    Il y'en a 10.
    Ce code est placé dnas la boucle while(continuer), après tous les events

    // Position des petes
    for(y = 0; y < 10; y++)
                    {
                            // Direction du début des petes
                            if(debutPete == 1 && positionPete[y].x < 555 && positionPete[y].y < 713 && positionPete[y].y > 0 && positionPete[y].x > 0)
                            {
                                    positionPete[y].x+=3;
                                    positionPete[y].y+=3;
                            }
                           
                            // Si un pete touche le mur du haut
                            for(j = 0; j < 10; j++)
                            {
                                    if(positionPete[j].y <= 0)
                                    {
                                            positionPete[j].y+=3;
                                    }
                            }
                           
                            // Si un pete touche le mur de droite
                            for(j = 0; j < 10; j++)
                            {
                                    if(positionPete[j].x >= 555)
                                    {
                                            positionPete[j].x-=3;
                                    }
                            }
                           
                            // Si un pete touche le mur de gauche
                            for(j = 0; j < 10; j++)
                            {
                                    if(positionPete[j].x <= 0)
                                    {
                                            positionPete[j].x+=3;
                                    }
                            }
                           
                            // Si un pete touche le mur du bas
                            for(j = 0; j < 10; j++)
                            {
                                    if(positionPete[j].y >= 713)
                                    {
                                            positionPete[j].y-=3;
                                    }
                            }
                    }       

                    // On blitte les petes
                    for(y = 0; y < 10; y++)
                    {
                            SDL_BlitSurface(pete, NULL, ecran, &positionPete[y]);
                    }


    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      15 avril 2006 à 12:10:57

      tu utilise pas de variable "direction" ?

      moi j'fais comme ça :

      int direction ; avec 2 pour bas, 4 pour gauche, 8 pour haut, 6 pour droit... regarde ton pavé numérique et tu comprends lol

      après si il ya des angles de rebond précis, fais ça en degrés... et ensuite, suivant la direction, tu gère les positions x et y (x-- et y-- si position == 7 par exemple :) )
      • Partager sur Facebook
      • Partager sur Twitter
        15 avril 2006 à 12:23:23

        Pour quoi faire la variable direction ? Sinon, pour les angles de rebond, je verrais après, j'aimerais d'abord réussir un faire un rebond simple^^
        • Partager sur Facebook
        • Partager sur Twitter
          15 avril 2006 à 12:29:05

          Le truc, c'est que là, tu ne fais que le déplacer de trois pixels en arrière ou en avant. Mais tu ne changes pas sa direction. S'il allait vers le haut, tu le déplaces de 3 pixels vers le bas mais il ira toujours vers le haut... Il faudrait que tu fasses une variable pour gerer la direction en fait.

          par exemple:
          si ca tape en haut, direction vaut 1 et ensuite tu fera :
          position.y = position.y + vitesse*direction

          si ca tape en bas, direction vaut -1 et ensuite tu fera toujours :
          position.y = position.y + vitesse*direction

          comme ça t'es tranquille.
          • Partager sur Facebook
          • Partager sur Twitter
            15 avril 2006 à 12:33:05

            Ouais, mais je pige pas bien, tu pourrais me faire un ptit exemple ? Par exemple et gérant seulement les collisions en haut.
            Merci d'avance
            • Partager sur Facebook
            • Partager sur Twitter
              15 avril 2006 à 12:38:21

              TU fais

              SI Position.y < 0
              ALORS Directiony = 1

              Puis...

              Position.y += Directiony

              Puis tu blit avec le rectangle Position.
              • Partager sur Facebook
              • Partager sur Twitter
                15 avril 2006 à 12:39:43


                int direction_x=1; // au départ le monstre va à droite
                int direction_y=1; // et en bas

                [...]

                for(j = 0; j < 10; j++)
                {
                      if(positionPete[j].y <= 0)
                      {
                           direction_y=1;
                      }
                }

                [...]


                et avant de blitter tu calcule les positions :

                for(j = 0; j < 10; j++)
                {
                     positionPete[j].y = positionPete[j].y + direction_y * 10; // il avancera de 10pixels par frames
                }



                • Partager sur Facebook
                • Partager sur Twitter
                  15 avril 2006 à 12:43:20

                  Ouais ok j'ai pigé et j'pense que ça va marcher, merci !

                  Edit :
                  Mon code est le suivant
                  for(y = 0; y < 10; y++)
                                  {
                                          // Collision mur du haut
                                          if(positionPete[y].y <= 0)
                                          {
                                                  direction_y = 1;
                                          }

                                          // Collision mur de droite
                                          if(positionPete[y].x >= 555)
                                          {
                                                  direction_x = 0;
                                          }

                                          // Collision mur de gauche
                                          if(positionPete[y].x <= 0)
                                          {
                                                  direction_x = 1;
                                          }

                                          // Collision mur du bas
                                          if(positionPete[y].y >= 713)
                                          {
                                                  direction_y = 0;
                                          }
                                  }

                                  // On blitte les petes
                                  for(y = 0; y < 10; y++)
                                  {
                                          positionPete[y].x = positionPete[y].x + direction_x * 5;
                                          positionPete[y].y = positionPete[y].y + direction_y * 5;
                                          SDL_BlitSurface(pete, NULL, ecran, &positionPete[y]);
                                  }

                  (Avec évidemment les variables initialisées au début)
                  Mais les petes ne veulent pas partir dans la direction opposée... (ils s'arrêrent)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 avril 2006 à 13:27:00

                    Change les =0 par =-1, puis qu'apres le mouvement est négatif..
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [SDL] Déplacement de surfaces

                    × 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