2017-04-11 3 views
2

Also habe ich versucht, eine Physik-Simulation zu programmieren. Ich beginne klein, indem ich einen freien Fall simuliere. Ich verwende Java Jframe und einige Methoden aus der AWT-Bibliothek in Java. Das Problem, mit dem ich konfrontiert wurde, ist jedoch die Anpassung der Parameter, um meine Simulation lebensechter zu machen. Mein Spiel while-Schleife läuft mit konstanten 60 FPS, was bedeutet, dass jede Schleife 16 ms dauert. Jedes Mal, wenn ich aktualisieren, ich diese Gesetze:Physik-Simulation, Pixel zu Metern anpassen?

this.velX = this.velX + (accX)*delta; 
this.velY = this.velY + (accY) * delta ; 

this.velY = this.velY * 0.9; 


this.x = this.x + (int) ((this.velX) * delta); 
this.y = this.y + (int) ((this.velY)* delta); 

Da ich aber in int bin konvertieren, werden die Werte immer wieder auf 0 bekommen, da sie so klein sind. Und die Zeichenmethoden für die Formen akzeptieren nur int (was ich für verständlich halte, oder?). Ich habe mich gefragt, ob es dafür eine Lösung geben würde. Der Ball würde stecken bleiben und seine Bewegung wäre nicht spürbar (wenn er sich überhaupt bewegt).

Ich habe versucht, Delta als 1 zu übergeben, und es hat gut funktioniert, aber es ist zu schnell obwohl und ich glaube nicht, dass es realistisch ist. Daher wäre es sehr hilfreich, wenn jemand mir allgemeine Ideen zu einem solchen Problem geben könnte. So sollten die Gleichungen werden

this.x = this.x + (int) deltaX; 
this.y = this.y + (int) deltaY; 

Jetzt

+1

"16 ml Sekunden" - 16 Milliliter Sekunden ?? Ich denke, das sollte "ms" = Millisekunden sein? – Fildor

+3

Es hört sich so an, als ob du deine Koordinaten von dem Ort liest, an dem sie gerendert werden - das ist genau die Ursache für dein Problem in meinen Augen. Versuchen Sie, Koordinaten in einem bestimmten Objekt zu speichern, das sie in der Form annehmen kann, in der Sie sie auch wirklich benötigen (d. H. In "double" oder was auch immer) und dann nur in "int" umwandeln. –

+0

Ja, sorry, ich habe es bearbeitet. – Robot0110

Antwort

1

Das Problem ist in diesen Zeilen

this.x = this.x + (int) ((this.velX) * delta); 
this.y = this.y + (int) ((this.velY)* delta); 

Begriff den späteren Teil der Gleichungen ((this.velX) * delta) and ((this.velY) * delta) als deltaX and deltaY

lässt, geht es hier ist, dass Sie konvertieren die deltaX and deltaY in eine ganze Zahl und reduzieren damit ihren Beitrag zu den x and y Positionen auf Null.

Auch wenn die Änderungen über eine lange Zeit (über eine Anzahl von Frames) gering sind, wird der Beitrag signifikant.

Angenommen, die Änderung deltaX ist .1 sollte in der Lage sein, 1 Pixelverschiebung in 10 Frames hinzuzufügen.

Wenn Ihre draw-Funktion nur Ganzzahlen verwendet, sollten Sie vorher die Positionswerte in dieser Zeile konvertieren, sie sollten für alle anderen Zwecke float or double sein.

So sollten Gleichungen

this.x = this.x + this.velX * delta; //this.x is float 
this.y = this.y + this.velY* delta; //this.x is float 

draw((int)x, (int)y) 

sein Es sollte jetzt funktionieren.

Hinweis: Auch ich weiß nicht, wie man konstante Frameraten ist beibehalten, wie Java kann das nicht tun. Sie müssen die variable Bildrate berücksichtigen. Das hast du bereits mit delta gemacht. Delta-Wert sollte nicht konstant sein und sollte am Ende jedes Rahmens berechnet werden.

+0

Vielen Dank !! das funktioniert tatsächlich !! Ich benutze den typischen thread.sleep zum Schlafen für das, was von den 16 ms nach der Verarbeitung übriggeblieben ist. ist das falsch? – Robot0110

+0

Ja, 'Thread.sleep()' garantiert nicht, dass Thread zum genau angegebenen Zeitpunkt aufwacht. So können Sie den tatsächlichen Delta-Wert im Sleep mit 'System.currentTimeMillis()' berechnen. Das sollte perfekt funktionieren. – 11thdimension

+0

@ user70319, Besser noch, versuchen Sie es mit 'java.util.concurrent.ScheduledExecutorService', es hat diese praktische Methode' templateAtFixedRate', die es Ihnen erlaubt, einige x Zeiteinheiten Code auszuführen. Achten Sie darauf, dass der geplante Code zu langsam ist, um die Ausführung rechtzeitig abzuschließen. Sie sollten diese Instanzen abfangen und behandeln. –