Pygame如何修改spritecollide逻辑使用自定义hitbox进行碰撞检测
解决方案
pygame的sprite.spritecollide函数支持通过第四个参数collided自定义碰撞判定规则,你只需要按如下两步修改即可:
- 第一步:给
spritecollide传入自定义碰撞回调,指定检测时使用被碰撞精灵的hitbox属性参与计算 - 第二步:后续碰撞位移逻辑中所有用到
i.rect的位置替换为i.hitbox
修改后的完整代码如下:
def collide_blocks(self, direction): # 自定义碰撞回调:参数是两个精灵a和b,返回是否碰撞 # 这里a是当前玩家精灵,b是组内的block精灵,使用b的hitbox参与碰撞检测 def hitbox_collide(a, b): return a.rect.colliderect(b.hitbox) # 新增第四个参数指定自定义碰撞规则 hits = pygame.sprite.spritecollide(self, self.game.block_objects, False, hitbox_collide) if hits: for i in hits: if direction == "x": if self.x_change > 0: self.rect.x = i.hitbox.left - self.rect.width if self.x_change < 0: self.rect.x = i.hitbox.right if direction == "y": if self.y_change > 0: self.rect.y = i.hitbox.top - self.rect.height if self.y_change < 0: self.rect.y = i.hitbox.bottom
如果你希望玩家侧也使用自定义的self.hitbox参与碰撞判定,只需要修改回调函数里的a.rect为a.hitbox即可:
def hitbox_collide(a, b): return a.hitbox.colliderect(b.hitbox)
内容的提问来源于stack exchange,提问作者William Redding
相关产品推荐
相关产品推荐

