获取碰撞精灵的位置

时间:2015-08-06 09:04:48

标签: python pygame sprite

我需要获取在两组之间碰撞的最后一个精灵的位置。组中的所有精灵都具有相同的名称。这是精简代码:

    rmog = pygame.sprite.Group()
    rmg = pygame.sprite.Group()


    class rmissileh(pygame.sprite.Sprite):

        def __init__(self, image, speed):
             pygame.sprite.Sprite.__init__(self)
             self.speed = -10
             self.speedx = 0
             self.image = redm
             self.rect = image.get_rect().move(s.rect.x+26,s.rect.y)


        def move(self):

             self.rect = self.rect.move(self.speedx, self.speed)redshot = 

rmissileh(redm, -10 )
rmg.add(redshot)


    class crmonstre(pygame.sprite.Sprite):
        def __init__(self, image, speed):
            pygame.sprite.Sprite.__init__(self)


            self.speedy = 2
            self.speedx = 1
            self.image = rmonstre
            self.step = 600
            self.rect = rmonstre.get_rect().move(500,-100)
        def move(self):
            self.rect = self.rect.move(self.speedx,self.speedy)

redmonstre = crmonstre(rmonstre,1)
rmog.add(redmonstre)
redmonstre = crmonstre(rmonstre,1)
rmog.add(redmonstre)
redmonstre = crmonstre(rmonstre,1)# I added only three but there is many more overtime.
rmog.add(redmonstre)
while stop:

            for event in pygame.event.get():
                if event.type ==pygame.QUIT:
                    stop = False
            for redmonstre in rmog:
                fenetre.blit(fond, redmonstre.rect, redmonstre.rect)
                redmonstre.move()
                fenetre.blit(redmonstre.image,redmonstre.rect)

            if pygame.sprite.groupcollide(rmg, rmog,True ,True):
                fenetre.blit(fond, (0,0))
            pygame.display.update()
pygame.quit()
quit

正如你所看到的,当一个redmonster与一个redshot碰撞时,我必须对整个背景进行blit(名为"喜欢")因为我不知道他的位置,如果我打印(redmonstre.rect .x)将打印我创建的最后一个对象的x位置,而不是碰撞的对象的位置。 并且在while循环中blit移动对象我做:

for redmonstre in rmog:
    fenetre.blit(fond, redmonstre.rect, redmonstre.rect)
    redmonstre.move()
    fenetre.blit(redmonstre.image,redmonstre.rect)

我的代码中有许多for循环,如果你还有另外一种方法,我觉得不对,请告诉我。

1 个答案:

答案 0 :(得分:0)

我不知道如何找到只是最后一次碰撞。但是你可以找到所有的碰撞,希望这是朝着正确方向迈出的一步。

有两种方法可以做到这一点。第一种方法是自己遍历精灵列表。这看起来有点像这样:

for sprite in rmg:
    #Note that spritecollide will remove every sprite that collides from 
    #rmog, but it will not remove 'sprite' from rmg. 
    if (pygame.sprite.spritecollide(sprite, rmog, True)):
        print (sprite.x)
        rmg.remove(sprite)

spritecollide docs.

这是你可以做到的另一种方式。

查看pygame.sprite.groupcollide.的文档您将看到它返回所有碰撞的字典。字典将组1中的所有精灵(即rmg)作为键,每个键的值将是与组2碰撞的每个精灵的列表(即rmog)。那么为了找到从第一组冲突的每个精灵,你可以这样做:

dict = pygame.sprite.groupcollide(rmg, rmog,True ,True)
for sprite in dict:
    if dict[sprite]:
        print (sprite.x)

此外,还有一些与您的问题无关的一般提示,

不要这样做:

redmonstre = crmonstre(rmonstre,1)
rmog.add(redmonstre)
redmonstre = crmonstre(rmonstre,1)
rmog.add(redmonstre)
redmonstre = crmonstre(rmonstre,1)
rmog.add(redmonstre)

没有必要为每个redmonstre都有一个名称,只会让它们全部命名相同会让它更加混乱。相反,只需将它们直接添加到列表中:

rmog.add(crmonstre(rmonstre, 1))
rmog.add(crmonstre(rmonstre, 1))
rmog.add(crmonstre(rmonstre, 1))

不要这样做:

for redmonstre in rmog:
    fenetre.blit(fond, redmonstre.rect, redmonstre.rect)
    redmonstre.move()
    fenetre.blit(redmonstre.image,redmonstre.rect)
Blding“喜欢”需要(相对)长时间。如果你为每个redmonstre blit它,你只会看到最后一个。只需在循环之前进行一次blit。

fenetre.blit(fond, redmonstre.rect, redmonstre.rect)

for redmonstre in rmog:
    redmonstre.move()
    fenetre.blit(redmonstre.image,redmonstre.rect)