簡體   English   中英

如何添加跟隨玩家的敵方精靈

[英]How to add enemy sprites that follow player

我對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)

但這只會顯示一堆錯誤消息。 我不知道該怎么辦。

敵人必須“知道”牆壁(與玩家相同),並且必須定義一個敵人.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_xself.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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM