Как добавить вражеские спрайты, которые следуют за игроком - PullRequest
0 голосов
/ 03 июня 2019

Я чрезвычайно новичок в Pygame и, честно говоря, никогда не узнал об этом (только основы Python), но я должен сделать игру для проекта.

Я пытался добавить вражеский спрайт, ссылаясь на другой вопрос и ответы здесь, но я действительно не знаю, какие коды нужны, что я должен удалить и как я должен изменить коды, чтобы они соответствовали моим собственным изаставить мою игру работать.

Я надеюсь, что кто-то сможет настроить мой код так, чтобы он мог работать.

Это то, что у меня есть для врага.Я знаю, что должно быть добавлено больше кодов, но я не знаю, что и где их добавлять.

class Enemy(object):

    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([20, 20])
        self.image.fill(red)

        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x

    def move(self, player):
        dx, dy = self.rect.x - player.rect.x, self.rect.y - player.rect.y
        dist = math.hypot(dx, dy)
        dx, dy = dx / dist, dy / dist
        self.rect.x += dx * self.speed
        self.rect.y += dy * self.speed

Сейчас игра может работать, но вражеский спрайт отсутствует.Я думал, что должен был добавить эти строки тоже

enemy = Enemy(50, 50)
all_sprite_list.add(enemy)

, но это просто заставляет кучу сообщений об ошибках появляться.Я не знаю, что делать.

1 Ответ

3 голосов
/ 03 июня 2019

Враг должен «знать» стены (так же, как игрока), и враг должен быть определен .speed га:

class Enemy(pygame.sprite.Sprite):

    def __init__(self, x, y, speed, walls):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface([20, 20])
        self.image.fill(red)

        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x

        self.speed = speed # speed of the enemy
        self.walls = walls # walls for the collision test

Определить врага:

enemy = Enemy(500, 500, 1, wall_list)
all_sprite_list.add(enemy)

В вашем коде движение вычисляется в обратном направлении.Инвертировать вычисление вектора движения.
Установить self.move_x и self.move_y в Enemy.move:

class Enemy(pygame.sprite.Sprite):

    # [...]

    def move(self, player):
        dx, dy = player.rect.x - self.rect.x, player.rect.y - self.rect.y
        dist = math.hypot(dx, dy)
        dx, dy = dx / dist, dy / dist
        self.move_x = dx * self.speed
        self.move_y = dy * self.speed

Добавить тест на столкновение к объекту Enemy, аналогично одному из Player объект:

class Enemy(pygame.sprite.Sprite):

    # [...]

        def update(self):

        self.rect.x += round(self.move_x)
        block_collide = pygame.sprite.spritecollide(self, self.walls, False)
        for block in block_collide:
            if self.move_x > 0:
                self.rect.right = block.rect.left
            else:
                self.rect.left = block.rect.right

        self.rect.y += round(self.move_y)
        block_collide = pygame.sprite.spritecollide(self, self.walls, False)
        for block in block_collide:
            if self.move_y > 0:
                self.rect.bottom = block.rect.top
            else:
                self.rect.top = block.rect.bottom

Переместить противника до обновления спрайтов, потому что .move_x и .move_y должны быть установлены раньше:

while run:

    # [...]

    enemy.move(player)
    all_sprite_list.update()

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