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 :

Problème sur le tutorial mouvement du sprite


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 15
    Par défaut Problème sur le tutorial mouvement du sprite
    Bonjour,

    J'ai suivi le tutorial de loka sur SDL, et j'ai un gros problème sur le chapitre X sur le mouvement du sprite, en gros j'ai recodé à ma sauce (c'est à dire en séparant les classes avec un header et un autre fichier cpp), mais tout en respectant le code de l'auteur.

    Et malgré cela le sprite ne bouge pas lorsque je reste appuyé sur une touche du clavier, en gros l'évenement ne se déclanche que lorsque j'appuie sur la touche, coup par coup.

    Je ne comprends absolument pas d'où cela vien car j'ai réutilisé globalement le même code.

    Mais je dois avouer que je n'ai pas réussi à comprendre comment ça marche le sprite qui avance lorsque l'on reste appuyé sans utiliser SDL_EnableKeyRepeat.

    Svp si quelqu'un qui connais le tutorial pouvait m'aider ce serait simpa ...

    ps : Je ne sais pas comment poster les fichiers source de mon projet, ce qui devrait pouvoir vous aidez à m'aider. Il comporte deux cpp et un header.
    Si vous me demander et me dites comment le poster je le ferais bien entendu.

    Merci.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 127
    Billets dans le blog
    149
    Par défaut
    Pour montrer le code source il y a deux méthodes :

    Sois tu ouvre une balise [ C O D E ] [ / C O D E ] ( sans les espaces ) ( bouton # en haut lorsque tu post ). Soit tu ajoute des fichiers joints grace à l'option en dessous de la zone pour poster.

    je pense que ton problème vient de la fonction "handle_input()"
    Si tu veux que l'on jette un coup d'oeil dessus utilise les balises [ C O D E ] et copie ton code qui gère l'appuie des touches entre les balises.
    Je pense que tu as fait une petite erreur lors de la recopie. Un truc idiot que l'on ne voit pas tout de suite ( comme beaucoup d'erreur )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 15
    Par défaut
    Ok je pense aussi que le problème venais de cette fonction mais je l'ai verifié pas mal de fois. Le problème c'est que je comprends vraiment pas en quoi cette fonction remplace un SDL_EnableKeyRepeat ... j'arrive pas à la comprendre, enfin bref je te poste la fonction :

    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
     void Point::handle_input(SDL_Event event, SDL_Surface* affichePoint,SDL_Surface* screen)
    {
     
     
        if( event.type == SDL_KEYDOWN )
        {
            //ajustement de la vitesse
            switch( event.key.keysym.sym )
            {
                case SDLK_UP: yVel -= POINT_HEIGHT / 2; break;
                case SDLK_DOWN: yVel += POINT_HEIGHT / 2; break;
                case SDLK_LEFT: xVel -= POINT_WIDTH / 2; break;
                case SDLK_RIGHT: xVel += POINT_WIDTH / 2; break;
                default: break;
            }
        }
        //Si une touche a ete relachee
        else if( event.type == SDL_KEYUP )
        {
            //ajustement de la vitesse
            switch( event.key.keysym.sym )
            {
                case SDLK_UP: yVel += POINT_HEIGHT / 2; break;
                case SDLK_DOWN: yVel -= POINT_HEIGHT / 2; break;
                case SDLK_LEFT: xVel += POINT_WIDTH / 2; break;
                case SDLK_RIGHT: xVel -= POINT_WIDTH / 2; break;
                default: break;
            }
        }
        show(affichePoint, screen);
    }
     
     
     
    void Point::show(SDL_Surface* source, SDL_Surface* destination)
    {
        SDL_Rect offset;
        //Bouge le point à gauche ou à droite
        x += xVel;
     
        //Si le point se rapproche trop des limites(gauche ou droite) de l'ecran
        if( ( x < 0 ) || ( x + POINT_WIDTH > SCREEN_WIDTH ) )
        {
            //On revient
            x -= xVel;
        }
     
        //Bouge le point en haut ou en bas
        y += yVel;
     
        //Si le point se rapproche trop des limites(haute ou basse) de l'ecran
        if( ( y < 0 ) || ( y + POINT_HEIGHT > SCREEN_HEIGHT ) )
        {
            //On revient
            y -= yVel;
        }
     
     
     
        offset.x = x;
        offset.y = y;
     
        //On blitte la surface
        SDL_BlitSurface( source, NULL, destination, &offset );
        SDL_Flip(destination);
    }
    Comme tu peux le voir, la différence avec le code de loka, c'est que j'envoie l'image du point et de l'ecran dans la fonction "handle_input()" , et à la fin de celle-ci je lance directement la fonction show (sans repasser par le main).
    Petite autre différence : à la fin de la fonction show je n'apel pas de fonction "apply surface", je blit et flip directement mon ecran.

    Bon je pense pas que ces modifications soient la cause du problème puisque le programme marche, je ne peux juste pas bouger le point en restant appuyé sur une touche.

    Merci de ton aide en tout cas.

  4. #4
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Bonjour,

    Est-il possible de voir ta boucle de jeu principale.

    Je te conseille aussi de récupérer les sources disponibles sur le tuto et d'essayer de meiux comprendre comment ça marche avant de tout réécrire, change juste quelques points au début.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 15
    Par défaut
    Bonjour loka et merci de ta réponse.

    J'ai effectivement fais d'abord le tutorial en me servant des sources pour comprendre pas à pas, puis je l'ai refais mais en codant à ma sauce (mais en reprenant tout de même tes fonctions).
    Le gros du changement par rapport à ton programme c'est que je sépare le main, des class et des fonctions à l'aide d'un nouveau .cpp et d'un .h

    Enfin bref voici le code de mon main :

    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
     int main(int argc, char *argv[])
    {
        int continuer =1;
        Point monPoint;
     
        SDL_Event event2;
        SDL_Surface *affichePoint = NULL;
        SDL_Surface *screen = NULL;
     
        SDL_Init(SDL_INIT_EVERYTHING);
        screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
        SDL_WM_SetCaption( "Bouge le point", NULL );
     
        affichePoint = SDL_LoadBMP( "dot.bmp" );
     
     
        while (continuer)
        {
            while( SDL_PollEvent( &event2 ) )
            {
                SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 255, 255, 255 ) );
                monPoint.handle_input(event2,affichePoint, screen);
                //On remplit l'ecran de blanc
     
                //On affiche le point sur l'ecran
                //monPoint.show(affichePoint, screen);
                if( event2.type == SDL_QUIT )
                {
                    //On quitte the programme
                    continuer = 0;
                }
     
            }
     
        }
        //Libèration des surfaces
        SDL_FreeSurface( affichePoint );
        //On quitte SDL
        SDL_Quit();
     
    return EXIT_SUCCESS;
    }

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

Discussions similaires

  1. problème sur les sprites
    Par patlebigboss dans le forum Java ME
    Réponses: 1
    Dernier message: 23/09/2008, 21h09
  2. Probléme rencontré sur un tutorial 3DTools
    Par Rifton007 dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 12/01/2008, 14h39
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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