Python 关于运动的2D Sprite物理学

Python 关于运动的2D Sprite物理学,python,pygame,sprite,game-physics,Python,Pygame,Sprite,Game Physics,我正在尝试将2D物理应用到小行星类游戏中。我在窗口边界设置了碰撞边界 然而,当我将我的飞船精灵碰撞到一个边界时(并反转x轴或y轴的适当速度),我在移动时偶尔会遇到小故障。船会暂时跳跃,但如果我按住移动键足够长的时间,它通常会自行修复 问题是这个小故障是显而易见的 相关代码部分: #update velocity def velocity(self, speed): self.vx += math.sin(math.radians(self.angle)) * speed self

我正在尝试将2D物理应用到小行星类游戏中。我在窗口边界设置了碰撞边界

然而,当我将我的飞船精灵碰撞到一个边界时(并反转x轴或y轴的适当速度),我在移动时偶尔会遇到小故障。船会暂时跳跃,但如果我按住移动键足够长的时间,它通常会自行修复

问题是这个小故障是显而易见的

相关代码部分:

#update velocity
def velocity(self, speed):
    self.vx += math.sin(math.radians(self.angle)) * speed
    self.vy += math.cos(math.radians(self.angle)) * speed

    magnitude = math.sqrt(self.vx*self.vx + self.vy*self.vy)
    if magnitude > self.maxvel:
        self.vx *= 4/magnitude
        self.vy *= 4/magnitude
    if self.speed >= self.maxvel:
        self.speed = self.maxvel
    if self.speed <= -self.maxvel:
        self.speed = -self.maxvel
我的完整代码在这里:要运行,只需要2个图像,我想你可以使用任何东西

我认为这个问题与检测到碰撞时x或y速度的反转有关,但我不能确定确切的问题。任何见解都值得赞赏

编辑:我做了更多的调查。我不知道这些突然的跳跃是不是因为我没有任何加速度的程序。摘自我的终端日志。我从程序中打印出相关变量。

试试以下方法:

DirDict = {"left": (-speed, 0), "right": (speed, 0), "up": (0, -speed), "left": (0, speed)}

if w:
    Direction = DirDict["left"]

我想这会比较稳定,;这对我来说总是有效的。

您使用固定的时间步长吗?否则,时间步跳跃可能会导致不稳定。这意味着如果它穿透边界,它可能移动800个单位,而下一帧它只移动600个单位。让它在已经进入内部后发生碰撞。所以,交换会使它保持停滞并反弹。@monkey我甚至还没有考虑时间步长。我不完全相信这与碰撞本身有关,因为船可以碰撞,行驶一段时间,然后当施加“推力”时,问题仍然存在。可能是无关的,但cos代表x,sine代表y。我建议添加记录,显示船的位置、方向和速度。每帧/更新一次。然后,您需要确定帧/更新,其中新值不是您期望的值。现在,如果没有可用的数据,仅仅查看代码并找出“错误”是非常困难的。
DirDict = {"left": (-speed, 0), "right": (speed, 0), "up": (0, -speed), "left": (0, speed)}

if w:
    Direction = DirDict["left"]