[英]Python - Pygame - why no collisions are detected?
我有2个精灵,每个精灵都在不同的pygame.sprite.Group()中,并具有rect.x和rect.y。 但是,当我尝试检测它们之间的冲突时,没有任何结果。 除了使用pygame.sprite.collide_mask之外,它仅检测第一个碰撞,而不检测其他碰撞。 尽管精灵在屏幕上发生了碰撞。 测试冲突的函数是线程。 我已经尝试了pygame碰撞的许多功能,例如pygame.sprite.collide_mask,pygame.sprite.spritecollideany()、。 。 。没有结果。
当我打印这些组的每个子画面的自身时,它打印出它们都是子画面:
<attack1 sprite(in 1 groups)>
测试碰撞的主要代码:
class attack1(pygame.sprite.Sprite,threading.Thread):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
threading.Thread.__init__(self)
self.image = self.imageAttack1.get_image(503 ,468 ,20 ,19)
self.image = pygame.transform.scale(self.image,(60,57)).convert_alpha()
self.lsAttack1.append(self.image)
self.rect = self.image.get_rect()
self.rect.y = 0
self.rect.x = 0
vr.spriteGroupAttack1.add(self)
self.start()
def run(self):
while vr.managementDisplay :
self.result = pygame.sprite.spritecollide(self,vr.spriteGroupCaracter1,False)
if self.result :
print('Yes')
或与团体:
def run(self):
while vr.managementDisplay :
self.result = pygame.sprite.groupcollide(vr.spriteGroupAttack1,vr.spriteGroupCaracter1,False)
if self.result :
print('Yes')
或与pygame.sprite.collide_mask
def run(self):
while vr.managementDisplay :
self.result = pygame.sprite.collide_mask(self,vr.lsCaracter[0])
if self.result :
print('Yes')
预期结果是检测到碰撞。
PyGame中的Sprite碰撞基于Sprite的rect
成员。
因此,给定两个精灵,代码将对照sprite1.rect
检查sprite1.rect
sprite2.rect
存在重叠坐标。
Sprite的self.rect
需要在移动时更新其x
和y
坐标,以使其反映位图在屏幕上的任何移动。
据我从OP的代码可以看出, rect.x
和rect.y
不会更新,因此比较永远永远是0,0
。
要使用蒙版碰撞,精灵还需要定义.mask
图像,可以很容易地从具有透明性的图像生成该图像:
self.mask = pygame.mask.from_surface( self.image )
据我所知,OP中的Sprite代码不包含掩码,因此pygame.sprite.collide_mask()
将不起作用。
这是一个示例精灵类:
class MaskedSprite( pygame.sprite.Sprite ):
def __init__( self, bitmap ):
pygame.sprite.Sprite.__init__( self )
self.image = bitmap
self.mask = pygame.mask.from_surface( self.image )
self.rect = self.image.get_rect()
self.rect.x = random.randrange( 0, WINDOW_WIDTH )
self.rect.y = random.randrange( 0, WINDOW_HEIGHT ) )
def moveTo( self, x, y ):
self.rect.x = x
self.rect.y = y
def update( self ):
pass #TODO
显然, 位图参数需要具有一定的透明度,否则掩码将毫无意义地浪费CPU。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.