Python Pygame 两个精灵之间未检测到碰撞矩形
Python Pygame collision rect not detected between two sprites
我正在制作一款游戏,目前我一直在尝试让玩家与“硬币”“碰撞”。我已经更改了我所有的代码,使它们成为带有 类 的精灵,但它说 类 之一具有“无属性矩形”,这是播放器代码和碰撞代码(对格式感到抱歉,一直在一整天):
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface ((40, 40))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.rect.center = (425), (400)
self.movex = 0 # move along X
self.movey = 0 # move along Y
self.frame = 0 # count frames
def control(self, x, y): # player movement
self.movex += x
self.movey += y
def update(self):
self.rect.x = self.rect.x + self.movex # updating the position
self.rect.y = self.rect.y + self.movey
class Coin(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface ((40, 40))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.center = (random.randint(20, 780)), (random.randint(20, 230))
def check_collision(self, Coin, Player):
if pygame.sprite.collide_rect(Coin, Player):
print("collide")
这是主函数循环:
def main():
score_check = 0
clock = pygame.time.Clock()
run = True
coin = Coin()
PLAYER = Player()
all_sprites = pygame.sprite.Group()
all_sprites.add(coin, PLAYER)
# drawing the layers of sprites
def draw_window():
WIN.fill(BLACK) # background colour
# score drawn
global score_check
score_print = SCORE_FONT.render("Score: " + str(score_check), 1, WHITE)
WIN.blit(score_print, (30, 30))
# displaying the images
all_sprites.update()
all_sprites.draw(WIN)
pygame.display.update()
while run:
# game speed
clock.tick(FPS)
# draw window
draw_window()
for event in pygame.event.get():
# checking quit function is pressed
if event.type == pygame.QUIT:
run = False
pygame.quit()
exit()
coin.check_collision(Coin, Player)
您必须将播放器对象传递给 check_collision
:
删除 Coin
参数:
class Coin(pygame.sprite.Sprite):
# [...]
def check_collision(self, player):
if pygame.sprite.collide_rect(self, player):
print("collide")
在应用程序循环而不是事件循环中调用 check_collision
:
while run:
# game speed
clock.tick(FPS)
# draw window
draw_window()
for event in pygame.event.get():
# checking quit function is pressed
if event.type == pygame.QUIT:
run = False
pygame.quit()
exit()
# INDENTATION
#<--|
coin.check_collision(PLAYER)
我正在制作一款游戏,目前我一直在尝试让玩家与“硬币”“碰撞”。我已经更改了我所有的代码,使它们成为带有 类 的精灵,但它说 类 之一具有“无属性矩形”,这是播放器代码和碰撞代码(对格式感到抱歉,一直在一整天):
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface ((40, 40))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.rect.center = (425), (400)
self.movex = 0 # move along X
self.movey = 0 # move along Y
self.frame = 0 # count frames
def control(self, x, y): # player movement
self.movex += x
self.movey += y
def update(self):
self.rect.x = self.rect.x + self.movex # updating the position
self.rect.y = self.rect.y + self.movey
class Coin(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface ((40, 40))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.center = (random.randint(20, 780)), (random.randint(20, 230))
def check_collision(self, Coin, Player):
if pygame.sprite.collide_rect(Coin, Player):
print("collide")
这是主函数循环:
def main():
score_check = 0
clock = pygame.time.Clock()
run = True
coin = Coin()
PLAYER = Player()
all_sprites = pygame.sprite.Group()
all_sprites.add(coin, PLAYER)
# drawing the layers of sprites
def draw_window():
WIN.fill(BLACK) # background colour
# score drawn
global score_check
score_print = SCORE_FONT.render("Score: " + str(score_check), 1, WHITE)
WIN.blit(score_print, (30, 30))
# displaying the images
all_sprites.update()
all_sprites.draw(WIN)
pygame.display.update()
while run:
# game speed
clock.tick(FPS)
# draw window
draw_window()
for event in pygame.event.get():
# checking quit function is pressed
if event.type == pygame.QUIT:
run = False
pygame.quit()
exit()
coin.check_collision(Coin, Player)
您必须将播放器对象传递给 check_collision
:
删除 Coin
参数:
class Coin(pygame.sprite.Sprite):
# [...]
def check_collision(self, player):
if pygame.sprite.collide_rect(self, player):
print("collide")
在应用程序循环而不是事件循环中调用 check_collision
:
while run:
# game speed
clock.tick(FPS)
# draw window
draw_window()
for event in pygame.event.get():
# checking quit function is pressed
if event.type == pygame.QUIT:
run = False
pygame.quit()
exit()
# INDENTATION
#<--|
coin.check_collision(PLAYER)