我有一个基本的 Pygame 平台游戏 - 我的第一个 - 有一个玩家和一个敌人(现在只有一个敌人,但会有更多)和盒子。敌人在箱子上来回走动(左、右)。现在,当玩家从上方 1) 或 2) 从后面接触敌人时,即如果玩家和敌人面向同一方向且敌人位于玩家前方,碰撞检测就会起作用。但如果他们面对面碰撞或者敌人从后面接触玩家,程序就会崩溃,甚至退出按钮也不再起作用。
我认为问题出在 Player 类的某个地方,但我不知道是 move 还是 update 函数,还是 check_collision_with_enemy 函数有问题?我尝试对敌人执行一个自己的 check_collision_with_player 函数,但它没有解决问题,我认为 Player 类中的函数应该足够了。我让 Enemy 类中的更新函数在这里可见,但如果有人发现那里有问题。
class Player(Sprite):
def __init__(self, x, y):
super().__init__("p1_walk01.png", x, y)
# lots of variables here...
def check_collision_with_enemy(self, x, y, enemies):
self.rect.move_ip([x, y])
collide_enemy = pygame.sprite.spritecollideany(self, enemies)
self.rect.move_ip([-x, -y])
return collide_enemy
def update(self, boxes, enemies):
hsp = 0 #horizontal speed
collide_boxes = self.check_collision_with_boxes(0, 1, boxes)
collide_enemy = self.check_collision_with_enemy(0, 1, enemies)
on_ground = collide_boxes
#walk animation, jumping and gravity related stuff here (removed)...
self.move(hsp,self.vsp, boxes, enemies) #movement
def move(self, x, y, boxes, enemies):
dx = x #change in horizontal movement
dy = y #change in vertical movement
while self.check_collision_with_boxes(0,dy,boxes):
dy -= numpy.sign(dy)
while self.check_collision_with_boxes(dx,dy,boxes):
dx -= numpy.sign(dx)
while self.check_collision_with_enemy(0,dy,enemies):
dy -= numpy.sign(dy)
while self.check_collision_with_enemy(dx,dy,enemies):
dx -= numpy.sign(dx)
self.rect.move_ip([dx,dy])
class Enemy(Sprite):
def __init__(self, x, y):
super().__init__("enemy_walk01.png", x, y)
self.stand_image = self.image
self.walk_cycle = [pygame.image.load(f"enemy_walk{i:0>2}.png") for i in
range(1, 5)]
self.animation_index = 0
self.facing_left = False
self.speed = 4
self.rect.x = x
self.rect.y = y
self.direction = 1
def update(self):
self.rect.x += self.direction
if self.rect.x <= 0 or self.rect.x >= 200 - self.rect.width:
self.direction *= -1
self.walk_animation()
if self.direction == -1:
self.facing_left = True
if self.direction == 1:
self.facing_left = False
def main():
pygame.init()
bg_img = pygame.image.load("background.png")
bg_img = pygame.transform.scale(bg_img,(700,700))
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
player = Player(300, 400)
enemy = Enemy(100, 375)
enemies = pygame.sprite.Group()
enemies.add(enemy)
running = True
while running:
screen.blit(bg_img,(0,0))
pygame.event.pump()
player.update(boxes, enemies)
player.draw(screen)
for enemy in enemies:
enemy.update()
enemy.draw(screen)
boxes.draw(screen)
pygame.display.flip()
clock.tick(45)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
if __name__ == "__main__":
main()