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 :

Animation de sprites


Sujet :

SDL

  1. #21
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    L'objet c'est le personnage, les balles, les ennemis : tout ce qui doit bouger à l'écran indépendamment du reste.
    Mindiell
    "Souvent, femme barrit" - Elephant man

  2. #22
    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
    Je ne devrais pas plutot utiliser une while pour la gestion des objet ? Car le for est utilisé principalement pour le défilement dans un tableau, alors qu'avec un while, après chaque mise à jour d'une animation, la variable qui est utilisé pour la boucle devient une autre valeur pour en sortir, et ensuite passer à l'affichage de chaque objet.

    (Désolé pour ces multiples questions mais j'ai un peu du mal à m'y retrouver )

  3. #23
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    le while est une boucle dont la sortie est liée à une condition qui "bouge" pendant la boucle. Le for est une boucle qui marche n fois.

    Dans ton cas tu as n objets, tu veux calculer leur prochaine frame à afficher (la même si pas assez de temps passé, la suivante si trop de temps est passé). Tu mets donc à jour chacun de tes objets, puis tu dessines chacun de tes objets, et ce à chaque passage.

    Il faut poser des questions, c'est à ca que sert ce forum
    Mindiell
    "Souvent, femme barrit" - Elephant man

  4. #24
    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
    J'ai éffectué un projet test pour la mise en place des boucles for. L'affichage des frames ne se fait pas du tout, je pense que ca vient du manque d'un flip dans le premier for car celle ci s'arrete lorsque la variable "i" (qui permet l'affichage de la frame concernée) est égale à 14.

    Voici le code en question, il n'y a que l'animation du mégaman à l'arret et lorsqu'il avance vers la droite. Dans l'appui des touches, la touche droite enfoncé fait passé à l'état couse droite, et lorsque celle-ci est relachée, l'état revient à stop droite.

    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
    		for (i = 0 ; i < 15 ; i++)
    		{
    			switch (etat)
    			{
    			case (STOP_RIGHT):
    				if (tempsActuel - tempsPrecedent > 100)
    				{
    					SDL_BlitSurface(baseRight[i], NULL, ecran, &positionMegaman);
    					tempsPrecedent = tempsActuel;
    				}
    			break;
    			case (MOVE_RIGHT):
    				if (tempsActuel - tempsPrecedent > 70)
    				{
    					SDL_BlitSurface(runRight[i], NULL, ecran, &positionMegaman);
    					if (i == 14)
    						i = 0;
    					tempsPrecedent = tempsActuel;
    				}
    			break;
    			}
    		}
     
    		SDL_Flip(ecran);
    		SDL_BlitSurface(background, &camera, ecran, &fond);
     
    		for (i = 0 ; i < 14 ; i++)
    		{
    			SDL_Flip(runRight[i]);
    			SDL_Flip(baseRight[j]);
    		}

  5. #25
    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
    SDL_Flip n'est utilisable que sur l'écran, je ne comprends pas du tout ce que tu veux faire en l'appliquant sur les autres surfaces.

  6. #26
    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
    Je pensais que ca permetterais de mettre à jour seulement la surface entre parenthèses. J'ai enlevé cette erreur et toujours aucun changement... Je comprend pas cette manière d'afficher les images car le for est une boucle qui fonctionnera jusqu'à temps que la variable qui permet la répétition de la boucle soit égale à un nombre, donc les animations à l'intérieur seront censées se jouer intégralement même lors d'un changement d'événement.

  7. #27
    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
    Merci, je vois un peu mieux

    Quelque chose qui n'a rien à voir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		SDL_Flip(ecran);
    		SDL_BlitSurface(background, &camera, ecran, &fond);
    Il vaudrait mieux inverser l'ordre de ces lignes.

    Sinon, évidemment que non, il ne faut pas faire un for sur chaque frame de chaque animation!
    Par contre il faut étudier chacune de tes animations. C'est ça que Mindiell voulait dire. 'for (each object)' correspond à 'pour chaque animation faire...'

    A chaque animation tu associe une variable qui prend le temps correspondant à l'animation et une autre qui indique la 'frame' de l'animation à laquelle t'es. Si tu connais les structures, utilise-les!

    Ensuite, dans la boucle générale, tu vérifie pour chaque animation en cours si le temps correspondant est dépassé de tant de millisecondes, et dans ce cas tu fais avancer le numéro de la frame pour afficher la nouvelle image.

    Tu sembles programmer en C, donc ça serait bien d'avoir des structures pour simplifier (rassembler tous les paramètres correspondant à une animation dans un bloc) mais pour l'instant fait en sorte que ça marche.

  8. #28
    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
    Bon j'ai rectifié les animations, ca fonctionne beaucoup mieux. J'ai intégré l'animation du personnage qui tire, elle s'enchaine correctement, reste plus qu'à ajouter le blaster qui part de son canon et qui traverse la map.

    Les variables i,j et k sont là pour les frames de chaque animation, le temps est géré par les variables tempsActuel et tempsPrecedent. J'ai mis un while dans l'animation du tir pour que celle-ci s'éffectue entierrement lorsque la touche est enfoncée. Le code :

    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
    		SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    		SDL_BlitSurface(background, &camera, ecran, &fond);
     
    			switch (etat)
    			{
    			case (STOP_RIGHT):
    				SDL_BlitSurface(baseRight[i], NULL, ecran, &positionMegaman);
    				tempsActuel = SDL_GetTicks();
    				if (tempsActuel - tempsPrecedent > 240)
    				{
    					i++;
    					if (i == 5)
    						i = 0;
    					tempsPrecedent = tempsActuel;
    				}
    			break;
    			case (MOVE_RIGHT):
    				SDL_BlitSurface(runRight[j], NULL, ecran, &positionMegaman);
    				tempsActuel = SDL_GetTicks();
    				if (tempsActuel - tempsPrecedent > 50)
    				{
    					j++;
    					if (j == 14)
    						j = 0;
    					tempsPrecedent = tempsActuel;
    				}
    			break;
    			case (SHOOT_RIGHT):
    				while (k < 7) 
    				{
    				SDL_BlitSurface(background, &camera, ecran, &fond);
    				SDL_BlitSurface(tirA[k], NULL, ecran, &positionMegaman);
    				tempsActuel = SDL_GetTicks();
    				if (tempsActuel - tempsPrecedent > 80)
    				{
    					k++;
    					tempsPrecedent = tempsActuel;
    				}
    				SDL_Flip(ecran);
    				}
    			}
     
    		SDL_Flip(ecran);

  9. #29
    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
    ok là ça marche parce que tu peux n'avoir qu'une des trois animation à la fois. Mais si tu peux avoir plusieurs animations à la fois il faudra penser à avoir des variables tempsPrecedent séparées/

  10. #30
    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
    Effectivement, sur mon menu principal j'ai du créer plusieurs variables tempsPrecedent pour permettre à toutes les animations de s'afficher en même temps.
    Merci pour ces conseils.

Discussions similaires

  1. Créer une animation de sprite sous Eclipse
    Par HekThor dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 24/10/2008, 19h30
  2. Réponses: 5
    Dernier message: 13/08/2007, 16h06
  3. Problème pour animer un sprite
    Par Soward dans le forum SDL
    Réponses: 17
    Dernier message: 02/08/2007, 16h30
  4. Animation de Sprites .PNG: Démo ?
    Par broumbroum dans le forum Graphisme
    Réponses: 4
    Dernier message: 17/11/2006, 03h52
  5. [ Question ] Animer des sprites 3D
    Par Dam)rpgheaven dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/07/2004, 16h14

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