【发布时间】:2022-02-19 03:20:16
【问题描述】:
我想尝试用pygame制作平台游戏。
出于某种原因,如果我只检查 x 或 y 碰撞,一切正常,但只要我每次我的玩家撞到地面或天花板时都检查它们,它就会传送到方块的一侧。我尝试了一些打印语句来验证是否发生了碰撞,如果两个碰撞检查都在玩家落地时激活,而不检查它在侧面传送的碰撞,则它没有。
这是我的代码,使用collision_x() 和collision_y() 方法处理冲突:
# Get player input
def get_player_input(self):
global do_move, player_speed_y, player_speed_x
do_move = True
key = pygame.key.get_pressed()
if key[pygame.K_d] and do_move:
self.player.move_ip(player_speed_x, 0)
self.pos_0_x = self.player.x + player_speed_x
elif key[pygame.K_a] and do_move:
self.player.move_ip(-player_speed_x, 0)
self.pos_0_x = self.player.x - player_speed_x
elif key[pygame.K_s] and do_move:
self.player.move_ip(0, player_speed_y)
self.pos_0_y = self.player.y + player_speed_y
elif key[pygame.K_w] and do_move:
self.player.move_ip(0, -player_speed_y)
self.pos_0_y = self.player.y - player_speed_y
# Get collisions with the player on x
def collisions_x(self):
global do_move, player_speed_x
self.map_gen()
for sprite in self.tiles.sprites():
if sprite.rect.colliderect(self.player):
if self.player.x > self.pos_0_x: # Check if player is colliding on his left side
do_move = False
self.player.x = self.player.x + 1
self.player.y = self.pos_0_y
if self.player.x < self.pos_0_x: # Check if player is colliding on his right side
do_move = False
self.player.x = self.player.x - 1
self.player.y = self.pos_0_y
# Get collisions with the player on y
def collisions_y(self):
global do_move, player_speed_y
self.map_gen()
for sprite in self.tiles.sprites():
if sprite.rect.colliderect(self.player):
if self.player.y < self.pos_0_y: # Check if player is colliding on his bottom side
do_move = False
player_speed_y = 0
self.player.y = self.player.y - 1
if self.player.y > self.pos_0_y: # Check if player is colliding on his top side
do_move = False
self.player.y = self.player.y + 1
# Put the player on the screen
def update_player(self, surface):
self.get_player_input()
self.collisions_x()
self.collisions_y()
pygame.draw.rect(WIN, (200, 0, 0), self.player)
【问题讨论】:
-
...太多代码...阅读minimal reproducible example和edit到How to Ask。
-
建议,我刚刚编辑了帖子并仅粘贴了与碰撞有关的部分代码。