如何添加跟随玩家的敌方精灵

时间:2019-06-03 03:04:31

标签: python pygame

我对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 个答案:

答案 0 :(得分:3)

敌人必须“知道”墙壁(类似于玩家),并且要定义敌人.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_yEnemy.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()