IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Deplacer un personnage (derniere touche trouvée)


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut Deplacer un personnage (derniere touche trouvée)
    Bonjour à tous mon problème est simple, j'ai suivi le tutorial de loka sur les mouvements, et j'adapte cela dans mon jeu. Néanmoins j'ai des problèmes lors du déplacement :

    - J'aimerai que lorsque que le joueur maintient par exemple la touche gauche et puis appuie sur la touche droite (tout en tenant la touche gauche), le joueur tourne à droite. En gros que ce soit la dernière touche qui entre en compte au niveau de gauche et droite

    En gros, dans l'état actuel des choses, le joueur va bien à gauche et à droite, mais plusieurs fois si on a pas un bon timing l'animation se fige, et le personnage s'arrête d'un coup. De plus lorsque que l'on presse les deux touches, l'animation se joue mais le joueur n'avance pas (je pense que c'est parce que le booléen marche = true mais que les vitesse s'annulent donc pas d'avancement....mais une animation)

    C'est assez casse-tête et je m'en remets à vous si vous avez une solution...

    voici un peu de mon code :


    La gestion des évenements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    void Hero::Events(SDL_Event event)
    { 
     
      //Si une touche est préssée
        if( event.type == SDL_KEYDOWN )
        {
            //Mise à jour
                if (event.key.keysym.sym == SDLK_RIGHT) //droite
    			{
     
    				marche = true;
    				frameBegin = 2;
    				frameCourante = frameBegin;
    				frameLimitEtat = frameBegin + 7;
    				vitesseX += 10;
    			}	
    			else if (event.key.keysym.sym == SDLK_LEFT) // gauche
    			{
    				marche = true;
    				frameBegin = 9;
    				frameCourante = frameBegin;
    				frameLimitEtat = frameBegin + 7;
    				vitesseX -= 10;
    			}	
     
     
        }
     
    	//Si une touche est relachée
       else if( event.type == SDL_KEYUP )
        {
                if (event.key.keysym.sym == SDLK_RIGHT) //droite
    			{
    				marche = false;
    				frameCourante = 0;
    				vitesseX -= 10;
    			}
              if (event.key.keysym.sym == SDLK_LEFT) //gauche
    			{
    				marche = false;
    				frameCourante = 1;
    				vitesseX += 10;
    			}
     
        }
     
     
    }
    La gestion de la vitesse et l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    void Hero::ApplyForces(SDL_Surface *ecran)
    {
     
    	//Bouge le point à gauche ou à droite
        posx += vitesseX;
     
        //Si le point se rapproche trop des limites(gauche ou droite) de l'ecran
        if( ( posx+10 < 0 ) || ( posx-10 > LWINDOW ) )
        {
            //On revient
            posx -= vitesseX;
        }
     
     
    	posHeros.x = posx;
    	posCurseur.x = posHeros.x;
     
    	Draw(ecran);
    }	
     
    void Hero::Draw(SDL_Surface *ecran)
    {
     
     
    	frameDecompose += tempsAnim;  
     
      if(marche == true)
      {
     
      if(frameCourante < frameLimitEtat-1)
      {
     
    	if (frameDecompose > 1 )
    	{
    		frameCourante++;
    		frameDecompose = 0;
    	} 
      }
     else
    	{
    		frameCourante = frameBegin;
    		frameDecompose = 0;
    	}	
     
    }
     
    	SDL_BlitSurface(spriteHeros[frameCourante], 0, ecran, &posHeros);
    	SDL_BlitSurface(curseur, 0, ecran, &posCurseur);
    }
    Voilà n'hésitez surtout pas à répondre, c'est assez urgent ^^
    Merci d'avance pour vos réponses constructives !

  2. #2
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    J'ai regardé vite fait ton code et voila ce que je te conseille.
    Au lieu de faire que tes entrées claviers influent directement sur les états de ton objet, assigne lui des actions, pour cela tu dois définir les types d'action que ton objet peut effectuer, par exemple fais un type énuméré :
    enum ACTION
    {
    AVANCER = 1,
    RECULER
    GAUCHE
    DROITE
    MAX_ACTION
    }
    Après tu créer un tableau de booleen pouvant contenir tes actions.
    Ainsi quand tu gère tes entrées clavier tu fais (c'est de l'algo là pas du C) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if keydown(UP_ARROW)
      mesactions[AVANCER] = true;
    else if keyup(UP_ARROW)
      mesactions[AVANCER] = false;
    pareil pour les autres actions ...

    Après dans ton code qui traite les animations tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(mesactions[AVANCER] && !mesactions[RECULER])
      vitesseY += 10;
    pareil pour les autres actions ...

    Et pour finir tu met à jour la position en fonction de ta vitesse.
    Ce système rendra ton code bien plus clair et tu pourra plus facilement gérer les erreurs

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Sinon tu prends un enum (comme dans le post ci-dessus) pour indiquer la direction dans laquelle se déplacer, quand une touche est appuyée tu fais le changement et quand une touche est relâchée tu vérifies qu'elle va bien dans la même direction que le personnage avant de faire monAction = AucuneAction.

Discussions similaires

  1. Réponses: 10
    Dernier message: 07/10/2014, 15h16
  2. [Débutant] Gestion du deplacement de personnage sur une map définie
    Par donocast dans le forum C#
    Réponses: 3
    Dernier message: 16/02/2012, 11h06
  3. Trouve l'identifiant unique du dernier enregistrement créé.
    Par Poussy-Puce dans le forum Requêtes
    Réponses: 4
    Dernier message: 12/01/2006, 14h46
  4. Réponses: 3
    Dernier message: 24/01/2005, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo