好的,所以我想制作一个javascript / html帆布游戏,让玩家跟随一些敌人,经过一些研究'她是我的怪物(敌人)级别中最重要的部分:
this.UpdateAngle = function() {
this.dx = this.x - player.x;
this.dy = this.y - player.y;
this.angle = Math.atan2(this.dy, this.dx) * 180 / Math.PI;
if (this.angle < 0) {
this.angle += 2 * Math.PI;
}
}
this.UpdateSpeed = function() {
this.speedX = this.speed * Math.cos(this.angle);
this.speedY = this.speed * Math.sin(this.angle);
}
this.Move = function() {
this.UpdateAngle();
this.UpdateSpeed();
this.x += this.speedX;
this.y += this.speedY;
}
所以我在这里要做的是用atan2()
计算从敌人到玩家的角度,然后使用cos()
计算我应该在x和y轴上移动多少sin()
,我计算的速度和角度,然后移动计算的像素。
这一切似乎运作良好,直到我移动玩家,然后敌人开始向怪异的方向移动。我不知道什么是错的,如果有人能够了解我这是怎么做的话会很棒。 :d
您可以在行动here中看到它。 *我已使用PremierBromanov的建议更新了代码。
答案 0 :(得分:1)
这可能与此块有关
this.angle = Math.atan2(this.dy,this.dx) * 180 / Math.PI;
if (this.angle < 0) {
this.angle += 2 * Math.PI;
您使用Math.atan2
以弧度输出角度,然后转换为* 180 / Math.PI;
度数之后,您将检查它是否小于零并将2Pi添加到角度确保它正确计算它的整圆的实际角度减去角度。但是,你在这里使用弧度而不是度数。因此,当您的代码为负数时,您将2Pi添加到该程度,这不是很多,但有时会使其变为正数。这就是为什么你移动时你的圆点在旋转。如果你注意到,当你离得更远时,点旋转得更慢,这意味着负角度大于2Pi,因此不会立即绕圈。
简而言之,请尝试将其更改为
if (this.angle < 0) {
this.angle += 360;
}
答案 1 :(得分:0)
好的,所以实际上是Premier Bromanov回答了这个问题,谢谢,但是我不能接受这样的评论,所以我会这样做,以便更清楚,如果有人应该过来并希望也回答。 我做的数学有点不对,这就是我的代码最终看起来像:
this.UpdateAngle = function() {
this.dx = player.x - this.x;
this.dy = player.y - this.y;
this.distance = Math.sqrt((this.dx*this.dx) + (this.dy*this.dy));
this.angle = Math.atan2(this.dy,this.dx) * 180 / Math.PI;
}
this.UpdateSpeed = function() {
this.speedX = this.speed * (this.dx/this.distance);
this.speedY = this.speed * (this.dy/this.distance);
}
this.Move = function() {
this.UpdateAngle();
this.UpdateSpeed();
this.x += this.speedX;
this.y += this.speedY;
}
再次感谢总经理布罗马诺夫,这是他的回答,也是对其他所有人来说,这是我的第一篇文章,我很高兴得到答复的速度有多快! (我是这里最慢的一个):D