Javascript 帆布游戏:n秒内的最大转向角

Javascript 帆布游戏:n秒内的最大转向角,javascript,canvas,2d,angle,radians,Javascript,Canvas,2d,Angle,Radians,所以我不知道这个标题是否把我的问题带到了某个程度,而且我的英语可能不太好,无法完全解释它。幸运的是,代码可以:D 所以,我正在做一个多人游戏,你可以用键盘控制一条线(速度是每秒300像素,你可以用按键调整它的移动角度) 每个玩家画一条无限长的线,当你的“蛇”。。我不知道你怎么称呼它。。点击除黑色(背景色)以外的其他颜色,您就死定了。 寿命最长的球员获胜 你可以收集物品,其中一个物品是街霸的“哈杜肯”,它瞄准最近的玩家并试图击中他(这里相同:速度和角度给定) “Hadouken”-每帧计算一次角度

所以我不知道这个标题是否把我的问题带到了某个程度,而且我的英语可能不太好,无法完全解释它。幸运的是,代码可以:D

所以,我正在做一个多人游戏,你可以用键盘控制一条线(速度是每秒300像素,你可以用按键调整它的移动角度)

每个玩家画一条无限长的线,当你的“蛇”。。我不知道你怎么称呼它。。点击除黑色(背景色)以外的其他颜色,您就死定了。 寿命最长的球员获胜

你可以收集物品,其中一个物品是街霸的“哈杜肯”,它瞄准最近的玩家并试图击中他(这里相同:速度和角度给定)

“Hadouken”-每帧计算一次角度。aimTo是玩家:

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秒调整一次方向也很有趣。