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 :

Quelques problèmes dans les événements


Sujet :

SDL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 2
    Points
    2
    Par défaut Quelques problèmes dans les événements
    Bonjour,
    j'entame un projet fan game mégaman X et j'ai quelques problèmes dans mes événements.
    Le premier est que je voudrais afficher une autre image sur celle déja présente lorsque la souris passe dessus. J'ai essayé SDL_MOUSEMOTION avec les coordonnées de l'image pour que quand la souris passe dessus l'autre image se blitte, mais sans résultat.
    Mon deuxième problème concerne l'animation du personnage. J'aimerais que lorsque je relache la touche pour avancer (fleche droite ici), le personnage stop l'animation pour revenir au sprites de base.
    Voici le code source :

    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
    int main(int argc, char *argv[])
    {
    	SDL_Surface *ecran = NULL;
    	SDL_Surface* megaman[12];
    	SDL_Event event;
    	SDL_Rect positionMega;
    	int continuer = 1;
    	int i = 0;
     
    	SDL_Init(SDL_INIT_VIDEO);
     
    	ecran = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
     
    	SDL_WM_SetCaption("Megaman", NULL);
     
    	megaman[0] = SDL_LoadBMP("01.bmp");
    	megaman[1] = SDL_LoadBMP("02.bmp");
    	megaman[2] = SDL_LoadBMP("03.bmp");
    	megaman[3] = SDL_LoadBMP("04.bmp");
    	megaman[4] = SDL_LoadBMP("05.bmp");
    	megaman[5] = SDL_LoadBMP("06.bmp");
    	megaman[6] = SDL_LoadBMP("07.bmp");
    	megaman[7] = SDL_LoadBMP("08.bmp");
    	megaman[8] = SDL_LoadBMP("09.bmp");
    	megaman[9] = SDL_LoadBMP("10.bmp");
    	megaman[10] = SDL_LoadBMP("11.bmp");
    	megaman[11] = SDL_LoadBMP("12.bmp");
     
    	positionMega.x = 50;
    	positionMega.y = 400;
    	SDL_BlitSurface(megaman[0], NULL, ecran, &positionMega);
    	SDL_EnableKeyRepeat(13, 13);
     
     
    	while (continuer)
    	{
    		SDL_PollEvent(&event);
    		switch(event.type)
    			{
    			case SDL_KEYDOWN:
    				switch (event.key.keysym.sym)
    				{
    					case SDLK_ESCAPE:
    					continuer = 0;
    					break;
    					case SDLK_RIGHT:
    						for (i = 2 ; i < 12 ; i++)
    						{
    							SDL_BlitSurface(megaman[i], NULL, ecran, &positionMega);
    							SDL_Flip(ecran);
    							SDL_Delay(55);
    						}
    						break;
    				}
    				break;
    				case SDL_KEYUP:
    				switch (event.key.keysym.sym)
    				{
    				case SDLK_RIGHT:
    				SDL_BlitSurface(megaman[0], NULL, ecran, &positionMega);
    				SDL_Flip(ecran);
    				SDL_Delay(50);
    				break;
    				}
    		}
    		SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    		for (i = 0 ; i < 12 ; i++)
    		{
    			SDL_BlitSurface(megaman[0], NULL, ecran, &positionMega);
    		}
    		SDL_Flip(ecran);
    	}
    	for (i = 0 ; i <= 11 ; i++)
    	SDL_FreeSurface(megaman[i]);
     
    	SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    Le sprites de base est le 01.

    Merci d'avance,
    J.

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonjour,

    J'ai plein de remarque :

    Deja, utilise la balise [ C O D E ] [ / C O D E ] (sans les espaces) pour poster ton code. Cela permet de colorie et de mettre ne valeur ton code. Cette balise est situe au dessu de la ou tu ecrit, c'est le #

    Ensuite, INDENTE TON CODE, nom de dieu.
    Je ne sais pas si chez toi tu as programmer comme ca, mais c'est immonde.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            SDL_PollEvent(&event);
            switch(event.type)
            {
                    ....
            }
    On ne gere pas le PollEvent comme ceci. http://jeux.developpez.com/faq/sdl/?...EVENTS_comment

    Mais comme cela :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            while (SDL_PollEvent(&event))
                    switch(event.type)
                    {
                            ....
                    }
    Ensuite, il faut definir un taux de rafraichissement, sinon ton jeu tournera differemment selon les machine. Je t'invite a aller voir des tutoriel SDL pour de plus ample explication.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
            for (i = 0 ; i < 12 ; i++)
                SDL_BlitSurface(megaman[0], NULL, ecran, &positionMega);
     
            SDL_Flip(ecran);
    Cela revient a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
     
            SDL_BlitSurface(megaman[11], NULL, ecran, &positionMega);
     
            SDL_Flip(ecran);

    En effet, le blit des images va tellement etre rapide que seul la derniere sera afficher.



    Autre remarque : il y a trop de SDL_Flip, normalement, un seul suffit.


    Voici comment doit se presenter ton programme :

    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
     
     
    int main( int argc, char** argv )
    {
        SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
     
        /* Initialisation de toutes les variables */
     
        int continuer = 1;
        while (continuer)
        {
            /* On recupere les controle (clavier, souris ... ) */
            SDL_Event event;
            SDL_PollEvent(&event);
            switch(event.type)
            {
                  /* Le code ... */
     
            }
     
            if (tempsActuel - tempsPrecedent > 1000/FPS)
            {
                 /* Ici, on gere tout ce qui concerne l'affichage */
     
                 /* Un seul et unique SDL_Flip */
                 SDL_Flip(ecran);
                 tempsPrecedent = tempsActuel;
            }
     
     
        }
     
        for (i = 0 ; i <= 11 ; i++)
            SDL_FreeSurface(megaman[i]);
     
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }

    Bref, il me semble qu'il te manque enormement de notions pour te lancer dans un jeu, meme simplissime. Je te conseil les tuto du site pour une rapide prise en main et ensuite les tutos de loka sur developpez qui vont reellement te faire progresser.

    Si tu veux tout de meme une correction de ton code malgrès le fait que celui-ci soit (pour moi) a refaire (il y a beaucoup trop d'erreurs), je peux toujours te poster un exemple. Le mieux et que tu reflechisse par toi meme a la maniere de gerer le deplacement.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Merci pour ces remarques.

    J'ai suivit les cours du site sur la SDL et le pollevent était géré ainsi..
    Juste une chose que je ne comprend pas c'est pourquoi ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      if (tempsActuel - tempsPrecedent > 1000/FPS)
            {
                 /* Ici, on gere tout ce qui concerne l'affichage */
     
                 /* Un seul et unique SDL_Flip */
                 SDL_Flip(ecran);
                 tempsPrecedent = tempsActuel;
            }
    Faire une animation ne résulte pas seulement de la vitesse d'enchainement des sprites avec SDL_Delay ? étant donné que mon animation se trouve dans SDLK_RIGHT.

    En tout cas, je vais tout faire pour m'améliorer.

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Oui, c'est exact. Cependant, cette maniere de faire et inexacte. A chaque tour de boucle tu recupere 0 ou plusieurs evenement via PollEvent et tu n'en traite qu'un. Par consequent, si tu bouge continuellement la souris (ou autre), il va y avoir une sorte de decalage entre le moment ou l'evenement est generer et la moment ou il est traiter


    Pour l'animation des sprite, tu peux t'inspirer des tutos de loka (encore et toujours, ceux-ci etant une bonne reference) ou allez faire un tour avec google (http://www.gnurou.org/writing/linuxmag/sdl/partie3)

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je ne comprends pas pourquoi tu dis ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [QUOTE=SofEvans;4578129]
            while (SDL_PollEvent(&event))
                    switch(event.type)
                    {
                            ....
                    }
    mais ensuite tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
            SDL_Event event;
            SDL_PollEvent(&event);
            switch(event.type)
            {
                  /* Le code ... */
     
            }
       ...
    La première solution étant la bonne ;-)

    Jc

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    En realité, lorsque j'ai v le code, je l'ai juste indenter et j'ai repertorier les remarque a faire.

    Je prenais le morceau de code en defaut et je montrais une meilleur facon de faire. C'est pour ca que l'erreur du PollEvent se retrouve dans une citation d'une autre remarque ....

Discussions similaires

  1. probléme dans les foreign key
    Par infomari dans le forum Langage SQL
    Réponses: 1
    Dernier message: 01/07/2007, 15h44
  2. [SWING] Mise a jour de l'interface dans les événements
    Par woods dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 23/11/2005, 15h46
  3. [wxpython] problème avec les événements souris
    Par kalimero dans le forum wxPython
    Réponses: 2
    Dernier message: 13/11/2005, 15h42
  4. Requête SELECT problème dans les résultats trouvés ...
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/10/2005, 12h46
  5. [HVMenu] problème dans les pages ASPX (urgent svp)
    Par hatembr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/01/2005, 09h37

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