根据Pygame APP应用程序的文档,pygame是一个“游戏开发库”,它是一组代码库,帮助程序员制作游戏。 包括:
图形声音(含音乐)控件(键盘、鼠标、游戏手柄等) Pygame游戏结构框架
每个游戏的核心是一个循环,这被称为“游戏循环”。 这个循环不断地运行着,一次又一次地完成了游戏工作所需的一切。 游戏的当前画面在每个周期显示,称为帧。
Pygame游戏循环主要处理三件事1 .处理外部输入(鼠标点击或键盘按下事件)。 这意味着在游戏进行的同时,必须响应用户的操作进行处理。 这些可能是键盘上的键被按下或鼠标被点击等事件。
2 .更新游戏对象的位置和状态飞机对象在空中飞行,受到重力作用时,需要改变自己的位置。 如果两个对象互相碰撞,就需要爆炸。
3 .渲染在此步骤中,在屏幕上重新绘制所有已更新位置的游戏对象。
构建Pygame游戏程序框架1 .基本配置Pygame程序的开始部分导入所需的库,设置一些变量,然后创建窗口和程序循环部分。
初始化importpygameimportrandomwidth=360 #游戏窗口宽度HEIGHT=480 #游戏窗口高度FPS=30 #帧速率pygame, 用于创建窗口pygame.init(pygame.mixer.init的声音初始化screen=pygame.display.set _ mode (width,HEIGHT ) ) pygame.dight 最后,我们创建了clock时钟对象,以便游戏在预期的FPS上运行。
#游戏循环running=truewhilerunning 3360 # process input (events ) # Update # # Draw/Render这是一个游戏循环,是由变量running控制的循环如果想结束游戏,只需将running设定为False,循环就结束了。 接下来,用几个基本代码填写各个部分。
2 .渲染/绘制从Draw部分开始。 目前没有可用单色填充屏幕的游戏对象。
图像由具有红、绿、蓝三个部分的像素组成。 每个部分的发光量决定像素的颜色。 如下所示。
三原色可以具有0到255的值,因此三种原色中的每一种原色可能有256种不同。 以下是三种颜色的组合示例。
开始设置变量时,可以通过设置这些颜色的量然后绘制来直接应用和填充这些颜色。
#colors(r,g,b ) black=(0,0,0 ) white=) 255,255 ) red=) 255,0,0 ) green=) 0,255,0 ) blue=屏幕的像素在计算机看来,这是一个非常缓慢的过程。 因此,如果在画面上画了很多东西,画这些东西可能会很花时间。 处理能力较低的计算机表现为游戏的运行纸箱。
我们可以通过使用被称为双缓冲的技术巧妙地解决这个问题。
想象一下,有一个双面白板可以翻转显示一侧或另一侧。 前面是显示器(玩家正在观看的屏幕),背面是隐藏的,只有计算机才能“看到”它。 每个帧在背面(内存中)绘制所有的画。 各角色、各子弹、各闪耀的光等。 然后,完成后,把白板翻过来显示。 这意味着您只需逐帧执行白板翻转过程。
这些都在pygame中自动发生。 绘制完成后,只需告诉他们翻转白板即可。 命令是flip () :
#draw/renderscreen.fill(black ) after ) drawingeverything,flipthedisplaypygame.display.flip )3.游戏事件现在这个程序这是因为当用户单击“关闭”按钮时会发生事件,程序需要侦听该事件并采取相应的操作。 结束游戏。
Pygame在内部保存自上一帧以来发生的所有事件。 下面的代码可以确认发生了什么事件。
foreventinpygame.event.get (: # checkforclosingwindowifevent.type==pygame.quit : runing=false pygame中有很多事件程序检查到发生了这个事件后,将running变量设置为False以挤出游戏循环,然后结束游戏。
输出文本pygame支持使用pygame.font对象在窗口中打印文本
。要打印文本的话,首先需要创建一个字体对象,Font的第一个参数为None是告诉pygame获得系统默认字体,也可以是具体的字体名称。Font的第二个参数指明字体大小。 myfont = pygame.font.Font(None,60)文本绘制过程比较耗费时间,常用的做法是先在内存中创建文本图像,然后将文本当作一个图像来渲染。
textImage = myfont.render("pygame", True, WHITE)textImage 对象可以使用screen.blit()来绘制。上面代码中的render函数第一个参数是要绘制的文本,第二个参数是启用抗锯齿能力,第三个参数是文本的颜色。
下面的代码,将刚刚产生文本图像绘制到屏幕的坐标(10,100)处:
screen.fill(BLACK)screen.blit(textImage, (10,100))pygame.display.flip() FPS设置 pygame时钟游戏循环的另一个重要方面是控制整个循环的运行速度。游戏中有个术语叫FPS(Frames Per Second),它代表每秒帧数,也叫帧率。这意味着游戏循环每秒应发生多少次。这很重要,因为我们不希望游戏运行得太快或太慢。也不希望它在不同的计算机上以不同的速度运行 。
控制FPS虽然现在还没有任何东西要放在“更新”部分,但仍然需要设置FPS来控制游戏运行速度。可以这样做:
while running: # keep loop running at the right speed clock.tick(FPS)该tick()命令告诉pygame一秒循环多少次。如果设置FPS为20,这意味着我们命令游戏的每个循环持续1 / 20(0.05)秒。如果循环代码(更新,绘图等)只需要0.03秒,那么pygame将等待0.02秒。以上是计算机处理比较快的情况。如果电脑比较差,运行缓慢,一秒钟未必能执行20次循环— 那么clock.tick(20)就成为一个指导意见。
显示FPS可循环计算出FPS并显示在屏幕上
首先,在while循环之前定义2个变量:
计算方法:循环开始前获得当前系统时间,在每次循环中,累加循环次数count;同时在每次循环时,获得当前系统时间,那么从开始循环到目前为止流逝的时间(时间差)为:now-start。再用count除以这个时间差,即为FPS(每秒循环了多少次)。代码如下:
# Updatecount+=1now = time.time()fps = count/(now-start)fpsImage = myfont.render(str(fps), True, WHITE)# Draw / renderscreen.fill(BLACK)screen.blit(fpsImage, (10, 100))# *after* drawing everything, flip the displaypygame.display.flip()我们可以修改FPS的值,看看是否界面上输出的值会跟着变化,我的电脑,将FPS设置成10000时,发现屏幕上打印的是2300,说明,我的电脑配置最多可以支持到1秒中运行循环中的代码2300次。
最后,为了确保当游戏循环结束时,游戏窗口正确退出。我们通过将代码pygame.quit()的放到最后一行来实现这一点。
FPS = 10FPS = 100FPS = 1000FPS = 10000