在pygame中掩盖多个相同相同生物的问题

时间:2018-08-30 06:25:40

标签: python pygame

如标题中所述,

我在掩盖相同图像时遇到问题。

#initalising the masks
Invader1= pygame.image.load('Space_invaders_character_1_1.png').convert_alpha()

Invader1= pygame.transform.scale(Invader11, (40,30))

Invader1_mask = pygame.mask.from_surface(Invader11)
Invader1_mask= Invader11_mask.scale((70,40))

Invader2= pygame.image.load('Space_invaders_character_2_1.png').convert_alpha()
Invader2= pygame.transform.scale(Invader21, (40,30))
Invader2_mask = pygame.mask.from_surface(Invader21)
Invader2_mask= Invader11_mask.scale((70,40))
Invader3= pygame.image.load('Space_invaders_character_3_1.png').convert_alpha()
Invader3= pygame.transform.scale(Invader31, (40,30))
Invader3_mask = pygame.mask.from_surface(Invader31)
Invader3_mask= Invader11_mask.scale((70,40))


#drawing characters
def drawEnemies (invX,invY):
    for num in range (1,11):
        invX = invX + 50
        gameDisplay.blit(Invader32, (invX,invY))
        gameDisplay.blit(Invader32, (invX,invY-50))
        gameDisplay.blit(Invader22, (invX,invY-100))
        gameDisplay.blit(Invader22, (invX,invY-150))
        gameDisplay.blit(Invader12, (invX, invY -200))
while lives > 0:
    offset = (bulletX -invX, bulletY - invY)
    result = Invader11_mask.overlap(bullet_mask, offset)

这当然不是我的全部代码,但是,我希望您明白我正在尝试做的事情。本质上,我试图循环创建一个特定的入侵者(是从太空入侵者那里获得的),但是,这些面具不是与其他入侵者一起创建的,还是没有移动。有人可以帮帮我吗? 谢谢。

1 个答案:

答案 0 :(得分:2)

对您的问题的有意义的答案是立即停止您的工作,并开始将SpriteGroup类与collide_mask函数一起使用。

您不想为游戏中的每个事物创建多个全局变量。您需要类的实例(通常使用Sprite),并将它们添加到列表中(通常是Group)。

因此,为入侵者创建一个继承自Sprite的类,并为他们提供一个mask属性,如下所示:

class Invader(pygame.spriteSprite):
    def __init__(self, image, pos):
        super().__init__()
        self.image = image
        self.rect = image.get_rect(topleft=pos)
        self.mask = pygame.mask.from_surface(image)

    def update(self):
        pass # handle movement

为子弹创建Group,为入侵者创建一个pygame.sprite.groupcollide(bullets, invaders, True, True, pygame.sprite.collide_mask) ,然后可以使用以下方法检查碰撞情况:

f <- function(x, ...) {
    return(
        as.list(substitute(list(...)))[-1]
    )
}

err <- f(x = 0, y = 10,)   #have a closer look --> str(err)

#$`y`
#[1] 10
# 
#[[2]]

fine<- f(x = 0, y = 10)

#$`y`
#[1] 10