[英]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_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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.