2012-04-04 4 views
1

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

Вот картинка: D Example

Итак, как бы я это сделать? У меня есть x, y и direction, каждого объекта корабля. Это моя последняя неудачная попытка, пытаясь считать, что направление игрока будет ровно на 180 градусов от направления противника относительно игрока.

var direction=Math.direction(this.x,this.y,player.x,player.y,1), 
    playerview=Math.abs(direction)-Math.abs(player.direction-180) 
if(Math.abs(playerview)<10) { 
    console.log('in view') 
    this.xVelocity+=AI.speed*Math.sin(playerview*Math.PI/180) 
    this.xVelocity+=AI.speed*Math.cos(playerview*Math.PI/180) 
    } 

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

ответ

0

В своём коде Вы изменяете эту ситуацию.xVelocity дважды вместо изменения this.yVelocity.

Я думаю, Math.direction не соответствует стандарту JavaScript/ECMA. Вы уверены, что используете его правильно? Рассмотрим Math.atan2.

Кроме того, вы должны предоставить определение «лицом друг к другу».

Если это «видя друг друга», то ваш комментарий «в поле зрения» вводит в заблуждение.


Но главный вопрос:

Math.abs(angleInDegrees)изменяет угол!

Правильный способ построить абсолютное значение угла:

while (angleInDegrees < 0) 
{ 
    angleInDegrees += 360; 
} 

// If necessary, add this too: 
while (angleInDegrees >= 360) 
{ 
    angleInDegrees -= 360; 
} 

-10 и 350 идентичны, -10 и 10 на 20 градусов друг от друга.

Для дальнейшего объяснения, давайте называть код выше normalizeAngle

(Примечание: Для огромных значений, цикл может работать очень долго или даже навсегда Если может возникнуть такие значения, это должно быть проверено.).


следующая следует сделать трюк:

playerview = normalizeAngle(direction - player.direction - 180) 
if (playerview < range || playerview > 360-range) { 

Кстати: «playerview» должен быть Mininum из поля игрока зрения и Энем Поле зрения.

+0

Спасибо, копирование xVelocity была посредственной ошибкой ^^; однако проблема не в движении корабля, он получает правильное обнаружение. Я уверен, что Math.direction работает так, как я использовал его для всего остального. Я сам добавил свой прототип; Я знаю, что это не стандарт. И, из сонного состояния, я сказал, что хочу плохо.То, что я хочу, это проверить, стоит ли игроку противостоять врагу, учитывая небольшой диапазон, как показано на рисунке выше. Вы знаете, как я этого достиг? Или добавили бы еще 180 работы, учитывая эту дополнительную меру, чтобы сохранить угол в пределах 360? – Ruffy

+0

Я редактирую ответ, чтобы набросать решение. – Black