2015-10-13 2 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, но он принимает двойной и возвращает двойной. – Eran

+0

Посмотрите на 'Math.signum' –

+0

Так что-то вроде' moveX = (int) Math.signum ((float) dX) '? – Gricey

ответ

4

Вы можете попробовать использовать Math.signum()

Возвращает 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

можно сказать, что

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

с использованием йХ/Math.abs (Dx) позволит уменьшить ваши, если это и условия

Смежные вопросы