2009-11-22 7 views
3

J'écris un jeu simple avec javascript/html5, et j'essaye d'implémenter la "gravité".'Gravity' ne fonctionne pas correctement dans le jeu Javascript/HTML5

Le code que j'ai est un peu comme ceci:

gravity = 4; 
acceleration = 1.1; 

function gameLoop() { 

    gravity = gravity*acceleration; 

    if (characterPositionY < 600) 
    characterPositionY = characterPositionY + gravity; 

    setTimeout(gameLoop,1000/30); 
} 

Le chiffre « 600 » est le bas de l'écran, le « terrain », si vous voulez, où le joueur doit arrêter de tomber. Malheureusement, comme la gravité fait chuter le personnage d'au moins 4 pixels (et augmente) dans chaque cycle de boucle ... le personnage s'arrêtera souvent devant, ou devant le sol. Comme ceci, par exemple:

[1] est characterPositionY 590

-add 4-

[2] est characterPositionY 594

-add 4-

[3] characterPositionY est 598

-Ajouter 4-

[4] carbonisation acterPositionY est 602

... passé le sol.

Je n'ai jamais vraiment fait de jeux auparavant, et je suis en train de tout faire au fur et à mesure. Il y a probablement de bien meilleurs moyens de s'y prendre.

+1

Votre formule de physique est fausse. En simplifiant un peu, la gravité est une force descendante constante qui ajoute donc une augmentation constante de la vitesse à chaque pas de temps. Ainsi l'équation devrait lire quelque chose de plus comme "downward_speed + = gravity_acceleration". gravity_acceleration serait d'environ 10 mètres par seconde - la conversion en pixels par timestep est à vous. – Kylotan

Répondre

5

Changer votre test à quelque chose comme:

if (characterPositionY + gravity < 600) 
    characterPositionY = characterPositionY + gravity; 
else 
    characterPositionY = 600; 
+1

Vous pouvez également utiliser la fonction min: CharacterPositionY = min (CharacterPositionY + gravité, 600); Il prend moins de code et une opération de moins sur la CPU. – mattbasta

0
function gameLoop(){ 

    gravity = gravity*acceleration; 

    if (characterPositionY < 600-gravity) 
    characterPositionY = characterPositionY + gravity; 

    setTimeout(gameLoop,1000/30); 

} 

Peut-être que cela aiderait?

0
if (characterPositionY < 600) { 
    characterPositionY = characterPositionY + gravity; 
    if (characterPositionY > 600) characterPositionY = 600; 
} 
0
gravity = 0; /* rate of change of position due to grav*/ 
acceleration = .4; /* rate of change of grav*/ 


function gameLoop(){ 

    if (characterPositionY < 600)/* above ground*/ 
    { 
    gravity = gravity + acceleration; /*increase speed of drop*/ 
    characterPositionY = characterPositionY + gravity; /*apply speed to position*/ 
    } 
    if (characterPositionY >= 600)/*at or below ground*/ 
    { 
    characterPositionY = 600; /*set on ground if character has 'clipped' through*/ 
    gravity = 0; /*touching the ground has stopped Y movement due to gravity*/ 
    } 

    setTimeout(gameLoop,1000/30); 

} 

Le var gravité représente vraiment la contribution de gravité au mouvement Y. Pensez à le renommer en quelque chose comme fallSpeed.

De plus, notez que le var, accélération, est ajouté à la gravité. Ceci représente plus précisément une accélération constante. Vous pouvez également envisager de renommer l'accélération en gravAcceleration.

J'espère que cela aide.

Questions connexes