работа с отрицательным углом в холсте - PullRequest
0 голосов
/ 26 октября 2019

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

Проблема в том, что мой игрок может бить других, даже не глядя на них. Я поставил условие в третьей строке кода ниже, чтобы решить эту проблему, но это не работает, потому что пределы угла обзора игрока составляют max 180 и min -180. Пределы между позицией игрока и позицией жертвы составляют максимум 90 мин -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
    }
}

1 Ответ

0 голосов
/ 26 октября 2019

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

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

180-angle

, затем я должен преобразовать (угол обзора) и (угол между 2 игроками) в 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});
    }
}

Спасибо

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

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

...