2D运动问题

所以我正在做一个等距的游戏在JavaScript中,到目前为止它进展顺利。 但是当我们假设一个对象从A点走到B点时,我遇到了一些问题。

Item.prototype.update = function(delta){ var speed = 1; //<-- hard coded for now var deltaX = this.toX - this.x; var deltaY = this.toY - this.y; var radians = Math.atan2(deltaX, -deltaY) * (180 / Math.PI); var distance = Math.sqrt((deltaX*deltaX)+(deltaY*deltaY)); this.x += Math.cos(radians) * Math.min(speed, distance) * delta; this.y += Math.sin(radians) * Math.min(speed, distance) * delta; }; 

我遇到的问题是,移动的对象在开始向正确的方向前进行180或90转的奇怪转动,然后在接近目的地时减速。 我不知道是什么原因造成的问题。

你的减速可能是因为当距离低于你的速度时,你将Math.min(速度,距离)(意味着你不能以你的速度每帧移动(因为它取决于三角洲))。

您的代码不允许我在您所描述的回合中查看导致问题的原因。

为了find问题的具体位置,我建议你通过将他们的内容写入控制台来追踪你的variables,从而看到不良行为来自哪里。

编辑:

这里是你的情况的一个修复(我没有在JStesting,但它在Python中)

 Item.prototype.update = function(delta){ var speed = 1; //<-- hard coded for now var deltaX = this.toX - this.x; var deltaY = this.toY - this.y; //var radians = Math.atan2(deltaX, -deltaY) * (180 / Math.PI); var radians = Math.atan2(deltaY, deltaX); var distance = Math.sqrt((deltaX*deltaX)+(deltaY*deltaY)); var max_distance = delta * speed; var distance_this_frame = Math.min(distance, max_distance); this.x += Math.cos(radians) * distance_this_frame; this.y += Math.sin(radians) * distance_this_frame; }; 

你在使用atan2时有两个问题:首先,如问题的评论所指出的那样,为什么你的计算乘以(180 / Math.PI) ,其次,atan2的参数是y, x ,而不是x, y

正如我早期指出的那样,你使用min是不合适的。 向控制台发送垃圾邮件有助于查看哪些值应该保持不变,并帮助跟踪问题的来源。 当我说variables时,我建议在其中包含计算结果