这是我们“太空大撞击”游戏项目的第 2 部分! 在本篇文章中,我们将添加一些敌人精灵供玩家躲避。
敌人精灵
在目前,我们不需要担心我们的敌人精灵是什么,我们只想让它们出现在屏幕上。 您可能会认为您的游戏是关于宇宙飞船躲避流星或独角兽躲避飞行披萨的 —— 就代码而言,这无关紧要,或者说并没有实质区别。
牢记这一点,我们将在代码中将我们的敌人精灵命名为通用名称。 事实证明,对于在游戏中四处移动的通用对象有一个完美的词(您可能以前听说过这个术语):Mob(Mobile的简写)。
我们将从定义精灵属性开始:
class Mob(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((30, 40))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
这里的关键是选择一个合适的地方让Mob出现。 我们不希望它们突然出现,所以我们选择一个高于顶部的 y 值(y < 0)和一个位于两侧之间某处的随机值 x。
现在,当调用update去更新的时候,我们可以通过设置它的速度移动精灵,但是当精灵离开底部时呢? 我们可以删除精灵,然后生成另一个精灵,或者我们可以通过将精灵移回顶部上方的随机位置来获得完全相同的效果:
def update(self):
self.rect.y += self.speedy
if self.rect.top > HEIGHT + 10:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
生成敌人
我们会想要有很多敌人,所以我们将创建一个名为 mobs 的新精灵组来控制它们。 这也将使我们在以后的步骤中更轻松地进行控制。我们生成一些小Mob并将它们添加到精灵组中:
player = Player()
all_sprites.add(player)
for i in range(8):
m = Mob()
all_sprites.add(m)
mobs.add(m)
现在你应该有源源不断的Mob从屏幕上移动下来,像这样:
这看起来不错,但是让Mob都直直地向下移动有点无聊。 让我们在 x 方向上添加一点运动:
class Mob(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((30, 40))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
self.speedx = random.randrange(-3, 3)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
请注意,此时我们需要更改当Mob离开屏幕时重新生成生物的 if 语句,因为 一个斜向移动的生物会在它离开底部之前很久就离开侧面,所以我们需要相对更早地重置它。
现在,游戏运行效果应该如下所示:
可以点击这里直接运行完整的代码。
在下一课中,我们将学习如何检测两个精灵何时相互碰撞并使玩家能够向Mobs射击。