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 :

Déplacement de personnage


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Déplacement de personnage
    main.cpp

    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
    #include <cstdlib>
    #include <iostream>
    #include <SDL/SDL.h>
    #include "Personnage.h"
    #include "clavier.h"
     
    using namespace std;
     
    int main ( int argc, char** argv )
    {
          if ( SDL_Init(SDL_INIT_VIDEO)<0)
          {
              cout<<"Erreur initialisation!"<<endl;
              return -1;
          }
        SDL_Surface *ecran;
        ecran=SDL_SetVideoMode(800,600,32,SDL_SWSURFACE);
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,152,152,255));
        SDL_Flip(ecran);
        bool continuer=true;
        SDL_Event evenement;
     
        Personnage *joueur1= new Personnage;
        joueur1->nom("ouss59");
        while (continuer)
        {
     
            test_clavier(continuer,joueur1);
     
     
     
            joueur1->personnageBlit();
     
            if (joueur1->position().y>600)
            {
                delete joueur1;
            }
        }
     
     
     
     
        return 0;
    }
    Personnage.cpp
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    #include <iostream>
    #include <string>
    #include <SDL/SDL.h>
    #include "Personnage.h"
     
    using namespace std;
     
     
    Personnage::Personnage()
    {
        m_vie=100;
        m_armure=0;
        m_perso=SDL_LoadBMP("image/Joueur/joueur_Droite_1.bmp");
        m_positionPersonnage.x=0;
        m_positionPersonnage.y=0;
     
    }
    Personnage::~Personnage()
    {
      SDL_FreeSurface(m_perso);
    }
     
    void Personnage::nom(std::string nomPersonnage )
    {
        m_nomPersonnage=nomPersonnage;
     
    }
     
    void Personnage::frapper(string frappe)
    {
       if (frappe=="haut")
       {
           m_perso=SDL_LoadBMP("image/Joueur/joueur_Haut_frappe.bmp");
           personnageBlit();
           SDL_Delay(100);
           m_perso=SDL_LoadBMP("image/Joueur/joueur_Haut_1.bmp");
       }
       else if (frappe=="bas")
       {
           m_perso=SDL_LoadBMP("image/Joueur/joueur_Bas_frappe.bmp");
           personnageBlit();
           SDL_Delay(100);
           m_perso=SDL_LoadBMP("image/Joueur/joueur_Bas_1.bmp");
       }
       else if (frappe=="gauche")
       {
           m_perso=SDL_LoadBMP("image/Joueur/joueur_Gauche_frappe.bmp");
           personnageBlit();
           SDL_Delay(100);
           m_perso=SDL_LoadBMP("image/Joueur/joueur_Gauche_1.bmp");
       }
       else if (frappe=="droite")
       {
           m_perso=SDL_LoadBMP("image/Joueur/joueur_Droite_frappe.bmp");
           personnageBlit();
           SDL_Delay(100);
           m_perso=SDL_LoadBMP("image/Joueur/joueur_Droite_1.bmp");
       }
    }
    void Personnage::deplacer(string direction)
    {
        if(direction=="droite")
        {
            m_perso=SDL_LoadBMP("image/Joueur/joueur_Droite_1.bmp");
            m_positionPersonnage.x+=15;
            m_direction=direction;
     
        }
        else if(direction=="gauche")
        {
            m_perso=SDL_LoadBMP("image/Joueur/joueur_Gauche_1.bmp");
            m_positionPersonnage.x-=15;
            m_direction=direction;
        }
        else if(direction=="bas")
        {
            m_perso=SDL_LoadBMP("image/Joueur/joueur_Bas_1.bmp");
            m_positionPersonnage.y+=15;
            m_direction=direction;
        }
        else if(direction=="haut")
        {
            m_perso=SDL_LoadBMP("image/Joueur/joueur_Haut_1.bmp");
            m_positionPersonnage.y-=15;
            m_direction=direction;
        }
     
    }
    void Personnage::personnageBlit()
    {
        SDL_FillRect(SDL_GetVideoSurface(),NULL,SDL_MapRGB(SDL_GetVideoSurface()->format,152,152,255));
        SDL_SetColorKey(m_perso,SDL_SRCCOLORKEY,SDL_MapRGB(m_perso->format,0,0,0));
        SDL_BlitSurface(m_perso,NULL,SDL_GetVideoSurface(),&m_positionPersonnage);
        SDL_Flip(SDL_GetVideoSurface());
     
     
    }
    SDL_Rect Personnage::position()
    {
     
        return m_positionPersonnage;
    }
     
    string Personnage::direction_actuelle()
    {
       return m_direction;
    }
    Personnage.h

    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
    #ifndef PERSONNAGE_H_INCLUDED
    #define PERSONNAGE_H_INCLUDED
    #include <string>
    #include <SDL/SDL.h>
    class Personnage
    {
    public:
        Personnage();
        ~Personnage();
        void nom(std::string nomPersonnage );
        void frapper(std::string frappe);
        void deplacer(std::string direction);
        void personnageBlit();
        SDL_Rect position();
        std::string direction_actuelle();
    private:
     
     int m_vie,m_armure,m_degat;
     std::string m_nomPersonnage, m_direction;
     SDL_Surface *m_perso;
     SDL_Rect m_positionPersonnage;
     
     
     
    };
     
    #endif // PERSONNAGE_H_INCLUDED
    clavier.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef CLAVIER_H_INCLUDED
    #define CLAVIER_H_INCLUDED
    #include <string>
    #include <SDL/SDL.h>
    #include "Personnage.h"
     
    void test_clavier (bool &continuer,Personnage *perso);
     
     
    #endif // CLAVIER_H_INCLUDED
    clavier.cpp

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <SDL/SDL.h>
    #include "clavier.h"
    #include "Personnage.h"
    using namespace std;
     
     
    void test_clavier (bool &continuer,Personnage *perso)
    {
     
        SDL_Event evenement;
        SDL_PollEvent(&evenement);
     
     
        if(evenement.type==SDL_QUIT)
        {
            continuer=false;
        }
     
        if (evenement.type==SDL_KEYDOWN)
        {
            if (evenement.key.keysym.sym==SDLK_LEFT)
            {
                perso->deplacer("gauche");
            }
            else if (evenement.key.keysym.sym==SDLK_RIGHT)
            {
                perso->deplacer("droite");
            }
            else if (evenement.key.keysym.sym==SDLK_DOWN)
            {
                perso->deplacer("bas");
            }
            else if (evenement.key.keysym.sym==SDLK_UP)
            {
                perso->deplacer("haut");
            }
     
            else if (evenement.key.keysym.sym==SDLK_f)
            {
                if (perso->direction_actuelle()=="gauche")
                {
                    perso->frapper("gauche");
                }
                else if (perso->direction_actuelle()=="droite")
                {
                    perso->frapper("droite");
                }
                else if (perso->direction_actuelle()=="haut")
                {
                    perso->frapper("haut");
                }
                else if (perso->direction_actuelle()=="bas")
                {
                    perso->frapper("bas");
                }
            }
     
     
        }
    probleme

    bonjour/bonsoir

    J'ai un problème avec les déplacements du personnage , quand je le deplace vert une direction , il faut appuyer plusieurs fois sur la touche pour qu'il avance de 15px a chaque fois ,
    alors que dans clavier.cpp j'ai fait SDL_PollEvent() et non pas SDL_WaitEvent().


    aidez moi , merci d'avance

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Regarde du côté de SDL_EnableKeyRepeat (vu que tu as l'air d'utiliser la SDL 1.2 d'après ma boule de cristal )
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    en fait sa fonctionnait nickel , juste avant que je rajoute ça dans clavier.h:
    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
     if (evenement.key.keysym.sym==SDLK_f)
     {
        if (perso->direction_actuelle()=="gauche")
        {
         perso->frapper("gauche");
        }
        else if (perso->direction_actuelle()=="droite")
        {
         perso->frapper("droite");
        }
        else if (perso->direction_actuelle()=="haut")
        {
         perso->frapper("haut");
        }
        else if (perso->direction_actuelle()=="bas")
        {
         perso->frapper("bas");
        }
     }
    et depuis ça ne fonctionne plus , mais dès lors que j'enlève ce bout de code ça refonctionne :s

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par rachidboulou Voir le message
    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
    51
    52
    53
    void test_clavier (bool &continuer,Personnage *perso)
    {
     
        SDL_Event evenement;
        SDL_PollEvent(&evenement);
     
     
        if(evenement.type==SDL_QUIT)
        {
            continuer=false;
        }
     
        if (evenement.type==SDL_KEYDOWN)
        {
            if (evenement.key.keysym.sym==SDLK_LEFT)
            {
                perso->deplacer("gauche");
            }
            else if (evenement.key.keysym.sym==SDLK_RIGHT)
            {
                perso->deplacer("droite");
            }
            else if (evenement.key.keysym.sym==SDLK_DOWN)
            {
                perso->deplacer("bas");
            }
            else if (evenement.key.keysym.sym==SDLK_UP)
            {
                perso->deplacer("haut");
            }
     
            else if (evenement.key.keysym.sym==SDLK_f)
            {
                if (perso->direction_actuelle()=="gauche")
                {
                    perso->frapper("gauche");
                }
                else if (perso->direction_actuelle()=="droite")
                {
                    perso->frapper("droite");
                }
                else if (perso->direction_actuelle()=="haut")
                {
                    perso->frapper("haut");
                }
                else if (perso->direction_actuelle()=="bas")
                {
                    perso->frapper("bas");
                }
            }
     
     
        }
    Il faut que tu active le mouvement quand le joueur presse la touche et désactive le mouvement quand le joueur relache la touche
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    enum Direction {
    	None,
    	Left,
    	Right,
    	Top,
    	Bottom
    };
     
    void test_clavier(bool& continuer, Direction& direction, bool& hit, const SDL_Event& evt) {
    	if(evt.type==SDL_QUIT) {
    		continuer = false;
    		return;
    	}
     
    	if(evt.type == SDL_KEYDOWN) {
    		if (evt.key.keysym.sym==SDLK_LEFT) {
    			direction = Left;
    		}
    		else if (evt.key.keysym.sym==SDLK_RIGHT) {
    			direction = Right;
    		}
    		else if (evt.key.keysym.sym==SDLK_DOWN) {
    			direction = Bottom;
    		}
    		else if (evt.key.keysym.sym==SDLK_UP) {
    			direction = Top;
    		}
     
    		else if (evt.key.keysym.sym==SDLK_f) {
    			hit = true;
    		}
    	}
    	else if(evt.type == SDL_KEYUP) {
    		if (evt.key.keysym.sym==SDLK_LEFT ||
    			evt.key.keysym.sym==SDLK_RIGHT ||
    			evt.key.keysym.sym==SDLK_DOWN ||
    			evt.key.keysym.sym==SDLK_UP)
    		{
    			direction = None;
    		}
    	}
    }
     
    // main loop
    bool continuer = true;
    SDL_Event evt;
    Direction direction = None;
    bool hit;
     
    while(continuer) {
    	hit = false;
    	while(continuer && SDL_PollEvent(&evt)) {
    		test_clavier(continuer, direction, hit, evt);
    	}
    	if(continuer) {
    		switch(direction) {
    		case Left: perso->deplacer("gauche"); break;
    		case Right: perso->deplacer("droite"); break;
    		case Top: perso->deplacer("haut"); break;
    		case Bottom: perso->deplacer("bas"); break;
    		case None: 
    		default: break;
    		}
     
    		if(hit) {
    			perso->frapper(perso->direction_actuelle());
    		}
    	}
    }
    Il faut prendre en compte le temps écoulé depuis la dernière image pour déterminer si le joueur peut bouger (par exemple si le joueur ne peut faire qu'un déplacement par seconde) ou la distance qu'il va parcourir (en fonction de sa vitesse).

    Tu devrais aussi supprimer tous ces string et les remplacer par une enum.

    Il faudrait aussi revoir complètement la classe Personnage pour mettre de coté le code de dessin.

    edit: indentation

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    merci!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/11/2014, 18h04
  2. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Programmation multimédia/Jeux
    Réponses: 7
    Dernier message: 08/05/2013, 02h04
  3. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Général Python
    Réponses: 15
    Dernier message: 24/04/2013, 00h42
  4. Réponses: 6
    Dernier message: 14/09/2012, 10h18
  5. Déplacement de personnage coérent
    Par poussinphp dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 25/04/2007, 15h48

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