Je vais essayer de t'expliquer pourquoi il se passe ça, c'est un problème récurent lorsque l'on débute.
Le programme exécute toutes les actions par étape. Ces actions sont segmentés par les "steps" ou plus couramment les "frames" le fameux frame rate (step=frame). Enfin peut être que tu sais déjà ça.
Pour déplacer ton perso verticalement toi tu utilises la variable gravity, c'est une manière que je ne recommande pas, il vaut mieux modifier le y à partir d'une variable personnel (que l'on a créé sois même)
en gros gravity une fois qu'elle est activé va augmenter ça valeur en fonction de la valeur de base que tu lui a donné puis rajouter cette valeur au y.
Donc plus il y'a de step qui défilent et plus cette valeur sera grande et donc plus ton perso ira vite.
Prenons un exemple:
Ton perso se trouve à 100 pixels de l’objet pic. Il se déplace chaque step d'une valeur (la valeur de gravity) qui vient s'ajouter à sa variable y qui défini sa position dans l'axe vertical.
step 1 il est à 100 p (de l'objet pic )
step 2 il est à 99,8 p
etc...
lorsqu'une 20 ene de step seront passés son y changera beaucoup plus brutalement puisque gravity sera plus élevé.
step 20 il est à15 p
step 21 il est à 10 p
maintenant qu'est ce qu'il se passe quand le perso se trouve à 5 p du pic...
Au step suivant le programme ajoute comme au préalable la valeur de gravity à y
Cette valeur étant par exemple de 7p donc à ce step là ton perso est déjà en collision de 2 p, sauf que l'évènement "collision" est foutu bizarrement et il intervient avant que ce dernier step ne se produise, donc l'action se déclenche à par exemple 5 pixels du pic.
Ce qu'il faut faire c'est utiliser une boucle.
La boucle permet d'effectuer plusieurs calcul à l’intérieur d'un step, c'est comme si tu avait un event step à l’intérieur de l'event step.
Le but est de calculer si le pic se trouve à 1 pixel en dessous de lui autant de fois que la valeur ajouté à y pour ce step.
Si au step 21 gravity ajoute 5 à y on demandera 5 fois si le pic se trouve juste en dessous.
Pour la boucle ça donne ça:
for(i=0;i<vitesse;i+=1)
{
if ! place_meeting(x,y+1,spike)
{
y+=1
}
else {game_restart()}
}
Mais ça suffis pas là il faut du coup configurer "vitesse" par ce qu'il ne faut plus que tu utilises gravity et donc il faut reprogrammer le moteur physique.
Je te fais ça dans un gmk le plus simplement possible et je t'envoie ça dans pas longtemps.
(j'ai la flemme de me relire y'a peut être des grosse conneries)