2016-08-09 85 views
0

我是新來的Java和Android。我最近一直在嘗試使用LibGDX爲Android創建遊戲。這個遊戲的一個方面涉及一個人從屏幕的一側移動到另一側(水平)。這是我的代碼:`即時速度變化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(); 
    } 

} 

我仍然不習慣弄清楚這樣的問題。當我運行這段代碼時,這個人從屏幕的一側(左側)走過屏幕的另一側(右側,離開視野)。過了一兩秒鐘後,這個人回到了視野(從右側)並轉到屏幕的另一側(到左側,留在視野中)。這個過程然後重複。而且,當這個人開始移動時,他需要一秒才能全速前進。我嘗試刪除if else語句,並創建2個不同速度的人(一個帶有正數,另一個帶負數),以創建這個人立即改變速度的幻覺(通過移除一個人併產生另一個人),但我沒有能夠做到這一點。

我想知道我該如何讓人立即達到全速,在屏幕另一側立即改變速度,並在循環中繼續此過程。任何幫助將非常感激。 謝謝。

回答

1

瀏覽您的代碼並思考邏輯。

您按照if-else語句總是將SP添加到速度。所以有效,你可以在數學結合了您的if-else,造成這種等價的:

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); 

或者更簡單:在每一幀

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

所以,你總是由2 * SP加速,除非你不在屏幕上,在這種情況下,你的速度會停止增加,但是你仍然在縮小到屏幕右側。

如果你想瞬間改變你的速度,你需要將其設置爲一個特定的值,而不是添加一些東西。我還建議不要縮放和縮放矢量,因爲這可能會導致舍入誤差。以下是如何讓你的角色從屏幕的左側和右側進行乒乓球。

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); 
} 

請注意,我用texture.getWidth()作爲一個佔位符,無論你的性格的寬度。真的,在您的播放器類中加載諸如Texture之類的資源是不好的做法。您正在將資產與遊戲邏輯混合在一起,這是一種容易出錯並且難以維護的代碼配方。最好使用資產管理器類來加載和存儲您的所有資產。角色的繪製方法可以將資產管理器作爲參數並從那裏選擇其資產參考。例如:

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

謝謝!!!!!! –