python - 自定义 spritecollide 碰撞箱
问题描述
因此,我试图查看 asprite
和特定组中的任何对象之间是否存在任何冲突。我使用sprite.spritecollide
的是这个 pygame 方法所做的,但我想对hitboxes
对象使用自定义而不是它们的.rect
hitboxes
.
def collide_hit_rect(one, two):
return one.hit_rect.colliderect(two.rect)
def collide_hit_rect_two(one, two):
return one.hit_rect.colliderect(two.hit_rect)
class Player(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = game.player_img
self.rect = self.image.get_rect()
self.hit_rect = PLAYER_HIT_RECT
self.hit_rect.center = self.rect.center
self.vel = vec(0, 0)
self.pos = vec(x+0.5, y+0.5) * TILESIZE
self.rot = 0
class Door(pg.sprite.Sprite):
def __init__(self, game, x, y, side):
rotation = ['R', 'U', 'L', 'D']
self.groups = game.all_sprites, game.doors
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.side = side
angle = rotation.index(self.side)*90
self.image = game.door_img
self.image = pg.transform.rotate(self.image, angle)
self.rect = self.image.get_rect()
if side == rotation[0]:
self.hit_rect = pg.Rect(36, 0, 28, 64)
elif side == rotation[1]:
self.hit_rect = pg.Rect(0, 0, 64, 28)
elif side == rotation[2]:
self.hit_rect = pg.Rect(0, 0, 28, 64)
elif side == rotation[3]:
self.hit_rect = pg.Rect(0, 36, 64, 28)
self.x = x
self.y = y
self.rect.x = self.x * TILESIZE
self.rect.y = self.y * TILESIZE
现在,当我想检查玩家和对象之间的碰撞时rect
,我可以使用 collide
_hit_rect()
,它正确地使用sprite
's.hit_rect
和对象.rect
而不是.rect
两者,例如
hits = pg.sprite.spritecollide(sprite, group, False, collide_hit_rect)
但是,当想要使用它们的.hit_rect
而不是检查门和玩家之间的碰撞时.rect
,这不起作用并且它永远不会识别碰撞。
hits = pg.sprite.spritecollide(sprite, group, False, collide_hit_rect_two)
我的门类有什么问题hitbox
吗?或者它可能是什么?
解决方案
的位置self.rect
设置在 Door 的构造函数末尾:
self.rect.x = self.x * TILESIZE self.rect.y = self.y * TILESIZE
但是 的位置self.hit_rect
永远不会设置并且始终在 (0, 0) 附近。设置 的位置self.hit_rect
,方法与使用 相同self.rect
:
self.hit_rect.x = self.x * TILESIZE
self.hit_rect.y = self.y * TILESIZE