我用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)
谢谢!
答案 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