Итак, я пытаюсь выяснить, нет ли каких-либо столкновений между sprite
и каким-либо объектом в определенной группе.Я использовал 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
, я могу использовать столкновение _hit_rect()
, и оно правильно использует sprite
'.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
или что еще это может быть?