首页 > 解决方案 > 自定义 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吗?或者它可能是什么?

标签: pythonpygame

解决方案


的位置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

推荐阅读