Brunni :
Il faut la mettre à 1 si on tombe, ou alors carrément gérer autrement la collision avec les ennemis (genre direction de laquelle on vient).
Non, mais le problème n'est pas là! C'est que je VEUX garder ce "bug" qui n'en n'est pas un. Si on regarde le code d'un ennemi on voit bien:
[...]
if (!enboule || y_absolue>enny-4) {
[...]
Je l'ai mis le !enboule en gras. Si j'enlève ça, ça fonctionnera à tous les coups.
Bah, vire-le alors! Ou mets-le en commentaire, en attendant que tu fasses un Sonic.
1. Ça n'a rien à faire dans un Mario! Mario ne s'enroule pas!
2. Il n'y a aucun feedback graphique pour montrer si on est "en boule" ou pas.
3. Dans tous les jeux Mario que je connais, si on tombe sur l'ennemi, on tue l'ennemi. Le comportement de ton jeu est extrèmement illogique et frustrant pour quelqu'un habitué au vrai jeu.
Mais je n'en ai malheureusement pas envie. Il est logique que si l'on se laisse tomber de la plate-forme on n'aura pas la même force pour écraser un ennemi que si on faisait un immense saut!
N'importe quoi.
Si tu te laisses tomber d'une plateforme qui se trouve à une hauteur de 2 mètres ou si tu sautes à une hauteur de 2 mètres en partant du sol, puis te laisses tomber, la force que tu effectueras sur l'ennemi sur lequel tu tombes est
exactement la même. L'énergie potentielle de gravitation ne dépend
pas du tout de la manière de laquelle tu es monté à un certain niveau.
Je sens que tu es nul en physique, ce qui explique aussi le problème de la parabole.
Désolé, je ne veux pas avoir l'air d'ignorer tes remarques mais le fait est que ce "bug" est volontaire alors... Bon je pourrais me dire:
if ((!enboule || GRAVITE>GRAVITE_DEPART+3) || y_absolue>enny-4) eventuellement. Dans le cas où la gravité est élevée cela signifie que le saut est suffisamment "puissant" pour écraser ce pauvre Goomba..
Non, tu vires le "enboule" tout simplement, parce que:
1. il n'a rien à faire dans un Mario et
2. la manière de laquelle on est arrivé à une hauteur n'a strictement aucune influence sur l'énergie potentielle de cette hauteur et donc sur l'énergie cinétique présente au contact avec l'ennemi.
Pas étonnant que ce n'est pas réaliste. Tu mets v (ta variable z) proportionnel à h. Or v est censé être proportionnel à t et h à t². D'où problème. Il faut mettre v proportionnel à h^(1/2).
Donc tu me conseillerais quoi sachant que:
#define MAX_SAUT (40+SAUT_OBLIGATOIRE)
(où SAUT_OBLIGATOIRE est la hauteur supplémentaire de saut que peut infliger un ennemi ou un bumper)
et saut est la valeur courante du saut (si >MAX_SAUT, le saut est terminé)
z=sqrt(MAX_SAUT-saut); (t'en penses quoi?)
Non, ça ne va pas.
Bon, on fait le calcul:
a=-g
v0=4
v=a*t+v0=4-g*t
h0=0
h=1/2*a*t²+v0*t+h0=4*t-1/2*g*t²
-1/2*g*t²+4*t-h=0
t=(-4±(16-2*g*h)^(1/2))/(-1)=4±(16-2*g*h)^(1/2)
v=4-g*t=4-g*(4±(16-2*g*h)^(1/2))
v correspond à ton
z,
h correspond à ton
saut. Dans le ±, un des signes correspond à la montée et un à la descente. Reste à trouver
g. C'est la valeur pour laquelle le saut s'arrête à
MAX_SAUT. On veut donc
g tel que
4*t-1/2*g*t² ait son maximum en
MAX_SAUT. Cette fonction a un maximum en
4/g qui vaut
8/g. Donc:
8/g=MAX_SAUT
g=8/MAX_SAUT
Voilà, j'espère que je n'ai pas fait d'erreurs de calcul. En tout cas, c'est le calcul à faire.