2015-10-13 72 views
2

遊戲中的精靈想要走向給定的(x, y)座標對,但每個打勾只能移動walkSpeed像素。數學檢查數字是正數,負數還是0

爲了弄清楚移動它們有多遠,我剛剛得到了一塊if聲明。

public void walkToward(Integer x, Integer y) { 
    int walkSpeed = 1; 

    int dX = x - getxPos(); 
    int dY = y - getyPos(); 

    int moveX, moveY; 


    if (dX > 0) { 
     moveX = walkSpeed; 
    } else if (dX < 0) { 
     moveX = -walkSpeed; 
    } else { 
     moveX = 0; 
    } 

    if (dY > 0) { 
     moveY = walkSpeed; 
    } else if (dY < 0) { 
     moveY = -walkSpeed; 
    } else { 
     moveY = 0; 
    } 

    {code to move player ...} 
} 

這不是問題,但我覺得會有更多的數學方法來做到這一點。形式的東西

int moveX = {some operation} * walkSpeed; 

{some operation}關閉所有的正數爲1,所有的負數爲-1和0比0

+0

有Math.signum,但它接受一個double並返回一個double。 – Eran

+0

看'Math.signum' –

+0

所以像'moveX =(int)Math.signum((float)dX)''? – Gricey

回答

4

你可以嘗試使用Math.signum()

返回正負號論證的功能;如果參數爲 零,則爲零;如果參數大於零則爲1.0;如果參數 小於零,則爲-1.0。

+0

我剛剛讀了一段關於'Math.signum()'的文章,發現'Integer.signum()'讀起來就像是對整數做同樣的事情。是對的嗎? http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#signum%28int%29 – Gricey

+0

@Gricey: - 是的,這是正確的! –

3
int moveX = Math.signum(dX); 
int moveY = Math.signum(dY); 
-1

,因爲你的速度定義是不正確的,您有問題。它必須是sqroot(dX*dX + dY*dY)。所以標誌並不重要。

Java解決方案:Math.hypot(dX, dY)

+0

這並不能回答我的問題,雖然它對我的例子有很好的反饋意見。作爲我認爲的評論會更好。 – Gricey

+0

它修復問題的原因並提供解決方案... – LoganMzz

0

,你可以使用DX/Math.abs(DX)將讓您減少說

if(dX == 0){ moveX=0;} else {moveX =dX/Math.abs(dX)*walkSpeed; }

你如果的的條件

相關問題