[C/C++] Gestions de collisions!

Le côté programmation du développement d'un jeu vidéo.

Gestions de collisions!

Messagepar maxou02 » 12 Mai 2008, 13:43

Salut a tous,
Dans mon jeux le perso se deplace pixel/pixel et ma carte et stoquer dans un tableau de cases.Les collisions sont a peu prés rempli mais pour le saut rien ne marche il passe tous le temps a travers le sol.
Code: Tout sélectionner
while (continuer)
    {
               SDL_PollEvent(&event);
        switch(event.type)
        {

                case SDL_KEYDOWN:
                        touche[event.key.keysym.sym]=1;
                break;

                case SDL_QUIT:
                continuer = 0;
                break;
                case SDL_KEYUP:
                        touche[event.key.keysym.sym]=0;
                break;
                    }

            if(touche[SDLK_ESCAPE]==1)
                continuer = 0;

            if((touche[SDLK_z]==1)&&(jumping == 0)&&(en_l_air < 2))
             {
                mario = marioH;
                jumping = 1;
                        en_l_air++;
                        vy = -SPEED;
                //positionJoueur.y-=2;
    }
            if(touche[SDLK_z]==0)
            jumping = 0;


            if((touche[SDLK_DOWN]==1)&& ( carte[((positionJoueur.x+16) / TAILLE_BLOC)][((positionJoueur.y+32) / TAILLE_BLOC)] != SOL)&&
             ( carte[((positionJoueur.x+16) / TAILLE_BLOC)][((positionJoueur.y+32) / TAILLE_BLOC)] != BLOCK)&&
             ( carte[((positionJoueur.x+16) / TAILLE_BLOC)][((positionJoueur.y+32) / TAILLE_BLOC)] != BLOCKB)&&
             ( carte[((positionJoueur.x+16) / TAILLE_BLOC)][((positionJoueur.y+32) / TAILLE_BLOC)] != BLOCKV))
              {
                mario = marioB;
                positionJoueur.y++;
    }
            if((touche[SDLK_RIGHT]==1)&& ( carte[((positionJoueur.x+25) / TAILLE_BLOC)][((positionJoueur.y +16) / TAILLE_BLOC)] != BLOCK)&&
            ( carte[((positionJoueur.x+25) / TAILLE_BLOC)][((positionJoueur.y +16) / TAILLE_BLOC)] != BLOCKB)&&
            ( carte[((positionJoueur.x+25) / TAILLE_BLOC)][((positionJoueur.y +16) / TAILLE_BLOC)] != BLOCKV))
                {
                mario = marioD;
                positionJoueur.x++;
    }
            if((touche[SDLK_LEFT]==1)&& ( carte[((positionJoueur.x) / TAILLE_BLOC)][((positionJoueur.y +16) / TAILLE_BLOC)] != BLOCK)&&
            ( carte[((positionJoueur.x) / TAILLE_BLOC)][((positionJoueur.y +16) / TAILLE_BLOC)] != BLOCKB)&&
            ( carte[((positionJoueur.x) / TAILLE_BLOC)][((positionJoueur.y +16) / TAILLE_BLOC)] != BLOCKV)&&(positionJoueur.x!=0))
             {
                mario = marioG;
                positionJoueur.x--;
             }

        current_time = SDL_GetTicks();
        ellapsed_time = current_time - last_time;
        last_time = current_time;
        if ((en_l_air)&&( carte[((positionJoueur.x) / TAILLE_BLOC)][((positionJoueur.y+32) / TAILLE_BLOC)] !=SOL))
        {
            vy += GRAVITY*ellapsed_time;

            if (vy > SPEED)
                vy = SPEED;

            positionJoueur.y += vy*ellapsed_time;

            if (positionJoueur.y > (600-32))
            {
                positionJoueur.y = 600-32;
                if (jumping)
                {
                    vy = -SPEED;
                    en_l_air = 1;
                }
                else
                    en_l_air = 0;
            }
        }

Si il le faut je mettrais plus de code.
Merci pour votre aide
Coordialement Maxou02
maxou02
Hello World, I'm new !
 
Messages: 7
Inscription: 13 Avr 2008, 22:03

Messagepar Benos » 12 Mai 2008, 19:49

Je me trompe peut être mais il n'y a rien qui met jumping à 0 à part appuyer sur la touche z

Code: Tout sélectionner
 if(touche[SDLK_z]==0)
            jumping = 0;


donc en_l_air ne reviens jamais à 0 et donc le perso continuerai à tomber.Il faut donc dans le test mettre aussi jumping à 0.
C'est compliqué les jeux de plate forme, mais il y a surement une meilleure façon de faire ça.
Benos
Hello World, I'm new !
 
Messages: 271
Inscription: 20 Oct 2005, 14:22

Messagepar maxou02 » 12 Mai 2008, 21:17

Petite precisions
Code: Tout sélectionner
if(touche[SDLK_z]==0)

La touche z est relacher donc jumping reviens a 0

Code: Tout sélectionner
if(touche[SDLK_z]==1)

La touche z est enfoncer donc jumping = 1
maxou02
Hello World, I'm new !
 
Messages: 7
Inscription: 13 Avr 2008, 22:03

Messagepar maxou02 » 26 Mai 2008, 19:59

up je suis vraiment coincer la :S
maxou02
Hello World, I'm new !
 
Messages: 7
Inscription: 13 Avr 2008, 22:03

Messagepar pwooulet » 27 Mai 2008, 20:11

Salut, dis-nous ce que le personnage est censé faire exactement(quand on appuie/relâche la touche z), ensuite, ce qu'il fait réellement (donc la version buguée). De plus, à quoi les variables sont initialisée la première fois avant d'arriver dans le bloc ?

Sinon, vérfirie (écriture de la position verticale dans stdout par exemple) que cette condition
if ( ( en_l_air != 0 )
&&( carte[(positionJoueur.x) / TAILLE_BLOC][((positionJoueur.y+32) / TAILLE_BLOC)] != SOL))

est bien vérifiée quand tu sautes.

mais pour le saut rien ne marche il passe tous le temps a travers le sol.

Expliques-toi, je regarde pas plus le code sans savoir ce qu'il ne va pas :00000023:
Avatar de l’utilisateur
pwooulet
Hello World, I'm new !
 
Messages: 45
Inscription: 03 Aoû 2007, 14:20
Localisation: Région Parisienne


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 16 invités

cron