Pygame - 运动不一致

时间:2017-04-23 14:38:37

标签: python pygame

我用pygame做了一个自上而下的益智游戏,我的动作很奇怪。会发生的是,当我按一个键水平移动而一个键一次垂直移动时,该角色只有在接触水平面时才会移动。这是我的运动和碰撞代码:

def move(self, dx, dy):
    self.dx = dx
    self.dy = dy
    if self.dx != 0:
        self.move_single_axis(self.dx, 0)
    if self.dy != 0:
        self.move_single_axis(0, self.dy)

def move_single_axis(self, dx, dy):
    self.dx = dx
    self.dy = dy
    self.rect.x += self.dx
    self.rect.y += self.dy
    for wall in walls:
        if self.rect.colliderect(wall.rect):
            if self.dx > 0:
                self.rect.right = wall.rect.left
            if self.dx < 0:
                self.rect.left = wall.rect.right
            if self.dy > 0:
                self.rect.bottom = wall.rect.top
            if self.dy < 0:
                self.rect.top = wall.rect.bottom

def checkMovement(self):
    if self.paused == False:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_d]:
            self.move(5, 0)
        elif keys[pygame.K_a]:
            self.move(-5, 0)
        elif keys[pygame.K_w]:
            self.move(0, -5)
        elif keys[pygame.K_s]:
            self.move(0, 5)

谢谢!

1 个答案:

答案 0 :(得分:1)

我可以看到以下问题:

def checkMovement(self):
    if self.paused == False:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_d]:
            self.move(5, 0)
        elif keys[pygame.K_a]:
            self.move(-5, 0)
        if keys[pygame.K_w]: # !!! CHANGE !!!
            self.move(0, -5)
        elif keys[pygame.K_s]:
            self.move(0, 5)

解决这个问题吗?

我还将两个函数move_single_axis()和move()合并为一个。我不明白为什么两者都有意义。

奇怪的是你的代码如何处理dx和dy。你有一个你的函数所在的类,那么当你直接访问self.dx self.dy时,你可以将dx,dy传递给这些函数,你可以在调用这个函数之前设置哪些值?

为什么不这样做:

def checkMovement(self):
    if self.paused == False:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_d]:
            self.dx = 5
        elif keys[pygame.K_a]:
            self.dx = -5
        if keys[pygame.K_w]: 
            self.dy = -5
        elif keys[pygame.K_s]:
            self.dy = 5
        move()

其中move()是:

def move(self):
    self.rect.x += self.dx
    self.rect.y += self.dy
    for wall in walls:
        if self.rect.colliderect(wall.rect):
            if self.dx > 0:
                self.rect.right = wall.rect.left
            if self.dx < 0:
                self.rect.left = wall.rect.right
            if self.dy > 0:
                self.rect.bottom = wall.rect.top
            if self.dy < 0:
                self.rect.top = wall.rect.bottom