今天我们要分享的是战斗机游戏!在这个游戏中,飞机(游戏主角)需要躲避迎面飞来的炮弹(敌人)。
下面让我们一起来看一下如何编写这个小游戏吧!
首先,创建一个新的.py文件然后置入下面的代码:
import pygame
from pygame.locals import *
pygame.init()
和其他所有python程序一样,我们要首先导入(import)我们所要使用的模块(module)。在今天这个例子里,我们要导入pygame以及pygame.locals,以用于后面的内容。最后一行pygame.init()将所有的PyGame模块初始化,在我们正式开始写PyGame的“正文内容”之前,都要先加上这一行。
首先,我们需要为所有的物体创建一个画布窗口,我们把这个变量叫做screen。为了创建这个变量,我们需要调用pygame.display下的set_mode()方法(method),并向set_mode()传递一个元组(tuple)来表示窗口的高和宽(在这里我们设置一个高800宽600的窗口)。
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((800, 600))
现在,如果你运行程序,你将会看到一个窗口突然出现,并在我们退出程序时马上消失。看来我们已经成功创建了画布!在下一部分,我们将加入游戏的main循环,这样我们就能确保只有我们输入正确的退出命令时,程序才会退出。
游戏的主循环内包含了所有要发生的事件。当我们玩游戏时,这段程序一直在运行。它能够不断更新游戏的状态,渲染游戏屏幕效果,并且收集玩家输入的指令。除了让主循环在游戏进行中不断执行,我们也需要让循环在我们退出程序时停止。因而,我们需要引入一些相应的指令,让程序能够在这些指令输入(input)时作出相应的反应。所有输入的指令(以及之后一些其他的事件)都会进入PyGame的事件队列中,我们可以通过pygame.event.get()来得到这些事件。这个命令会返回队列中的事件列表,在游戏中,程序将对这些事件进行循环,并且根据事件的类别作出相应的反应。在下一段代码中,我们要处理的是KEYDOWN和QUIT事件:
# 用于让主循环不断运行的变量
running = True
# 主循环
while running:
# 针对事件队列的for循环
for event in pygame.event.get():
# 检测是否有KEYDOWN事件,KEYDOWN是一个在pygame.locals中定义了的事件常量,这个库我们之前导入过
if event.type == KEYDOWN:
# 如果按了ESC键,把running的值设为False,并退出主循环
if event.key == K_ESCAPE:
running = False
# 检测是否有QUIT事件,如果有的话,把running的值设为Flase
elif event.type == QUIT:
running = False
把这几行代码加到之前的代码之后,然后执行程序。你应该会看到一个空白的窗口。这个窗口只会在你按下ESC键以激活QUIT事件的时候才会关闭。
Surface和Rect是PyGame里的基础模块。我们可以把surface理解为一张白纸,我们可以在这张白纸上画任何想画的东西。我们的screen变量也是一个“surface“,因为它也是用于承载图像的。Rect代表surface内的一个矩形区域。
现在,让我们创建一个50像素 x 50像素的surface,用surf变量来代表这个surface,然后给这个surface对象填充颜色。由于窗口的默认背景色是黑色,我们将把这个surface对象填充为白色,这样在颜色对比之下就更明显一些。然后我们要对这个surface调用get_rect()方法,然后得到这个surface代表的矩形区域以及surface的x、y坐标。
# 创建surface对象,将长和宽以元组的形式传递
surf = pygame.Surface((50, 50))
# 用白色填充surface对象,让它与背景有所区别
surf.fill((255, 255, 255))
rect = surf.get_rect()
要使我们创建的surface显示在屏幕上,仅仅创建它是不够的,我们还需要用blit把这个surface放到另一个surface(screen)上。在PyGame中,我们可以把blit理解为“画”。我们可以用blit把一个surface画在另一个surface上,在这里,我们的另一个surface就是我们的大画布screen。下面的代码显示如何将surface变量surf画在screen上:
# 这行的意思是“在画布screen横坐标400纵坐标300的地方画一个surf”
screen.blit(surf, (400, 300))
pygame.display.flip()
blit()带有两个参数:一个是我们要画上去的surface,另一个是我们要画的位置的坐标。在这里,(400,300)代表了screen画布的中心,但是当你真正执行程序的时候你会发现,surf并没有出现在屏幕的正中央。这是因为blit()都是从左上角开始画图的,(400,300)代表了surface的左上角。
需要注意的是,我们在blit后调用了pygame.display.flip()。Flip会在每一次循环时刷新屏幕,从而显示在上一次循环后屏幕更新后的状态。如果不调用flip()的话,这些更新是不会显示的。
(未完待续)
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved