我需要获取在两组之间碰撞的最后一个精灵的位置。组中的所有精灵都具有相同的名称。这是精简代码:
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循环,如果你还有另外一种方法,我觉得不对,请告诉我。
答案 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)
这是你可以做到的另一种方式。
查看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)