所以我不知道标题是否会将我的问题带到一定程度,而我的英语可能不会完全解释它。幸运的是,代码可以:D
所以,我正在开发一个小型多人游戏,你可以用键盘操纵一条线(速度是每秒300像素,你用键调整它的移动角度)。 / p>
每个玩家画出一条无限的线条,当你的蛇“# .. idk你怎么称呼它...除了黑色(背景颜色)之外还有其他东西你死了。 生活时间最长的玩家获胜。
您可以收集物品,其中一件物品是' Hadouken'从街头霸王瞄准最近的玩家并试图击中他(相同的地方:速度和角度)。
每帧都会计算出Hadouken' -angle。 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);
});
但是这个东西总是有正确的角度,并且如果它在硬编码的5秒后消失则会达到它的目标(速度= targetSpeed * 1.5;))。你没有机会用你的线躲闪它。我的曲线太尖锐了。
我的问题是:你能以某种方式将角度的增加限制为... idk ..每秒30度? 我确信自己可以做到这一点,但那会很奇特,而且可能会造成不必要的麻烦。
我希望这很清楚,对我的英语再次抱歉,我希望得到一些答案:)
答案 0 :(得分:1)
而不是
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;