Après une longue période d'absence me revoilà, et cette fois-ci j'ai un petit problème au niveau de l'animation d'un de mes personnages.
Ce que je souhaites faire:
Un personnage se déplace sur l'axe x tant qu'il n'a pas dépassé une limite si cette limite est déplacé il repart dans l'autre sens jusqu'à une nouvelle limite, et ainsi de suite.
Shéma (| = limite, - = trajet, <> = direction, [] = perso):
|---<---[]
quand |[]---<----
alors |[]--->---
et quand --->---[]|
alors ---<---[]|
C'est le même système pour les anciens mario sur GB
Mais bon voilà mon code à moi faire ça:
Le perso se déplace vers la gauche sans problème et dès qu'il est à la limite il revient au point de départ et continue ainsi de suite. En gros il oublie de faire le chemin inverse en se téléportant directement
Voici mon code (j'ai pas tout mis évidemment, car mettre 3 pages, les sprites and co, a embrouiller: ça vient de l'algo et pas d'ailleurs):
On est d'accord, mais tu ne comprends pas pourquoi ton bonhomme agit comme ça avec cet algo ?
-> On entre dans la boucle avec positionPikachu.x surement < 100 non ?
Alors la première condition est satisfaite => à la fin du premier tour (de la boucle générale), positionPikachu.x > 200. Ok ?
-> Deuxième tour : La condition n'est pas satisfaite, l'instruction du else est éxécutée => Pikachu revient au départ.
Pour ce type d'animation, ne pas négliger l'outils mathématiques, les fonctions trigonométriques sont pratiques avec les évènements périodiques.
Mais dans un premier temps, je te conseil de t'en passer afin de trouver une solution purement algorithmique.
A chaque incrémentation de pos.x tu ne "blit" pas ta surface et ne "flip" pas l'écran, donc c'est normal que tu ne voies rien...
Non c'est fait plus bas, je vois le pikachu se déplacer donc.
Citation : freecircus
Citation :
ça vient de l'algo et pas d'ailleurs
On est d'accord, mais tu ne comprends pas pourquoi ton bonhomme agit comme ça avec cet algo ?
-> On entre dans la boucle avec positionPikachu.x surement < 100 non ?
Alors la première condition est satisfaite => à la fin du premier tour (de la boucle générale), positionPikachu.x > 200. Ok ?
-> Deuxième tour : La condition n'est pas satisfaite, l'instruction du else est éxécutée => Pikachu revient au départ.
Pour ce type d'animation, ne pas négliger l'outils mathématiques, les fonctions trigonométriques sont pratiques avec les évènements périodiques.
Mais dans un premier temps, je te conseil de t'en passer afin de trouver une solution purement algorithmique.
tempsActuel = SDL_GetTicks();
if(tempsActuel - tempsAvant > 100)
{
if(positionPikachu.x <= 100)
{
while(positionPikachu.x <= 200)
positionPikachu.x += 3;
}
else
{
while(positionPikachu.x >= 100)
positionPikachu.x -= 3;
}
tempsAvant = tempsActuel;
}
Jme trompe? En tout cas ça me semble un peu plus logique
Mais là le pikachu va à la vitesse de l'éclair, une fois à gauche puis au centre, à droite et au milieu etc etc..
:/
Edit: j'ai tenté autrechose mais sans succès (pikachu bouge pas)
Il faut raisonner en structures, en objet :
Par exemple définir ton objet ainsi :
struct objet
{
int x,y; // coordonnées
int vx,vy; // vecteur de déplacement
...
}
Au début, tu met vx=1, et quand tu as x>300, tu mets vx=-1. et quand tu as x<10 tu remets vx=1
et ensuite, a chaque itération, tu fais x+=vx;
et ton va et vient marche bien.
n'oubliez pas qu'il est important, pour chaque "objet" si j'ose dire, de stocker tout ce qui le caractérise, de façon a ce que, quand tu demande "Evolue", l'objet contienne ses données suffisantes pour évoluer tout seul : dans ce cas, l'objet contient vx, il sait vers ou il va évoluer.
ben c'est malin ... j'essaie de trouver un moyen de le faire reflechir et tu lui donnes la reponse -_-'
[SDL] Un va et vient
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html