游戏制作指南(Making Games Tutorial)
点我回总目录 ☚
2.校订:Pygame基础(Revision: Pygame fundamentals)
2.1.基本的Pygame游戏
出于校订的目的,为了确保你熟悉Pygame程序的基本结构,我将简要介绍一个基本的Pygame程序,该程序只显示一个带有一些文本的窗口,应该, 到最后,看起来像这样(虽然当然窗户装饰可能会在你的系统上有所不同):
![](https://i-blog.csdnimg.cn/blog_migrate/b47ef8b2c489b09adcb2b2417f71ca44.png)
此示例的完整代码如下所示:
#!/usr/bin/python
import pygame
from pygame.locals import *
def main():
# 初始化 screen
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)
# 把所有东西blit到screen上
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转换为单个像素格式。当我们有几个图像和表面,所有都是不同的像素格式,这使得渲染它们非常慢时,这显然是必要的。通过转换所有surface,我们可以大大加快渲染时间。最后,我们用白色填充背景表面(255,255,255)。这些值是RGB(红 绿 蓝),可以从任何好的绘图程序中得出。
文本部分,我们需要一个以上的对象。首先,我们创建一个字体对象,它定义要使用的字体和字体大小。然后我们通过使用属于我们的字体对象的render方法创建一个文本对象,提供三个参数:要渲染的文本,是否应该消除锯齿(1 =是,0 =否),以及文本的颜色(再次以RGB格式)。接下来,我们创建第三个文本对象,它获取文本的矩形。理解这一点的最简单方法是想象绘制一个围绕所有文本内容的矩形;然后,您可以使用此矩形来获取/设置屏幕上文本的位置。因此,在此示例中,我们获取矩形,将其centerx属性设置为背景的centerx属性(因此文本的中心将与背景的中心相同,即文本将在x轴上的屏幕中心)。我们也可以设置y坐标,但它没有任何不同,所以我将文本留在屏幕顶部。因为屏幕很小,所以似乎没必要。
2.3.Blitting
现在我们已经创建了我们的游戏对象,我们需要实际渲染(render)它们。如果我们没有,我们运行程序,我们只看到一个空白窗口,对象将保持不可见。用于渲染对象的术语是blitting,这是将属于所述对象的像素复制到目标对象的位置。因此,要渲染背景对象,请将其blit到屏幕上。在这个例子中,为了简单起见,我们将文本blit到背景上(因此背景现在将有一个文本的副本),然后将背景blit到屏幕上。
Blitting是任何游戏中最慢的操作之一,因此您需要注意不要在每个帧中对屏幕进行过多的blit操作。如果你有一个背景图像,并且一个球在屏幕上飞舞,那么你可以blit背景然后在每一帧中blit球,这将掩盖球的先前位置并渲染新的球,但这将非常缓慢。一个更好的解决方案是将背景blit到球先前占据的区域上,这可以通过球的前一个矩形找到,然后blit球,这样你只需要blit两个小区域。
2.4.事件循环
一旦你设置好了游戏,你需要把它放到一个循环中,这样它会一直运行,直到用户发出他/她想要退出的信号。 所以你开始启动一个while循环,然后对于循环的每一个迭代,这将是游戏的每一个帧,更新游戏。 第一件事是检查任何Pygame事件,用户点击键盘,单击鼠标按钮,移动操纵杆,调整窗口大小或尝试关闭它。 在这种情况下,我们只是想要注意用户试图通过关闭窗口来退出游戏,在这种情况下游戏应该返回,这将结束while循环。 然后我们只需要简单地重新blit背景,并翻转(更新)显示以绘制所有内容。 好吧,因为在这个例子中没有任何动作或发生,我们并不严格地说需要在每次迭代中重新blit背景,但我在这里把它放进去,因为当东西在屏幕上移动时,你需要在这里做所有blitting工作。
2.5.当当!(Ta-da!)
就是这样 —— 你最基本的Pygame游戏! 所有游戏都将采用与此类似的形式,但是有更多代码用于实际的游戏功能本身,这些更多的是用于编程,而Pygame对结构的运作指导较少。 这就是本教程的真正含义,现在让我们继续介绍。
上一篇:Tutorials - 游戏制作指南(Making Games Tutorial)- 介绍(Introduction)
下一篇:Tutorials - 游戏制作指南(Making Games Tutorial)- 正式开干(Kicking things off)
以上内容,自己翻译,可能有误,可参考:Tutorials - 游戏制作指南(Making Games Tutorial)- 校订:基础(Revision: Pygame fundamentals)
点我回顶部 ☚
Fin.