PyGame pygame.sprite.collide_mask 检测到没有碰撞?
PyGame pygame.sprite.collide_mask detects no collision?
我正在尝试构建一个简单版本的 Flappy Bird。为了检测我的圆圈(Flappy Bird)和我的矩形(Pipes)之间的碰撞,我使用了 pygame.sprite.collide_rect() 但我想要一种更好的处理碰撞的方法。
但是使用遮罩碰撞导致检测不到碰撞。圆直接穿过矩形就好像它不存在一样。
这是我的代码:
bird_group = pygame.sprite.Group()
pipe_group = pygame.sprite.Group()
class Bird(pygame.sprite.Sprite):
def __init__(self, x_loc, y_loc, velocity):
super(Bird, self).__init__()
self.velocity = velocity
self.x_loc = x_loc
self.y_loc = y_loc
self.image = pygame.image.load(os.path.join(game_folder,"index2.png")).convert()
self.image.set_colorkey(WHITE)
self.image = pygame.transform.scale(self.image,(60,65))
self.rect = self.image.get_rect()
self.rect.center = (x_loc,y_loc)
def update(self):
self.rect.y += self.velocity
self.velocity = self.velocity+1
self.mask = pygame.mask.from_surface(self.image)
def jump(self):
self.velocity = -10
def boundary_collison(self):
if self.rect.bottom+100>=display_height or self.rect.top<=0:
return True
class UpperPipe(pygame.sprite.Sprite):
"""docstring for UpperPipe"""
def __init__(self, pipe_x, pipe_height, pipe_speed):
super(UpperPipe, self).__init__()
self.pipe_speed = pipe_speed
self.image = pygame.Surface((pipe_width, pipe_height))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = (pipe_x)
self.rect.y = (0)
def update(self):
self.rect.x -= self.pipe_speed
self.mask = pygame.mask.from_surface(self.image)
def x_cord(self):
return self.rect.x
class LowerPipe(pygame.sprite.Sprite):
"""docstring for UpperPipe"""
def __init__(self, pipe_x, pipe_height, pipe_speed):
super(LowerPipe, self).__init__()
self.pipe_speed = pipe_speed
self.image = pygame.Surface((pipe_width, display_height-(pipe_gap+pipe_height)))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = (pipe_x)
self.rect.y = (pipe_height+pipe_gap)
def update(self):
self.rect.x -= self.pipe_speed
self.mask = pygame.mask.from_surface(self.image)
def x_cord(self):
return self.rect.x
我用来制作精灵的以下代码:
bird = Bird(x_loc,y_loc,velocity)
bird_group.add(bird)
pipe_list = []
init_pipe_x = 500
for make in range(pipe_count):
pipe_x = init_pipe_x+((between_pipe+pipe_width)*make)
pipe_height = (round(random.uniform(0.2,0.8), 2))*(display_height-pipe_gap)
upper = UpperPipe(pipe_x,pipe_height,pipe_speed)
lower = LowerPipe(pipe_x,pipe_height,pipe_speed)
add_pipe = [upper,lower]
pipe_list.append(add_pipe)
pipe_group.add(upper)
pipe_group.add(lower)
为了在我的游戏循环中进行检测,我使用以下代码:
bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False,pygame.sprite.collide_mask)
if bird_hits:
gameExit = True
您还没有在 class 中定义任何 collide_mask :类似于
self.mask = pygame.mask.from_surface(image)
因此,如果您的上管道和下管道的矩形对应于这些的 hitbix:只需使用
bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False)
或在您的 class
中创建一个 self.mask 以使用
bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False,pygame.sprite.collide_mask)
您传递给 mask.from_surface
的 pygame.Surface
必须具有 Alpha 通道。这意味着您要么必须调用曲面的 convert_alpha
or the set_colorkey
方法。
class UpperPipe(pygame.sprite.Sprite):
def __init__(self, pipe_x, pipe_height, pipe_speed):
super(LowerPipe, self).__init__()
self.pipe_speed = pipe_speed
# Either call `convert_alpha` ...
self.image = pygame.Surface((pipe_width, display_height-(pipe_gap+pipe_height))).convert_alpha()
self.image.fill(GREEN)
# ... or call `set_colorkey`.
# I think surfaces converted with convert_alpha are blitted faster.
# self.image.set_colorkey((0, 0, 0))
# You also don't have to create the mask repeatedly in the
# update method. Just call it once in the __init__ method.
self.mask = pygame.mask.from_surface(self.image)
我正在尝试构建一个简单版本的 Flappy Bird。为了检测我的圆圈(Flappy Bird)和我的矩形(Pipes)之间的碰撞,我使用了 pygame.sprite.collide_rect() 但我想要一种更好的处理碰撞的方法。
但是使用遮罩碰撞导致检测不到碰撞。圆直接穿过矩形就好像它不存在一样。
这是我的代码:
bird_group = pygame.sprite.Group()
pipe_group = pygame.sprite.Group()
class Bird(pygame.sprite.Sprite):
def __init__(self, x_loc, y_loc, velocity):
super(Bird, self).__init__()
self.velocity = velocity
self.x_loc = x_loc
self.y_loc = y_loc
self.image = pygame.image.load(os.path.join(game_folder,"index2.png")).convert()
self.image.set_colorkey(WHITE)
self.image = pygame.transform.scale(self.image,(60,65))
self.rect = self.image.get_rect()
self.rect.center = (x_loc,y_loc)
def update(self):
self.rect.y += self.velocity
self.velocity = self.velocity+1
self.mask = pygame.mask.from_surface(self.image)
def jump(self):
self.velocity = -10
def boundary_collison(self):
if self.rect.bottom+100>=display_height or self.rect.top<=0:
return True
class UpperPipe(pygame.sprite.Sprite):
"""docstring for UpperPipe"""
def __init__(self, pipe_x, pipe_height, pipe_speed):
super(UpperPipe, self).__init__()
self.pipe_speed = pipe_speed
self.image = pygame.Surface((pipe_width, pipe_height))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = (pipe_x)
self.rect.y = (0)
def update(self):
self.rect.x -= self.pipe_speed
self.mask = pygame.mask.from_surface(self.image)
def x_cord(self):
return self.rect.x
class LowerPipe(pygame.sprite.Sprite):
"""docstring for UpperPipe"""
def __init__(self, pipe_x, pipe_height, pipe_speed):
super(LowerPipe, self).__init__()
self.pipe_speed = pipe_speed
self.image = pygame.Surface((pipe_width, display_height-(pipe_gap+pipe_height)))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = (pipe_x)
self.rect.y = (pipe_height+pipe_gap)
def update(self):
self.rect.x -= self.pipe_speed
self.mask = pygame.mask.from_surface(self.image)
def x_cord(self):
return self.rect.x
我用来制作精灵的以下代码:
bird = Bird(x_loc,y_loc,velocity)
bird_group.add(bird)
pipe_list = []
init_pipe_x = 500
for make in range(pipe_count):
pipe_x = init_pipe_x+((between_pipe+pipe_width)*make)
pipe_height = (round(random.uniform(0.2,0.8), 2))*(display_height-pipe_gap)
upper = UpperPipe(pipe_x,pipe_height,pipe_speed)
lower = LowerPipe(pipe_x,pipe_height,pipe_speed)
add_pipe = [upper,lower]
pipe_list.append(add_pipe)
pipe_group.add(upper)
pipe_group.add(lower)
为了在我的游戏循环中进行检测,我使用以下代码:
bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False,pygame.sprite.collide_mask)
if bird_hits:
gameExit = True
您还没有在 class 中定义任何 collide_mask :类似于
self.mask = pygame.mask.from_surface(image)
因此,如果您的上管道和下管道的矩形对应于这些的 hitbix:只需使用
bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False)
或在您的 class
中创建一个 self.mask 以使用
bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False,pygame.sprite.collide_mask)
您传递给 mask.from_surface
的 pygame.Surface
必须具有 Alpha 通道。这意味着您要么必须调用曲面的 convert_alpha
or the set_colorkey
方法。
class UpperPipe(pygame.sprite.Sprite):
def __init__(self, pipe_x, pipe_height, pipe_speed):
super(LowerPipe, self).__init__()
self.pipe_speed = pipe_speed
# Either call `convert_alpha` ...
self.image = pygame.Surface((pipe_width, display_height-(pipe_gap+pipe_height))).convert_alpha()
self.image.fill(GREEN)
# ... or call `set_colorkey`.
# I think surfaces converted with convert_alpha are blitted faster.
# self.image.set_colorkey((0, 0, 0))
# You also don't have to create the mask repeatedly in the
# update method. Just call it once in the __init__ method.
self.mask = pygame.mask.from_surface(self.image)