从这篇开始,我们将开始一步步编写一个真正的可以运行的游戏。
让我们开始动手完成自己的第一个游戏吧! 在本系列课程中,我们将使用 Python 和 Pygame 构建一个完整的游戏。 它适用于已经了解 Python 基础知识的初级程序员。
开始
如果您对Pygame还不了解,请先完成 Pygame 入门的前三次课程的学习(1、2、3)。 我们将使用我们在该前置课程中构建的 pygame 模板程序作为本课程的起点。
在本系列中,我们将制作“Shmup”或“Shoot ‘em up”风格的游戏。 在我们的例子中,我们将成为一艘小型宇宙飞船的飞行员,试图在流星和其他物体向我们飞来时保持生命。
首先,我们将前面的模板文件拷贝到新的项目中作为新项目的入口文件(在好学好教少儿编程平台上,入口文件名称统一为project.py)。
在模板文件基础上,让我们将游戏设置修改为适合我们正在编写的游戏的值:
WIDTH = 480
HEIGHT = 600
FPS = 60
这将是一款“肖像(纵向,Portrait)模式”游戏,这意味着窗口的高度大于宽度。 它也是一款动作游戏,因此我们希望确保我们的 FPS 足够高,以使快速移动的精灵看起来像是在平稳移动。 60是一个比较合适的设置。
玩家精灵
我们要添加的第一件事是代表玩家的精灵。 最终,这将是一艘宇宙飞船,但当你第一次开始时,稍微忽略一下美观,暂时先使用普通矩形来代替,这样我们只需专注于让精灵出现在屏幕上并按照我们想要的方式移动,然后我们就可以用漂亮的图片来替换矩形。
这是我们的玩家精灵最开始的定义:
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((50, 40))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 10
self.speedx = 0
我们为我们的玩家角色设置了 50x40 像素的大小,我们将它的矩形定位在屏幕的底部中心。 我们还为它设置了一个 speedx 属性,用于跟踪玩家在 x 方向(左右)移动的速度。 这段代码在前面的课程中有详细讲解,如果你不确定其中的任何设置的作用,请参阅前面三部分的课程。
对于 精灵(Sprite) 的 update() 方法,即游戏每一帧都会执行的代码,在这里我们只想以我们指定的速度左右移动 sprite:
def update(self):
self.rect.x += self.speedx
现在,我们可以生成我们的玩家角色以确保我们在屏幕上看到它:
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
不要忘记,您创建的每个精灵对象都必须添加到 all_sprites 精灵组,以便更新并在屏幕上绘制它们。
移动和控制
我们设计制作的是一个键盘控制的游戏,所以我们希望玩家在按下向左或向右箭头键时移动玩家角色(当然,也可以使用 a 和 d甚至其他按键)。
当我们考虑在游戏中使用按键时,这意味着我们正在谈论事件(Event),此时我们有几种方式来实现事件的监听:
- 选项 1:在我们的事件队列中,我们可以定义两个事件(每个键一个),每个事件相应地改变玩家的速度:
这种方法的问题是,当按下按键使玩家移动时,我们没有办法让它停下来! 我们还需要添加两个将速度设置回 0 的 KEYUP 事件。for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player.speedx = -8
if event.key == pygame.K_RIGHT:
player.speedx = 8
- 选项 2:我们告诉精灵始终将其速度设置为 0,除非 LEFT 或 RIGHT 键按下。 这将导致更平滑的运动,以及更简单的编码:
我们将每帧的 speedx 设置为 0,然后检查是否有按键按下。 pygame.key.get_pressed() 会得到键盘上每个键的对应值,值为 True 或 False 表示该键当前是按下还是松开。 根据我们设置的按键被按下来相应地设置速度。def update(self):
self.speedx = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speedx = -8
if keystate[pygame.K_RIGHT]:
self.speedx = 8
self.rect.x += self.speedx
保持在屏幕里
最后,我们需要确保我们的精灵不会离开屏幕而跑到屏幕外。 我们将在 Player的update() 中添加以下内容:
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
现在,如果玩家精灵对应的矩形 rect 试图移动到超出屏幕左边缘或右边缘的位置,它将停止。 另一种选择是环绕屏幕——当精灵碰到边缘时将它从一侧传送到另一侧,就和前面教程中我们所设置的一样——但对于这个游戏来说,停在边缘更符合我们的设计。
现在将这个程序组合起来,就可以将它运行起来了。可以点击下面的链接直接运行这个程序。
太空大撞击 游戏,第一步代码实现