L'objet c'est le personnage, les balles, les ennemis : tout ce qui doit bouger à l'écran indépendamment du reste.
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
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 )
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
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]); }
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.
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.
Merci, je vois un peu mieux
Quelque chose qui n'a rien à voir:
Il vaudrait mieux inverser l'ordre de ces lignes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SDL_Flip(ecran); SDL_BlitSurface(background, &camera, ecran, &fond);
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.
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);
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/
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager