第一个Pygame程�

 
Pygame 作为一个入门级的游�开�库,其实并�难学,��掌� Python 编程的相关知识就能很轻�地掌�它。

Pygame 语法简��明了,秉�了 Python 语言一贯的风格。�时,它作为一个游�开�库�说,具有图形编程的基本特点,如果您对于图形编程从未了解过,�使您有 Python 编程基础,也会略感迷茫。因此,在接下�的学习中会详细介� Pygame 的常用模�,以�图形编程中的相关概念,帮助您快速掌� Pygame 的使用。

下�是一个简�的 Pygame 程�,如下所示:
#导入所需的模�
import sys
import pygame

# 使用pygame之�必须�始化
pygame.init()

# 设置主�窗�
screen = pygame.display.set_mode((400,400))

# 设置窗�的标题,�游��称
pygame.display.set_caption('hello world')

# 引入字体类型
f = pygame.font.Font('C:/Windows/Fonts/simhei.ttf',50)
# 生�文本信�,第一个�数文本内容;第二个�数,字体是�平滑;
# 第三个�数,RGB模�的字体颜色;第四个�数,RGB模�字体背景颜色;
text = f.render("C语言中文网",True,(255,0,0),(0,0,0))
#获得显示对象的rect区域�标
textRect =text.get_rect()
# 设置显示对象居中
textRect.center = (200,200)
# 将准备好的文本信�,绘制到主�幕 Screen 上。
screen.blit(text,textRect)

# 固定代�段,实现点击"X"�退出界�的功能,几乎所有的pygame都会使用该段代�
while True:
    # 循环获�事件,监�事件状�
    for event in pygame.event.get():
        # 判断用户是�点了"X"关闭按钮,并执行if代�段
        if event.type == pygame.QUIT:
            #�载所有模�
            pygame.quit()
            #终止程�,确�退出程�
            sys.exit()
    pygame.display.flip() #更新�幕内容
�行结果如下所示:

pygame程��行结果
图1:第一个 Pygame 程�
 
如果您熟悉 Python 编程的基础知识,那么在注释的帮助下,应该能很容易地ç�†è§£ä¸Šè¿°ä»£ç �。å�‡å¦‚ä¸�能也没有关系,因为接下æ�¥ï¼Œæˆ‘们会对上述代ç �进行细致的分æž�。常言é�“:“授人以鱼ä¸�如授人以渔”,分æž�代ç �的逻辑,有助于我们ç�†è§£å’Œç¼–写 Pygame 程åº�,而至于代ç �中涉å�Šçš„æ¨¡å�—ã€�方法等,会在å�Žç»­å†…容å�šè¯¦ç»†ä»‹ç»�。

�始化程�

在使用 Pygame 编写程åº�å‰�,è¦�å�šçš„第一个步骤是“åˆ�始化程åº�”,代ç �如下所示:
pygame.init()
这是整个程�中的第一�代�,它的作用是自动检测 Pygame 软件包是�正常�用,并检查电脑的硬件调用接��基础功能是�存在问题,比如音频�光驱�声�驱动等设备。�时,它会完� Pygame 中所有模�的�始化�作,比如 display(显示模�)�font(字体模�)�mixer(声音控制模�)�cursors(光标控制模�)等。

由此å�¯è§�,åˆ�始化程åº�çš„é‡�è¦�性,因此上述代ç �,在编写程åº�时候å�ƒä¸‡ä¸�能“æ¼�掉”。

创建Surface对象

想�掌� Pygame 的编程逻辑,首先就��解 surface 对象的概念,它是 Pygame 中最��的组�部分。

Surface 翻译为表é�¢ã€�表层ã€�外观,在 Pygame 中,您å�¯ä»¥æŠŠ surface 对象ç�†è§£æˆ�一张“白纸”,通过这张纸å�¯ä»¥å�šè®¸å¤šçš„事情,比如在纸上添加文字ã€�填充颜色ã€�添加图片以å�Šç»˜åˆ¶ä»»æ„�形状的图形等。既然是“纸”就有规格尺寸,Pygame å…�许您创建任æ„�大å°�的纸。

那么我们应该如何创建 Surface 对象呢?Pygame �供了多�创建 Surface 对象的方法,这里先介�以下几�方法。

上述示例,使用如下方�创建了一个 surface 对象:
#也�screen对象,本质上是一个Surface,大�400*400
screen = pygame.display.set_mode((400,400))
screen 的本质上就是一个 Surface 对象,它是游æˆ�的主窗å�£ï¼Œä¹Ÿå°±æ˜¯æ•´ä¸ªæ¸¸æˆ�中尺寸最大的“纸”,任何其他的 Surface 对象都需è¦�附ç�€åœ¨è¿™å¼ æœ€å¤§çš„“纸”上,比如创建一个包å�«æ–‡æœ¬çš„ Surface 对象,通过以下方法将它绘制在主å±�幕上:
#创建一个包�文字的Surface对象
text = f.render("C语言中文网",True,(255,0,0),(0,0,0))
#通过blit方法将其绘制在主�幕上,这里的textRect表示�置�标
screen.blit(text,textRect)
如果想创建一个包�图�的 surface 对象�以使用如下方法:
surface_image =pygame.image.load("图片路径") 

