Python - Pygame - 为什么没有检测到碰撞?
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 中的精灵碰撞基于精灵的 rect
成员。
因此给定两个精灵,代码将检查 sprite1.rect
与 sprite2.rect
是否重叠 co-ordinates。
精灵的 self.rect
需要在移动时更新 x
和 y
co-ordinates,以便它反映任何 on-screen 移动位图。
据我从 OP 的代码中得知,rect.x
和 rect.y
没有更新,所以比较永远只是在 0,0
,永远。
要使用掩蔽碰撞,精灵还需要定义 .mask
图像,这可以很容易地从具有透明度的图像生成:
self.mask = pygame.mask.from_surface( self.image )
据我所知,OP 中的精灵代码不 包含遮罩,因此pygame.sprite.collide_mask()
将不起作用。
这是一个精灵示例 class:
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
显然 bitmap 参数需要有一定的透明度,否则遮罩是 CPU.
的无意义浪费
我有 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 中的精灵碰撞基于精灵的 rect
成员。
因此给定两个精灵,代码将检查 sprite1.rect
与 sprite2.rect
是否重叠 co-ordinates。
精灵的 self.rect
需要在移动时更新 x
和 y
co-ordinates,以便它反映任何 on-screen 移动位图。
据我从 OP 的代码中得知,rect.x
和 rect.y
没有更新,所以比较永远只是在 0,0
,永远。
要使用掩蔽碰撞,精灵还需要定义 .mask
图像,这可以很容易地从具有透明度的图像生成:
self.mask = pygame.mask.from_surface( self.image )
据我所知,OP 中的精灵代码不 包含遮罩,因此pygame.sprite.collide_mask()
将不起作用。
这是一个精灵示例 class:
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
显然 bitmap 参数需要有一定的透明度,否则遮罩是 CPU.
的无意义浪费