我如何在 pygame 中进行碰撞检测?

How do I do collision-detection in pygame?

我最近一直在写这段代码,我想要碰撞检测,但我以前从未做过,我需要帮助。这段代码是用 python 和 pygame 编写的,所以它应该很简单,但我不确定我是否应该将整个世界作为透明图像

import pygame, os, itertools
from pygame.locals import *

w = 640
h = 480
pink = (0,179,179)
player_x = 39
player_y = 320

def setup_background():
    screen.fill((pink))
    screen.blit(playerImg, (player_x,player_y))
    screen.blit(brick_tile, (0,0))
    pygame.display.flip()

pygame.init()
screen = pygame.display.set_mode((w, h))
clock = pygame.time.Clock()
playerImg = pygame.image.load('img/player.png').convert_alpha()
brick_tile = pygame.image.load('img/map.png').convert_alpha()

class Player(pygame.sprite.Sprite):
    allsprites = pygame.sprite.Group()
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load('img/player.png')
        self.rect = self.image.get_rect()

class World(pygame.sprite.Sprite):
    allsprites = pygame.sprite.Group()
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load('img/map.png')
        self.rect = self.image.get_rect()

player = Player()
world = World()
done = False
while not done:
    setup_background()
    block_hit_list = pygame.sprite.spritecollide(player, world.allsprites, True)

    for world in block_hit_list:
        print("WORKING")
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == K_RIGHT:
                player_x += 5

您的 sprite 碰撞检测几乎完成,但不正确。您似乎在这一行中了解此概念的基础知识:

block_hit_list = pygame.sprite.spritecollide(player, world.allsprites, True) 

您快完成了,但这是您的操作方法。在 pygame.sprite.spritecollide() 函数中,您需要 sprite 的名称、另一个 sprite 的组名称,以及 TrueFalse。在你的情况下,你只需要为你的世界做一个组(假设你想要那个顺序的东西):

world_group = pygame.sprite.Group(world)

这一行对于您的检测代码是必需的,并且将使该 sprite 被删除。如果你想向该组添加另一个世界,那么你有很多世界,如果你想这样做并在它周围添加一些代码:

world_group.add(world)

add() 函数将向该组添加一个精灵。如果有必要,我建议你做一个循环来制作很多。现在进入碰撞代码!
现在我们已准备好正确执行此功能。我会先删除这一行:

block_hit_list = pygame.sprite.spritecollide(player, world.allsprites, True)

暂时没有必要也没有用。您需要在 while 循环中但在 for 循环之外添加此 if 语句:

if pygame.sprite.spritecollide(player, world_group, x):
    #Do something

为什么我用 x 而不是 TrueFalse?因为那将是你的决定。如果你想在接触后删除组中的精灵,请将 x 替换为 True。如果您不想这样做,请将 x 替换为 False。这些是碰撞检测代码的基础知识,希望对您有所帮助!