我对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)
但是它只会使一堆错误消息出现。我不知道该怎么办。
答案 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_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()