事件监�

游�,在我们日常生活中�常接触到,无论是手游�还是电脑端游�,已��了信�社会中,��或缺的一部分。

游æˆ�大致æ�¥è®²æ˜¯ç”±åŠ¨ç”»å’Œäººæœºäº¤äº’çš„ä½“éªŒä¸¤éƒ¨åˆ†æž„æˆ�,其中动画则是由一系列连续é�™æ­¢çš„图片,ç»�过一定频率的刷新构æˆ�的,这个频率被称为 FPS,如果频率值越大则画é�¢è¶Šæµ�畅;如果频率值越å°�则画é�¢ä¼šå‡ºçްå�¡é¡¿çš„æ„Ÿï¼Œåœ¨æ¸¸æˆ�过程中一般人能接å�—的最低 FPS 约为 30Hz,如果想è¦�ç”»é�¢æµ�畅则 FPS è¦�大于 60 Hz。

FPS 越高,细节越好,体验也越好,但是文件容�也越高

动画��了玩家的视觉体验,而人机交互则是�作上的体验。通过移动和点击鼠标�按下键盘上的技能键,或是滑动手机�幕等�作�实现人机交互,这些与游�程�交互的�作被称为事件(Event)。

如果您接触过 JavaScript,那么您对于“事件”这一å��è¯�,一定ä¸�会陌生。

Pygame 作为一个游�开�库,�样具有设置和监�事件的功能。它�供了一个 enevt 事件模�,这个模�中包�了所有常用到游�事件。下�是退出游�的代�示例(其他事件类型,�续会�介�):
# 循环获�事件,监�事件状�,使用get()获�事件
for event in pygame.event.get():
    # 判断事件类型,用户是�点了"X"关闭按钮
    # pygame.QUIT 指点击�上角窗�的"X"�
    if event.type == pygame.QUIT:
        #点击�,�载所有pygame模�
        pygame.quit()

游�循环

当打我们游æˆ�æ—¶å�¯èƒ½ä¼šè§¦å�‘游æˆ�中的å�„ç§�事件,比如鼠标事件ã€�键盘按键事件ã€�æ‘„åƒ�æ‹�照事件等等,因此游æˆ�程åº�需è¦�一直循环监å�¬çŽ©å®¶çš„æ“�作,å�ªæœ‰å½“用户点击了游æˆ�“关闭”按钮时,监å�¬æ‰�会结æ�Ÿã€‚如果想è¦�达到“循环监å�¬”目的,此时就需è¦�设置一个游æˆ�循环(Game Loop)也称为游æˆ�的主循环,这样æ‰�能ä¿�è¯�人机交互的体验感。代ç �示例如下:
#游�主循环(游�循环)
while True:
    # 循环获�事件,监�事件
    for event in pygame.event.get():
        # 判断用户是�点了关闭按钮
        if event.type == pygame.QUIT:
            # 当用户关闭游�窗�时执行以下�作
            # 这里必须调用quit()方法,退出游�
            pygame.quit()
            #终止系统
            sys.exit()
    #更新并绘制�幕内容
    pygame.display.flip() 
游�主循环是�个 Pygame 游�程�中必��少的一部分,它主�承担�以下三个��任务:
  • 处ç�†æ¸¸æˆ�事件
  • 更新游æˆ�状æ€�
  • 把更新å�Žçš„æ¸¸æˆ�状æ€�绘制到å±�幕上

pygame程�
图2:主循环示�图

游�画�和游��作状�会因为动画效果和玩家的�作而改�,因此需�以循环的方�实时地更新主�幕(screen)的显示内容。把下列代�放入游�主循环中��实现实时更新和绘制�幕内容,如下所示:
#刷新界�显示
pygame.display.flip() 
除了上述方法外,Pygame 还�供了�一个方法。如下所示:
pygame.display.update() 
这两个方法的主�区别是:�者�以根�选定的区域�更新部分内容,而�者则是更新整个待显示的内容。如果�者没有�供区域�置�数时,其作用和 display.flip() 相�。

通过上述学习,我们对 Pygame 程�有了基本的认识。下�对 Pygame 模�中的方法�属性�更加细致的讲解。

关注公众�「站长严长生�,在手机上阅读所有教程,�时�地都能学习。本公众�由C语言中文网站长亲自��,长期更新,��原创。

公众�二维�
微信扫�关注公众�

 

加入微信交�群,一起学习�枯燥。内�一款�索神器,�费下载全网书�和视频。