2.1。基本的Pygame游戏
为了修改,并确保您熟悉Pygame程序的基本结构,我将简要介绍一个基本的Pygame程序,该程序只显示一个窗口,其中包含一些文本,到最后,看起来像这样(当然你的系统上的窗口装饰可能会不同):这个例子的完整代码如下所示:
#!/usr/bin/python
import pygame
from pygame.locals import *
def main():
# 初始化屏幕
pygame.init()
screen = pygame.display.set_mode((150, 50))
pygame.display.set_caption('Basic Pygame program')
# 填充背景
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))
# 显示一些文本
font = pygame.font.Font(None, 36)
text = font.render("Hello There", 1, (10, 10, 10))
textpos = text.get_rect()
textpos.centerx = background.get_rect().centerx
background.blit(text, textpos)
# 把所有东西都放在屏幕上
screen.blit(background, (0, 0))
pygame.display.flip()
# 事件循环
while 1:
for event in pygame.event.get():
if event.type == QUIT:
return
screen.blit(background, (0, 0))
pygame.display.flip()
if __name__ == '__main__': main()
2.2。基本Pygame对象
如您所见,代码由三个主要对象组成:屏幕、背景和文本。
这些对象都是这样创建的:首先调用内置Pygame对象的一个实例,然后修改它以满足我们的需要。
屏幕是一种稍微特殊的情况,因为我们仍然通过Pygame调用修改显示,而不是调用属于屏幕对象的方法。
但是对于所有其他Pygame对象,我们首先创建对象作为Pygame对象的副本,给它一些属性,然后从它们构建我们的游戏对象。
对于背景,我们首先创建一个Pygame Surface对象,并将其设置为屏幕的大小。
然后执行convert()操作将Surface转换为单一像素格式。
当我们有多个图像和表面,所有不同的像素格式,这显然是必要的,这使渲染相当缓慢。
通过转换所有的表面,我们可以大大加快渲染时间。
最后,我们用白色填充背景表面(255,255,255)。
这些值是RGB(红绿蓝),可以从任何好的绘图程序中计算出来。
对于文本,我们需要多个对象。
首先,我们创建一个字体对象,它定义使用哪种字体,以及字体的大小。
然后我们创建一个文本对象,通过使用属于我们的字体对象的render方法,提供三个参数:要渲染的文本,是否应该反锯齿(1=yes, 0=no),以及文本的颜色(同样是RGB格式)。
接下来,我们创建第三个文本对象,它获取文本的矩形。
理解这一点最简单的方法是想象绘制一个矩形,将所有文本包围;
然后可以使用这个矩形来获取/设置文本在屏幕上的位置。
在这个例子中,我们得到一个矩形,将它的centerx属性设置为背景的centerx属性(这样文本的中心将与背景的中心相同,即文本将在屏幕的x轴上居中)。
我们也可以设置y坐标,但没有什么不同,所以我把文本放在屏幕顶部。
因为屏幕很小,所以似乎没有必要这么做。
2.3。传送
现在我们已经创建了游戏对象,我们需要实际渲染它们。
如果我们不这样做,然后运行程序,我们只会看到一个空白窗口,而对象将保持不可见。
用于渲染对象的术语是blitt,即将属于该对象的像素复制到目标对象上。
为了渲染背景对象,你把它块放到屏幕上。
在这个例子中,为了简单起见,我们将文本移到背景上(这样背景就有了文本的副本),然后将背景移到屏幕上。
比特化是任何游戏中最慢的操作之一,所以你需要小心不要在每一帧中对屏幕进行太多比特化。
如果你有一个背景图像,一个球在屏幕上飞来飞去,那么你就可以在每一帧中分割背景和球,这将覆盖球之前的位置并渲染新球,但这将非常缓慢。
一个更好的解决方案是将背景分割到球之前占据的区域,这可以通过球之前的矩形找到,然后分割球,这样你就只分割了两个小区域。
2.4。事件循环
一旦你设置好游戏,你就需要将其放入一个循环中,这样它才能持续运行,直到用户发出想要退出的信号。
所以你开始了一个开放的while循环,然后对于循环的每一次迭代,也就是游戏的每一帧,更新游戏。
第一件事是检查任何Pygame事件,即用户敲击键盘、单击鼠标按钮、移动操纵杆、调整窗口大小或试图关闭它。
在这种情况下,我们只是想要注意用户试图通过关闭窗口退出游戏,在这种情况下游戏应该返回,这将结束while循环。
然后我们只需要重新绘制背景,并翻转(更新)显示以绘制所有内容。
在这个例子中,没有任何东西移动或发生,严格来说,我们不需要在每次迭代中重新对背景进行blit,但我这么做是因为当东西在屏幕上移动时,你需要在这里做所有的blit。
2.5。哈!
这就是你最基本的Pygame游戏!
所有的游戏都采用类似的形式,但实际的游戏功能本身需要更多的代码,这些代码更多地用于编程,在结构上较少受到Pygame工作方式的指导。
这是本教程真正的内容,现在将继续。