2016-08-09 60 views
0

Ich bin neu in Java und Android. Ich habe kürzlich versucht, ein Spiel für Android mit LibGDX zu erstellen. Ein Aspekt dieses Spiels beinhaltet eine Person, die sich von einer Seite des Bildschirms zum anderen (horizontal) bewegt. Das ist mein Code für die Person: `Instant Geschwindigkeitsänderung LibGDX

public class Man { 
    private static final int SP = 10; 
    private static final int NSP = -10; 
    private Vector3 position; 
    private Vector3 velocity; 
    private Texture man; 

    public Man(int x, int y){ 
     position = new Vector3(x, y, 0); 
     velocity = new Vector3(0, 0, 0); 
     man = new Texture ("person.png"); 

    } 

    public void update(float dt){ 
     if (position.x > 2560) { 
      velocity.add(NSP, 0, 0); 
     } 
     else { 
      velocity.add(SP, 0, 0); 
     } 
     velocity.add(SP, 0, 0); 
     velocity.scl(dt); 
     position.add(velocity.x, 0, 0); 
     velocity.scl(1/dt); 
    } 

    public Texture getTexture() { 
     return man; 
    } 

    public Vector3 getPosition() { 
     return position; 
    } 

    public void dispose(){ 
     man.dispose(); 
    } 

} 

Ich bin immer noch nicht daran gewöhnt, Probleme wie diese herauszufinden. Wenn ich diesen Code ausführe, geht die Person von einer Seite des Bildschirms (links) und über die andere Seite des Bildschirms (rechte Seite, außerhalb der Sicht). Nach ein oder zwei Sekunden kommt die Person wieder in Sicht (von der rechten Seite) und geht auf die andere Seite des Bildschirms (nach links, bleibt in Sicht). Dieser Vorgang wiederholt sich dann. Wenn die Person sich zu bewegen beginnt, braucht sie eine Sekunde, um die volle Geschwindigkeit zu erreichen. Ich habe versucht, die if else-Anweisungen zu entfernen und 2 Personen mit unterschiedlichen Geschwindigkeiten zu erstellen (eine mit positiver und eine mit negativer), um die Illusion zu erzeugen, dass der Mann die Geschwindigkeit sofort ändert (indem er eine Person entfernt und eine andere hervorbringt), aber ich war es nicht dazu in der Lage.

Ich würde gerne wissen, wie ich die Person dazu bringen konnte, sofort die volle Geschwindigkeit zu erreichen, die Geschwindigkeit sofort auf der anderen Seite des Bildschirms zu ändern und diesen Prozess in einer Schleife fortzusetzen. Jede Hilfe würde sehr geschätzt werden. Danke.

Antwort

1

Gehen Sie durch Ihren Code und denken Sie über die Logik nach.

Sie folgen der if-else-Anweisung, indem Sie immer SP zur Geschwindigkeit hinzufügen. So effektiv, können Sie diese Mathe mit Ihrem if-else kombinieren, in diesem Ersatz resultierende:

if (position.x > 2560) { 
     velocity.add(0, 0, 0); 
    } 
    else { 
     velocity.add(2 * SP, 0, 0); 
    } 
    velocity.scl(dt); 
    position.add(velocity.x, 0, 0); 
    velocity.scl(1/dt); 

Oder einfacher:

if (position.x <= 2560) { 
     velocity.add(2 * SP, 0, 0); 
    } 
    velocity.scl(dt); 
    position.add(velocity.x, 0, 0); 
    velocity.scl(1/dt); 

So sind Sie immer durch 2 * SP Beschleunigung auf jedem Rahmen, Es sei denn, Sie befinden sich außerhalb des Bildschirms. In diesem Fall wird die Anschlagstärke nicht mehr erhöht, aber Sie ziehen immer noch außerhalb des Bildschirms nach rechts.

Wenn Sie Ihre Geschwindigkeit sofort ändern möchten, müssen Sie sie auf einen bestimmten Wert einstellen, ohne etwas hinzuzufügen. Ich würde auch empfehlen, Ihren Vektor nicht zu skalieren und zu entkalken, weil das einen Rundungsfehler verursachen könnte. Hier erfahren Sie, wie Sie Ihren Charakter von der linken und rechten Seite des Bildschirms zum Ping Pong bringen.

public void update(float dt){ 
    if (velocity.x == 0) 
     velocity.x = SP; //first frame setup 

    //only change the velocity if character is off screen, otherwise leave it alone 
    if (position.x > 2560) 
     velocity.x = NSP; 
    else if (position.x < 0 - texture.getWidth()) 
     velocity.x = SP; 

    position.add(velocity.x * dt, 0, 0); 
} 

Hinweis, benutzte ich texture.getWidth() als Platzhalter für alles, was die Breite des Charakters ist. Wirklich, es ist eine schlechte Übung, ein Asset wie eine Textur in Ihre Player-Klasse zu laden. Sie vermischen Assets mit der Logik Ihres Spiels, was ein Rezept für Code ist, der fehleranfällig und schwer zu pflegen ist. Verwenden Sie am besten eine Asset Manager-Klasse, um alle Ihre Assets zu laden und zu speichern. Die Zeichenmethode Ihres Charakters kann den Asset-Manager als Parameter verwenden und von dort aus seine Asset-Referenz auswählen. Zum Beispiel:

public void draw (SpriteBatch batch, MyAssets assets){ 
    TextureRegion region = assets.getRegion("man"); //imaginary assets class--implementation up to you 
    batch.draw(region, x, y); 
} 
+0

Vielen Dank !!!!!! –