Bonsoir,
Le problème des jeu de plateforme, reste la
collision, disons, la collision
EXACT.
Le mieux lorsque tu déplace ton joueur, est de vérifier
à chaque step, si il ne va pas être en collision un pixel plus loin en direction de son déplacement, avec un ou plusieurs objets.
Et c'est a partir de la que ça devient difficile.
Imaginons que notre personnage ait une vitesse de 5, et vers la droite, tu ferais une petite vérification, savoir si 5 pixel plus loin, il y a quelque chose.
Avec un peu de chance, il y aura pile 5 pixel d'espace libre, et tu pourras te retrouver pile coller au mur, mais maintenant, entre toi et le mur, si il y avais 4 pixel de libre, que tu test avant le déplacement, bien ton personnage ne bougera pas. Et côté collision, être bloquer à 4 pixel, pour un déplacement de 5... C'est ennuyeux. Et moche pour les yeux
Pour pouvoir faire ce fameux test, pixel par pixel je vais t'expliquer au complet un petit moteur que j'utilise, enfin la moitié déjà :
- Code:
-
vitesse_verticale+=gravite
Pour le moment c'est simple, on créé la
chute a cause de la gravité, que tu peux toi même changer (évite de dépasser 1, c'est hard sinon).
- Code:
-
repeat (abs(vitesse_verticale))
{
}
Comme dit précédemment , l'on doit vérifier
a chaque pixel, si il y a quelque chose, donc on va répeter (
repeat), autant de fois, que de pixel qui est utilisé pour déplacer le personnage (
vitesse_verticale)
PS : abs signifie Absolue, ce qui correspond a rendre le chiffre positif
Ex : abs(10)=10, abs(-2)=2L'on va imaginer que ton personnage
tombe de 10 pixels.
1er pixel (
nous somme ici dans 1 seule step)
- Code:
-
repeat (abs(vitesse_verticale))
{
if (place_free(x,y+sign(vitesse_verticale))
{
}
}
On demande si il y a de la place, a x, et a y+sign(vitesse_verticale),
sign renvoie 1 si la variable donnée est positive, mais elle renvoie -1 si la variable est négative. Pour le descriptif, l'on a dit qu'il tombais, alors ici la variable vaut 1, car vitesse_verticale vaux 10.
On traduit alors, il vérifie si il n'y a rien a y+1 ( en dessous ).
- Code:
-
repeat (abs(vitesse_verticale))
{
if (place_free(x,y+sign(vitesse_verticale))
{
y+=sign(vitesse_verticale)
}
}
Il ne reste plus qu'à déplacer le joueur, si il n'y a rien, évidemment, de 1 pixel vers le bas.
La boucle (
repeat) va
répéter l'opération 10 fois, si il ne touche toujours rien, il le répéteras encore. (
Plus de 10 fois par la suite, étant donner que la gravité fais qu'un poids en chute, prend de la vitesse)
Mais si au milieux des 10 pixels, disons au 6 ème, un bloc fausse la vérification. Là il va falloir
cesser la chute dans un premier temps, puis,
couper la boucle, oui sinon elle continuera de vérifier (
inutilement).
- Code:
-
repeat (abs(vitesse_verticale))
{
if (place_free(x,y+sign(vitesse_verticale))
{
y+=sign(vitesse_verticale)
}
else
{
vitesse_verticale=0
break
}
}
Ici,
vitesse_verticale=0, fais que le joueur ne tombe plus et un
break, pour stopper la boucle.
Voila pour la chute.
Evidement, les saut sont aussi gérer par le script, je te laisse réfléchir pour faire une autre boucle (repeat) qui s'occupera de la vitesse horizontale.
Bonne chance a toi.
PS : si tu ne trouve pas, je te passerais l'autre moitié du moteur.[code]