2015-10-13 43 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; }

你如果的的条件

相关问题