2016-01-13 2 views
1

J'ai récemment commencé à programmer des jeux en Java. Je viens d'un arrière-plan C#/XNA et j'ai déjà de l'expérience dans le développement de jeux. Cependant, j'ai un problème dans mon jeu java. J'ai un script rebondissant qui fait rebondir une "particule" dans le jeu lors d'une collision avec une surface solide, comme le sol. Voici un extrait du code qui gère le rebondissement.Java rebond physique: rebond sans fin

private final void respondY(Rectangle r) 
{ 
    if(!r.intersects(getBounds())) // If not colliding, return 
     return; 

    if(Yvel > 0) // If falling... 
    { 
     if(r.y < Y + Height) //Another collision test 
     { 
      Y = r.y - Height; // Set Y to top of object 
      Yvel *= -bounce; // Bounce (Here is the problem) 
      onFloor = true; 
     } 
    } 
    else if(Yvel < 0) // If hit ceiling 
    { 
     if(Y < r.y + r.height) // Collision test 
     { 
      Y = r.y + r.height; // Set Y to bottom of object 
      Yvel = 0; // No bouncing here 
     } 
    } 
} 

Le problème est que les rebonds de l'objet sur le sol comme il se doit, mais après un certain temps l'objet rebondit constamment à la même hauteur où je veux que ça cesse de rebondir quand il est arrivé à cette hauteur constante.

REMARQUE:

  • Yvel est un entier qui est la vitesse verticale de l'objet

  • Bounce est un flotteur qui contrôle la « sautillante » un objet. par exemple. 0.5 signifie qu'il rebondit moitié autant qu'il est tombé

Merci d'avance! S'il vous plaît noter que ceci est mon premier poste, donc si je fais des erreurs s'il vous plaît les signaler de manière constructive.

Répondre

1

Les types float (et double) sont imprécis. Cela pose surtout des problèmes quand il s'agit de très petits nombres - en fait, il y a un plus petit nombre représentable et une quantité finie de nombres possibles qui peuvent être représentés (et un peu comme la physique quantique). Le nombre stocké par un float est en réalité le nombre le plus proche possible de représenter au résultat du calcul. Ce qui se passe est que le calcul de la vitesse n'atteint jamais zéro, car le résultat de la multiplication du plus petit nombre float peut représenter par une valeur> = .5 est lui-même.

Je forcerais à zéro en mettant un seuil bas sur le résultat du calcul:

Yvel = Yvel * -bounce; 
if (Yvel < .000001F) 
    Yvel = 0; 
+0

Merci pour la réponse rapide, mais quand j'ai essayé cela, mais le problème persiste. La ligne 'if (Yvel <0)' empêche l'objet de rebondir du tout, et si elle est supprimée, les objets rebondissent toujours à la même hauteur. Changer .0001f à quelque chose de plus grand comme .01f rend la hauteur de rebond constante plus petite, mais elle est toujours là ... Peut-être que quelque chose pourrait être fait avec Math.round() ... – JamesEpicGuru

+0

EDIT: Je n'avais pas vu votre edit dans votre réponse quand j'écrivais le dernier commentaire, j'essaie actuellement de détecter si un objet rebondit à plusieurs reprises à la même hauteur et si c'est le cas, arrête l'objet quand il touche le sol. – JamesEpicGuru