在 canvas 游戏中使用负角度
working with negative angle in a canvas game
我正在使用 HTML、JS 和 canvas 制作俯视图中世纪游戏。
问题是我的播放器可以在不看别人的时候击中他们。我在下面代码的第三行设置了一个条件来解决这个问题,但是这不起作用,因为玩家的视角限制是最大 180
和最小 -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
}
}
回答我自己的问题
首先我会垂直翻转我的角度,因为它必须是反向的。 go to source
180-angle
然后我必须将(视角)和(两个玩家之间的角度)转换为 0-360。 go to source
(angle + 360) % 360
然后我需要检查其他两个角度之间的角度。 go to source
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});
}
}
谢谢
Or if that isn't helping, one of the answers from Stack Overflow found by searching for "javascript check if two angles are close" should give you enough useful information to solve it. – Andrew Morton
我正在使用 HTML、JS 和 canvas 制作俯视图中世纪游戏。
问题是我的播放器可以在不看别人的时候击中他们。我在下面代码的第三行设置了一个条件来解决这个问题,但是这不起作用,因为玩家的视角限制是最大 180
和最小 -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
}
}
回答我自己的问题
首先我会垂直翻转我的角度,因为它必须是反向的。 go to source
180-angle
然后我必须将(视角)和(两个玩家之间的角度)转换为 0-360。 go to source
(angle + 360) % 360
然后我需要检查其他两个角度之间的角度。 go to source
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});
}
}
谢谢
Or if that isn't helping, one of the answers from Stack Overflow found by searching for "javascript check if two angles are close" should give you enough useful information to solve it. – Andrew Morton