0

我正在尝试将 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

我的运动代码:

if (key[K_UP]):
    newShip.speed += 1
    newShip.moving = 1

if (key[K_DOWN]):
    newShip.speed -= 1
    newShip.moving = 1

if (key[K_LEFT]):
    newShip.angle += 4

if (key[K_RIGHT]):
    newShip.angle -= 4

我的完整代码在这里:http ://pastebin.com/19rHq97R运行只需要 2 张图像,你可以使用我猜想的任何东西。

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

编辑:我做了更多调查。我想知道突然的跳跃是否是因为我没有编程任何类型的加速。http://pastebin.com/vFy9tjyN摘自我的终端日志。我从我的程序中打印出相关变量。

4

1 回答 1

0

尝试这个:

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

if w:
    Direction = DirDict["left"]

我认为这会更稳定;它一直对我有用。

于 2014-09-09T00:58:36.797 回答