Неправильное обнаружение столкновения - PullRequest
0 голосов
/ 27 февраля 2019

Я создал объект «персонаж» и группу «блок». Я позволил объекту «персонаж» двигаться плавно. Я бы хотел, чтобы «персонаж» не перекрывался с «блоком». Текущая блокировка столкновений работает следующим образом:Объект «персонаж» может перекрываться с объектом «блок», но если ключ отпущен, «символ» выйдет из «блока».Я хотел бы исправить это

# 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 голосов
/ 28 февраля 2019

Исходя из того, что вы описываете (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, обновление экрана и , затем проверка на столкновение.Это показывает, что Character временно перекрывает Block.

. Один из способов исправить это - проверить наличие коллизий в Character.update().Так, если, скажем, перемещение X пикселей вверх приведет к столкновению, только переместите доступное количество пикселей и установите self.moving_up = False.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...