错误的碰撞检测

时间:2019-02-27 17:07:22

标签: python pygame

我创建了一个“字符”对象和一个“块”组 我使“字符”对象可以平滑移动 我希望“字符”不与“块”重叠当前碰撞阻止的工作方式如下:“字符”对象可能与“块”对象重叠,但是如果释放键,“字符”将退出“块” ”。我想修复它

# an object that can move
class Character():
    def __init__(self, screen, ai_settings):
        self.screen = screen
        self.ai_settings = ai_settings
        self.screen_rect = screen.get_rect()

        self.image = pygame.image.load('images/character.bmp')
        self.rect = self.image.get_rect()

        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom

        self.moving_up = False
        self.moving_down = False
        self.moving_left = False
        self.moving_right = False

    def update(self):
        if self.moving_up:
            self.rect.y -= self.ai_settings.CHARACTER_SPEED_FACTOR
        if self.moving_down:
            self.rect.y += self.ai_settings.CHARACTER_SPEED_FACTOR
        if self.moving_left:
            self.rect.x -= self.ai_settings.CHARACTER_SPEED_FACTOR
        if self.moving_right:
            self.rect.x += self.ai_settings.CHARACTER_SPEED_FACTOR

class Block(Sprite):
    def __init__(self, screen, x, y):
        super().__init__()
        self.screen = screen

        self.image = pygame.image.load('images/block.bmp')
        self.rect = self.image.get_rect()

        self.rect.x = x
        self.rect.y = y

尝试撞块

def check_keydown_events(event, character, blocks):
    if event.key == pygame.K_UP:
        #Start up smoothly moving up
        character.moving_up = True

        for block in blocks:
            if character.rect.colliderect(block.rect):
                character.rect.top = block.rect.bottom
        #Attempt to block a collision

完整代码:https://github.com/Deweri/IncompleateMaze

1 个答案:

答案 0 :(得分:0)

根据您的描述(Character精灵在检测到冲突之前最终重叠了Block),看来问题出在Character的步进运动上。

查看代码:

class Character( ... ):

    def update(self):
        if self.moving_up:
            self.rect.y -= self.ai_settings.CHARACTER_SPEED_FACTOR
        ...

运动只是应用self.ai_settings.CHARACTER_SPEED_FACTOR的变化量,更新屏幕,然后 then 检查碰撞。这显示Character暂时与Block重叠。

解决此问题的一种方法是检查Character.update()中的冲突。因此,如果说向上移动 X 个像素会导致碰撞,则仅移动可用像素数量,然后设置self.moving_up = False

相关问题