我如何在 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 的组名称,以及 True
或 False
。在你的情况下,你只需要为你的世界做一个组(假设你想要那个顺序的东西):
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
而不是 True
或 False
?因为那将是你的决定。如果你想在接触后删除组中的精灵,请将 x
替换为 True
。如果您不想这样做,请将 x
替换为 False
。这些是碰撞检测代码的基础知识,希望对您有所帮助!
我最近一直在写这段代码,我想要碰撞检测,但我以前从未做过,我需要帮助。这段代码是用 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 的组名称,以及 True
或 False
。在你的情况下,你只需要为你的世界做一个组(假设你想要那个顺序的东西):
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
而不是 True
或 False
?因为那将是你的决定。如果你想在接触后删除组中的精灵,请将 x
替换为 True
。如果您不想这样做,请将 x
替换为 False
。这些是碰撞检测代码的基础知识,希望对您有所帮助!