2015-01-24 4 views
0

Я делаю игру, и игрок перемещается, щелкая мышью по точке на карте. Затем я использую функцию для вычисления угла до точки щелчка, которая отправляет их по траектории в направлении этой точки щелчка.Проверьте, находится ли значение в пределах определенного диапазона

var angle = player.angleToPoint(new me.Vector2d(e.gameX, e.gameY)); 
player.vel.set(Math.cos(angle) * 2, -Math.sin(angle) * 2); 

Это работает.

Проблема в том, что я хочу, чтобы игрок прекратил движение и изменил анимацию «стоять», как только они достигли этой точки щелчка. Расположение точки щелчка и игрока приведены в десятичных дробей:

журнала (clickPointX + "" + clickPointY + " "+ player.x +"," + player.y) дает:

2491.830945558739 , 627.4212034383954, 4894.160772981247, 813.5879189245883 

В моей функции обновления я хотел проверить, равно ли она, но размер приращения скорости никогда не позволит ему равняться. Если я проверяю < = или

if (player.x == clickPointX && player.y == clickPointY) { 
     player.vel.x = 0; 
     player.vel.y = 0; 
     player.setCurrentAnimation("stand");   
    } 
    else { 
     if (!player.isCurrentAnimation("walk")) { 
      player.setCurrentAnimation("walk"); 
     }   
    } 

Это не похоже> =, чтобы работать. Есть ли лучший способ проверить, прибыл ли игрок в местоположение точки клика? Возможно, проверьте, находится ли местоположение игрока в пределах области щелчка?

+0

Вы пробовали 'parseInt()'? – OnlyMAJ

+0

Возможно использование Math.abs (player.x-clickPointX) <= someVal ... и т. Д. Поможет ... – deweyredman

+4

Не используйте 'num == target' с десятичными числами. Вы можете использовать 'Math.abs (num - target) Oriol

ответ

1

Как (в вашем примере) игрок перемещается на 2 пикселя за раз, чтобы проверить, находится ли игрок в пределах 2 пикселей от цели. Если точность важна для вас, вы можете захотеть добавить что-то, чтобы игрок переместился в точную позицию пикселя на следующем шаге (хотя из-за того, что числа с плавающей запятой хранятся и обрабатываются, координаты по-прежнему маловероятны то же самое, но только то же самое с ближайшим целым числом).

var xdist = player.x - clickPointx, 
    ydist = player.y - clickPointy, 
    sqDist = xdist * xdist + ydist * ydist; 
if (sqDist >= .25 && sqDist < 4) { // close but not quite there 
    player.vel.x = -xdist;  // cover the remaining distance in the next step 
    player.vel.y = -ydist; 
} else if (sqDist < .25) {   // close enough to stop 
    player.vel.x = 0; 
    player.vel.y = 0; 
} 

В качестве альтернативы использовать parseInt, чтобы проверить, если координаты целых чисел одинаковы.

if (parseInt(player.x, 10) == parseInt(clickPointx, 10) 
    && parseInt(player.y, 10) == parseInt(clickPointy, 10)) { 
    player.vel.x = 0; 
    player.vel.y = 0; 
} else if(Math.pow(player.x - clickPointx, 2) 
      + Math.pow(player.y - clickPointy, 2) < 4) { 
    player.vel.x = clickPointx - player.x; 
    player.vel.y = clickPointy - player.y; 
} 
0

Ваш игрок почти никогда не приземлиться точно на точке щелчка, так что я хотел бы проверить, что разница между игроком X и нажмите X, а также между плеером Y и нажмите Y, оба меньше скорости игрок перемещение. Поэтому, если это X + = 5 и Y + = 10, то это значения, которые вы должны использовать в своей проверке близости.

Когда игрок находится в радиусе действия, вы можете приспособить его к точному местоположению точки щелчка, если это не имеет значения для вашей игры.

Рассмотрите возможность переноса всех значений в parseInt (val, 10). Если вы используете холст HTML5, десятичные значения могут вызывать сглаживание и вызывать размытие изображений, что может быть не так, как вы хотите.

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