如果您想要缩放的碰撞矩形/点击框,则需要给精灵一个第二矩形(我hit@R_166_2419@
在这里称呼它)。您必须这样做,因为pygame会在的左上角坐标处涂抹图像/表面self.rect
。因此,第一个rectself.rect
用作blit位置,并且self.hit@R_166_2419@
用于碰撞检测。
您还需要为碰撞检测定义一个自定义的回调函数,您必须将其pygame.sprite.spritecollide
作为第四个参数传递给该函数。
def collided(sprite, other):
"""Check if the `hit@R_166_2419@` rects of the two sprites collide."""
return sprite.hit@R_166_2419@.colliderect(other.hit@R_166_2419@)
collided_sprites = pg.sprite.spritecollide(player, enemies, False, collided)
这是一个完整的示例(self.rect
s是绿色矩形,self.hit@R_166_2419@
es是红色矩形):
import pygame as pg
from pygame.math import Vector2
class Entity(pg.sprite.Sprite):
def __init__(self, pos, *groups):
super().__init__(*groups)
self.image = pg.Surface((70, 50))
self.image.fill((0, 80, 180))
self.rect = self.image.get_rect(center=pos)
# A inflated copy of the rect as the hit@R_166_2419@.
self.hit@R_166_2419@ = self.rect.inflate(-42, -22)
self.vel = Vector2(0, 0)
self.pos = Vector2(pos)
def update(self):
self.pos += self.vel
self.rect.center = self.pos
self.hit@R_166_2419@.center = self.pos # Also update the hit@R_166_2419@ coords.
def collided(sprite, other):
"""Check if the hit@R_166_2419@es of the two sprites collide."""
return sprite.hit@R_166_2419@.colliderect(other.hit@R_166_2419@)
def main():
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
all_sprites = pg.sprite.Group()
player = Entity((300, 200), all_sprites)
enemies = pg.sprite.Group(
Entity((100, 250), all_sprites),
Entity((400, 300), all_sprites),
)
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.MOUSEMOTION:
player.pos = event.pos
all_sprites.update()
# Pass the custom collided callback function to spritecollide.
collided_sprites = pg.sprite.spritecollide(
player, enemies, False, collided)
for sp in collided_sprites:
print('Collision', sp)
screen.fill((30, 30, 30))
all_sprites.draw(screen)
for sprite in all_sprites:
# Draw rects and hit@R_166_2419@es.
pg.draw.rect(screen, (0, 230, 0), sprite.rect, 2)
pg.draw.rect(screen, (250, 30, 0), sprite.hit@R_166_2419@, 2)
pg.display.flip()
clock.tick(30)
if __name__ == '__main__':
pg.init()
main()
pg.quit()