Javascript 帆布游戏:n秒内的最大转向角
所以我不知道这个标题是否把我的问题带到了某个程度,而且我的英语可能不太好,无法完全解释它。幸运的是,代码可以:D 所以,我正在做一个多人游戏,你可以用键盘控制一条线(速度是每秒300像素,你可以用按键调整它的移动角度) 每个玩家画一条无限长的线,当你的“蛇”。。我不知道你怎么称呼它。。点击除黑色(背景色)以外的其他颜色,您就死定了。 寿命最长的球员获胜 你可以收集物品,其中一个物品是街霸的“哈杜肯”,它瞄准最近的玩家并试图击中他(这里相同:速度和角度给定) “Hadouken”-每帧计算一次角度。aimTo是玩家:Javascript 帆布游戏:n秒内的最大转向角,javascript,canvas,2d,angle,radians,Javascript,Canvas,2d,Angle,Radians,所以我不知道这个标题是否把我的问题带到了某个程度,而且我的英语可能不太好,无法完全解释它。幸运的是,代码可以:D 所以,我正在做一个多人游戏,你可以用键盘控制一条线(速度是每秒300像素,你可以用按键调整它的移动角度) 每个玩家画一条无限长的线,当你的“蛇”。。我不知道你怎么称呼它。。点击除黑色(背景色)以外的其他颜色,您就死定了。 寿命最长的球员获胜 你可以收集物品,其中一个物品是街霸的“哈杜肯”,它瞄准最近的玩家并试图击中他(这里相同:速度和角度给定) “Hadouken”-每帧计算一次角度
if (hadouken.aimTo)
{
var dx = hadouken.aimTo.x - hadouken.x;
var dy = hadouken.aimTo.y - hadouken.y;
var dist = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
hadouken.rad = Math.atan2(dy, dx);
if (dist < hadouken.aimTo.radius)
{
...
}
}
var plusX = hadouken.speed * _.timeFactor * Math.cos(hadouken.rad);
var plusY = hadouken.speed * _.timeFactor * Math.sin(hadouken.rad);
hadouken.x += plusX;
hadouken.y += plusY;
_.rotateDraw(hadouken, hadouken.x - hadoukenWidth / 2, hadouken.y - hadoukenHeight / 2, hadoukenWidth, hadoukenHeight, {rad: hadouken.rad}, function(x, y) {
_.drawImage(hadoukenImage, x, y, hadoukenWidth, hadoukenHeight);
});
if(hadouken.aimTo)
{
var dx=hadouken.aimTo.x-hadouken.x;
var dy=hadouken.aimTo.y-hadouken.y;
var dist=Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2));
hadouken.rad=数学atan2(dy,dx);
if(距离
但是这个东西总是有一个正确的角度,如果它在硬编码的5秒后没有消失,它将达到它的目标(速度=目标速度*1.5;)。你没有机会用你的台词闪避它。我的曲线太尖了
我的问题是:你能不能把角度的增加限制在。。idk。。每秒30度?
我相信我自己可以做到这一点,但那将是幻想,可能不必要的困难
我希望这足够清楚,再次为我的英语感到抱歉,我希望得到一些答案:)而不是
hadouken.rad = Math.atan2(dy, dx);
我会这样编码:
// time_elapsed is time since previous animation state update (in time units)
// angular_speed is max turning speed in radians per time unit
var dest_angle = Math.atan2(dy, dx);
// normalize destination vector dx,dy
var nx = Math.cos(dest_angle);
var ny = Math.sin(dest_angle);
// calc current vector
var cx = Math.cos(hadouken.rad);
var cy = Math.sin(hadouken.rad);
// calc cross product, its sign will tell ya which direction we should turn
var crp = cx*ny - cy*nx;
var ang_ofs = angular_speed * time_elapsed;
if ( crp>0 ) // shoud turn clockwise
hadouken.rad += ang_ofs;
else
if ( crp<0 ) // shoud turn counter clockwise
hadouken.rad -= ang_ofs;
// dont let it over-turn
cx = Math.cos(hadouken.rad);
cy = Math.sin(hadouken.rad);
var crp2 = cx*ny - cy*nx;
if (crp*crp2<0) // sign changed!
hadouken.rad = dest_angle;
//time\u persed是自上次动画状态更新以来的时间(以时间为单位)
//角速度是最大旋转速度,单位为弧度/时间单位
var dest_角=数学atan2(dy,dx);
//标准化目标向量dx,dy
var nx=数学cos(目标角);
var ny=数学sin(目标角);
//计算电流矢量
var cx=Math.cos(hadouken.rad);
var cy=Math.sin(hadouken.rad);
//计算叉积,它的符号会告诉你我们应该转向哪个方向
var crp=cx*ny-cy*nx;
var ang_of s=角速度*经过的时间;
如果(crp>0)//应顺时针旋转
hadouken.rad+=ang_ofs;
其他的
如果(crpIt应该可以工作!你可以通过让‘ang_ofs=Math.min(ang_ofs,Math.abs(dest_angle-hadouken.rad));‘在你计算ang_ofs之后,再把最后5行清除掉。@游戏炼金术士,这两个角度相差N*2PI并不是很简单!看起来很不错!我明天会试试,告诉你它是如何工作的:)@游戏炼金术士,如果dest_角度=π-1°,Hadooken.rad=-π+1°,ang_ofs=5°,该怎么办?很明显ang_ofs应该被钳制为2°,但你的表达式会将其保留为5°,你是对的。我应该告诉Math.abs((dest_angle-hadouken.rad)%π),而不是Math.abs(dest_angle-hadouken.rad)。还请注意,使用crp=sin(dest_angle-hadouken.rad)可以更快地计算crp;(sin(a-b)=sin(a)cos(b)-cos(a)sin(b))我认为哈杜肯人每2秒调整一次方向也很有趣。