Pygame 中与敌人的碰撞检测仅在特定情况下有效

问题描述 投票:0回答:0

我有一个基本的 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()

pygame collision-detection
© www.soinside.com 2019 - 2024. All rights reserved.