我正在尝试将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摘自我的终端日志。我从我的程序中打印出相关变量。答案 0 :(得分:0)
试试这个:
DirDict = {"left": (-speed, 0), "right": (speed, 0), "up": (0, -speed), "left": (0, speed)}
if w:
Direction = DirDict["left"]
我认为这会更稳定;它一直对我有用。