работа с отрицательным углом в игре на холсте

Я делаю средневековую игру с видом сверху, используя HTML, JS и холст.

Проблема в том, что мой игрок может бить других, когда на них не смотрит. Я сделал условие в третьей строке приведенного ниже кода для решения этой проблемы, но это не работает, потому что пределы угла обзора игрока составляют max 180 и min -180. Пределы между положением игрока и положением жертвы - max 90 min -270. Эти ограничения портят мое состояние.

Я могу принять любые идеи или готовые условия или код.

if(Math.sqrt(Math.pow((this.X-Victim.X),2),Math.pow((this.Y-Victim.Y),2)) <= 100){//<-here calculates distance between victim and player
    var angle = Math.atan2(this.X - Victim.X , this.Y - Victim.Y) * (180 / Math.PI);//<-here calculates angle between victim and player
    if((angle < this.LookAngle + 45)&&(angle > this.LookAngle - 45)){//<- i need help on here
        console.log(angle,this.LookAngle);
        //socket.emit('HitTo',{UserName:Victim.UserName,hitval:20});//<- actually you dont need to know this
    }
}

person Mert Çelik    schedule 25.10.2019    source источник
comment
if(Math.abs(angle) < this.LookAngle + 45) помогает? (Кроме того, вам не нужен Math.sqrt: используйте 10000, т.е. 100 * 100 вместо 100, и я почти уверен, что вам следует добавлять эти значения в квадрате, а не ставить между ними запятую.)   -  person Andrew Morton    schedule 26.10.2019
comment
Я думаю, мне нужен math.sqrt, потому что это не похоже на 100 * 100, это похоже на hipotenus*hipotenus = a*a + b*b @AndrewMorton   -  person Mert Çelik    schedule 26.10.2019
comment
Возведите обе стороны в квадрат: sqrt(a*a + b*b) < x = ›a*a + b*b < x*x, и это сэкономит время на вычисление sqrt. Но это лишь часть проблемы.   -  person Andrew Morton    schedule 26.10.2019
comment
да это не решает основную проблему XD   -  person Mert Çelik    schedule 26.10.2019
comment
Итак, if(Math.abs(angle) < this.LookAngle + 45) помогает? Ссылка: Функция Math.abs () .   -  person Andrew Morton    schedule 26.10.2019
comment
Или, если это не помогает, один из ответов от Stack Overflow, найденных при поиске проверки javascript, близки ли два угла, должен дать вам достаточно полезной информации для решения этой проблемы.   -  person Andrew Morton    schedule 26.10.2019
comment
Я знаю, что могу использовать Math.abs для преобразования в положительное значение, но -76 != 76 -76 == 284 в градусах   -  person Mert Çelik    schedule 26.10.2019


Ответы (1)


отвечая на мой собственный вопрос

Сначала я переверну угол по вертикали, потому что он должен быть обратным. перейти к источнику

180-angle

тогда я должен преобразовать (угол взгляда) и (угол между двумя игроками) в 0-360. перейти к источнику

(angle + 360) % 360

Затем мне нужно проверить угол между двумя другими углами. перейти к источнику

var isbetween = (startangle,midangle,endangle) => {
    endangle = (endangle- startangle) < 0 ? endangle - startangle + 360 : endangle - startangle;
    midangle = (midangle - startangle) < 0 ? midangle - startangle + 360 : midangle- startangle;
    return (midangle <  endangle); 
}

и применяя к моему коду

if(Math.sqrt(Math.pow((this.X-Victim.X),2),Math.pow((this.Y-Victim.Y),2)) <= 100){
    var angle = Math.atan2(this.X - Victim.X , this.Y - Victim.Y) * (180 / Math.PI);
    var flippedangle = 180 - angle;
    var fixedangle = (flippedangle + 360) % 360;
    var fixedlook = (this.LookAngle + 360) % 360;
    if(((fixedangle - (fixedlook + 80)) < 0 ? fixedangle - (fixedlook + 80) + 360 : fixedangle - (fixedlook + 80)) > (((fixedlook - 80) - (fixedlook + 80)) < 0 ? (fixedlook - 80) - (fixedlook + 80) + 360 : (fixedlook - 80) - (fixedlook + 80))){
        socket.emit('HitTo',{UserName:Victim.UserName,hitval:20});
    }
}

Спасибо

Или, если это не помогает, один из ответов от Stack Overflow, найденных при поиске «javascript check, если два угла близки», должен дать вам достаточно полезной информации для решения этой проблемы. - Эндрю Мортон

если вы хотите посмотреть игру, здесь ссылка на нее.

person Mert Çelik    schedule 25.10.2019