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 :

Veut faire sauter un personnage mais y arrive pas^^


Sujet :

SDL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Veut faire sauter un personnage mais y arrive pas^^
    Salut ! Je débute avec la SDL (dur dur sans cours bien faits !) et j'ai tenté de faire un code ou on peut bouger un personnage. Ca j'y arrive mais c'est quand j'essaie maintenant de le faire sauter en appuyant sur la touche espace, j'ai tenté ca :

    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    // Le header de SDL
    #include <SDL.h>
    #include <math.h> 
    #define SECONDES *1000
    // Les surfaces
    SDL_Surface * sEcran;
    SDL_Surface * sImage;
    int currentTime = SDL_GetTicks(); 
       int nextUpdateTime = currentTime;
    void init()
    {
        // Initialisation
        SDL_Init(SDL_INIT_VIDEO);
        sEcran = SDL_SetVideoMode(800, 600, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
        SDL_ShowCursor(0);
     
        // Chargement de l'image
        sImage=SDL_LoadBMP("img.bmp");
    }
     
    void Quit()
    {
        SDL_FreeSurface(sImage);
        SDL_FreeSurface(sEcran);
        SDL_ShowCursor(1);
        SDL_Quit();
     
    bool exit(0);
    }
     
    int main(int argc, char *argv[])
    {
     
        init();
     
        SDL_Rect rect; // Source
        SDL_Rect dest; // Destination
        SDL_Rect rect2; // Source
        SDL_Rect dest2; // Destination
        SDL_Event event; // On en aura besoin plus tard
     
        rect.x=0;
        rect.y=0;
        rect.w=80;
        rect.h=80; // L'image fait 80x80
     
        dest.x=360;
        dest.y=260;
        dest.w=80;
        dest.h=80;
     
     
        // Boucle principale
        while(true)
        {
     SDL_FillRect(sEcran,NULL,0);
    Uint8 *keys;
    keys = SDL_GetKeyState(NULL);
     
                        if(keys[SDLK_UP])
            {
                             dest.y-=1;
                        if(dest.y<0)
                            dest.y=0;
     
            }
                    if(keys[SDLK_DOWN])
            {
                             dest.y+=1;
                        if(dest.y>519)
                            dest.y=519;
     
            }
                    if(keys[SDLK_RIGHT])
            {
                             dest.x+=1;
                        if(dest.x>719)
                            dest.x=719;
     
            }
                    if(keys[SDLK_LEFT])
            {
                             dest.x-=1;
                        if(dest.x<0)
                            dest.x=0;
     
            }
     
     
            // Tant qu'il y a des evennements
            while(SDL_PollEvent(&event))
            {
                // Si c'est un message SDL_QUIT
                if(event.type==SDL_QUIT)
                {
                    Quit();
                }
                else if(event.type==SDL_KEYDOWN)
                {
                    // Si c'est la touche Echap
                    if(event.key.keysym.sym==SDLK_ESCAPE)
                        Quit();
                         if(event.key.keysym.sym==SDLK_SPACE)
                         {                               
                        long posYinit = dest.y;
     
                        while((posYinit - dest.y) < 300)// Début de la boucle de saut
                        {
                         dest.y--;                
                         // On met a jour la "date" actuelle
                         currentTime = SDL_GetTicks();
                         if( currentTime > nextUpdateTime ) 
                         {
                         /* On fixe la date du prochain changement : une demi seconde après */
                         nextUpdateTime = currentTime + 500;
                         }
                                        }
                                                      }
                                                                   }
    }
     
            SDL_BlitSurface(sImage,&rect,sEcran,&dest);
            SDL_Flip(sEcran);
     
        }
     
        return 0;
     
    }
    Mais ca ne marche pas ! Le programme plante totalement.

    En plus de cela, j'avais essayé une fois de mettre une image de fond que je blit sur sEcran (le background initialisé au début) mais quand je blit une image sur ce même fond et que je la déplace au clavier je me retrouve avec une trainée de couleur.... j'ai essayé d'éffacer le fond comme je le faisait pour pas avoir la trainée sur la surface principale sEcran mais justement mon fond se voit plus une fois effacé et c'est pas ce que je veux !

    En clair je suis bien pommé dans la SDL quand même

  2. #2
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Je n'ai pas tout regarder le programme mais si tu parles de cette partie-là :
    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
    if(event.key.keysym.sym==SDLK_SPACE) 
    {                                
    	long posYinit = dest.y;
     
    	while((posYinit - dest.y) < 300)	// Début de la boucle de saut
    	{
    		dest.y--;
     
    		// On met a jour la "date" actuelle
    		currentTime = SDL_GetTicks();
     
    		if( currentTime > nextUpdateTime )
    		{
    			/* On fixe la date du prochain changement : une demi seconde après */
    			nextUpdateTime = currentTime + 500;
    		}
    	}
    }
    ce n'est pas ça qui devrait poser problème, même si le code ne doit pas faire tout à fait ce que tu veux. Qu'entends-tu par "plante totalement" ? Ici ton perso va monté de 300 pixels dés que tu pèse sur espace, sans te laisser faire d'autres actions (et il ne vas pas redescendre).

    La suite est fausse avec ton timer, essaie d'y réfléchir un peu : Tu mets à jour le temps si il est dépasser mais tu ne fais rien ! Il faudra mettre tous les dessins de ton code à l'intérieur de ce if si tu veux que ton timer serve à quelque chose.

    Sinon il y a des tutos sur SDL pas trop mal si tu recherches un peu et la doc est bien fournie.

    Voilà bonne chance

    PS : je pense que ton sujet aurait bien sa place dans le nouveau forum Développement 2D, 3D et Jeux

Discussions similaires

  1. Faire sauter un personnage
    Par bogoss91 dans le forum Développement 2D, 3D et Jeux
    Réponses: 11
    Dernier message: 03/08/2007, 17h04
  2. J'ai 3 fonctions mais j'arrive pas a en appeller une
    Par Ofeneim dans le forum VBA Access
    Réponses: 9
    Dernier message: 23/05/2007, 18h36
  3. Réponses: 22
    Dernier message: 18/05/2007, 18h46
  4. Réponses: 13
    Dernier message: 19/10/2006, 20h14
  5. aide comment faire sauter un personnage
    Par MAXIMIX dans le forum SDL
    Réponses: 3
    Dernier message: 24/05/2006, 10h05

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