如何在我的 pygame 游戏中检测 Hitbox 并获得它的输出?

How can I detect hitbox in my pygame game and get an output for it?

我有我的代码。

#Player Spawn
player = Player()  # spawn player
player.rect.y = 0  # go to y
player_list = pygame.sprite.Group()
player_list.add(player)


#Asteoriden spawn
enemy = Enemy()
enemy.rect.y = 150
enemy.rect.x = 1000
enemy_list = pygame.sprite.Group()
enemy_list.add(enemy)



running = True


while running:
    pygame.display.update()
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()

        #more code


        for player in player_list:
            if player.rect.colliderect(enemy):
                print("hit")

    win.blit(bg, (0,0))
    player.update()
    enemy.update()
    enemy_list.draw(win)
    player_list.draw(win)
    pygame.display.flip()

Player () 和 Enemy () 是 类 我的应该碰撞的对象。但是如果我 运行 现在的代码会显示很多 'hit' 但我只想显示一个 'hit' 。我的整个控制台都是'hit'。如果我以后想用一个函数替换 'hit',它会 运行 比它应该的更频繁。

将碰撞存储在列表中:

collisions = []

每当敌人击中玩家时,将敌人和玩家的元组保存在列表中。当敌人和玩家不再命中时移除元组。当敌人和玩家发生碰撞但玩家和敌人的元组不在列表中时,只需打印“命中”(或调用函数)。这意味着敌人和玩家刚刚击中但之前没有击中:

while running:
    # [...]

    for enemy in enemy_list:
        for player in player_list:
        
            if player.rect.colliderect(enemy):
            
                if not (player, enemy) in collisions:
                    collisions.append((player, enemy))
                    print("hit") 
                    
            else:
               
                if (player, enemy) in collisions:
                    collisions.remove((player, enemy))

    # [...]