2016-04-24 8 views
-3

Ich mache ein einfaches Spiel, bei dem ein Raumschiff von einem Stern in der Mitte des Bildschirms angezogen wird. Der Code Ich habe bisher das Rechteck (bald eine Rakete) auf eine Art und Weise bewegt, die überhaupt nicht glatt ist. Das Rechteck hört auch nicht auf, wenn es den Stern erreicht, sondern bewegt sich weit über den Stern hinaus, bevor es zurückkehrt.Planetarische Gravitation in Java

Hier ist mein Code:

public void move() { 
    // Deals with gravity towards the center star 

    if (x > game.getWidth()/2) { 
     xVel -= xa; 
    } 
    if (x < game.getWidth()/2) { 
     xVel += xa; 
    } 
    if (y > game.getHeight()/2) { 
     yVel -= ya; 
    } 
    if (y < game.getHeight()/2) { 
     yVel += ya; 
    } 

    x += xVel; 
    y += yVel; 
} 

Ich beginne mit der Berechnung, wo die Rakete auf dem Bildschirm relativ zu der Mitte befindet, und dann seine Beschleunigungswerte ändern, xa und ya, je nach Bedarf. Ich füge dann die Beschleunigungswerte zu den Velocity-Variablen xVel und yVel hinzu.

+3

Danke für die Information ... und Ihre Frage ist? – pczeus

+0

Wenn Sie keine * Kollisionserkennung * hinzufügen, bewegt sich jedes Objekt, das von der Schwerkraft angezogen wird, über das Schwerpunktzentrum hinaus und wird dann wieder langsamer von der Sogwirkung der Schwerkraft, die sich jetzt hinter dem Objekt befindet. So funktioniert die Schwerkraft. – Andreas

Antwort

0

Sie haben nicht den ganzen Code geliefert, aber für mich klingt es wie Sie Integer verwenden, wo Sie Floats oder Doubles verwenden sollten.

Wenn Sie die Variablen wie folgt

int x; 
int velX; 

decalre Sie werden nicht die Präzision für flüssige Animation benötigt bekommen (es gibt nichts, nach dem Punkt). Bei Ganzzahlen 5/2 == 2 und nicht 2.5 als Ganzzahlen können nur ganze Zahlen gespeichert werden. Deshalb bekommst du ruckartige Bewegung.

Sie müssen Gleitkommavariablen verwenden, indem Sie sie als solche dekalieren.

float x = 0.0f; 
float vecX; 

oder

double x = 0.0; 
double vecX; 

, dass Sie die reibungslose Bewegung Sie geben.

1

Offensichtlich Sie die Geschwindigkeit ändern, indem

yVel += ya; 

usw. und das ist eine akzeptable Sache zu Ihnen, wie es aus dem Wortlaut scheint. Aber das wird eine ständig steigende Geschwindigkeit schaffen (d. H. Am Ende vorbeifliegen).

Wenn Sie die Geschwindigkeit konstant halten möchten Sie tun

if (x > game.getWidth()/2) { 
    xVel = -xa; 
} 

if (x < game.getWidth()/2) { 
    xVel = xa; 
} 

und gleichwertig. Das Rechteck wird wahrscheinlich um das Zentrum oszillieren. Bitte aktualisieren und neue Fragen stellen.

1

Die Bewegung Ihres Raumschiffs sieht nicht glatt aus, weil es sich ohne Rücksicht auf die Zeit bewegt. Was passiert, wenn Sie eine CPU-intensive Anwendung im Hintergrund öffnen und Ihr Java-Prozess weniger Rechenzeit benötigt? Jetzt rufst du nicht öfter move() an, damit dein Raumschiff plötzlich langsamer wird.

Sie brauchen, um zu verfolgen, wie viel Zeit seit dem letzten Aufruf von move() abgelaufen ist - ich bin sicher, dass Sie die High-School-Physik Formel erinnern, Entfernung = Geschwindigkeit * Zeit. Es gibt mehrere Möglichkeiten, um die Zeit zu bekommen - see here für eine Diskussion speziell für Spiele.

Dies wird die Bewegung ein wenig glätten, aber wenn Sie möchten, dass die Bewegung wie Schwerkraft aussieht, dann können Sie nicht einfach die Geschwindigkeit selbst verwenden - Sie müssen auch die Beschleunigung berücksichtigen. Ihr Raumschiff ist beschleunigt in Richtung des Sterns aufgrund seiner Schwerkraft. Je näher dein Raumschiff an den Stern kommt, desto stärker wird die Gravitationsbeschleunigung. Dies ist eine weitere High-School-Physik-Formel, die Sie im Web finden können.

+0

Die Geschwindigkeit von Zeit * funktioniert nicht gut zum Beschleunigen von Objekten, insbesondere wenn ein zweites Integral beteiligt ist. Man kann nicht einfach die Geschwindigkeit mit der Zeit multiplizieren, wenn sich die Geschwindigkeit im Laufe der Zeit aufgrund der Beschleunigung ändert, und weil sich die Beschleunigung auch im Laufe der Zeit ändert, ist die einzige Option, die ganze Mathematik zu machen (viel Mathematik). Für diese Art von Sim verwenden Sie die Verlet-Integration oder führen Sie in diskreten Zeitschritten aus und akzeptieren Sie den minimierten Fehler. Die Verwendung der Frame-Zeit führt zu einem unbestimmten und nicht handhabbaren Fehler. Obwohl ich sehr bezweifle Bildrate ist das Problem. – Blindman67

Verwandte Themen