Пользовательские спрайтколлидные хитбоксы - PullRequest
0 голосов
/ 06 февраля 2019

Итак, я пытаюсь выяснить, нет ли каких-либо столкновений между 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 или что еще это может быть?

1 Ответ

0 голосов
/ 06 февраля 2019

Позиция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...