第一个Pygame程�
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() #更新�幕内容
�行结果如下所示:
图1:第一个 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 游æˆ�程åº�ä¸å¿…ä¸�å�¯å°‘的一部分,它主è¦�承担ç�€ä»¥ä¸‹ä¸‰ä¸ªé‡�è¦�任务:
- 处�游�事件
- 更新游�状�
- 把更新�的游�状�绘制到�幕上

图2:主循环示�图
游æˆ�ç”»é�¢å’Œæ¸¸æˆ�æ“�作状æ€�ä¼šå› ä¸ºåŠ¨ç”»æ•ˆæžœå’ŒçŽ©å®¶çš„æ“�作而改å�˜ï¼Œå› æ¤éœ€è¦�以循环的方å¼�实时地更新主å±�幕(screen)的显示内容。把下列代ç �放入游æˆ�主循环ä¸å�³å�¯å®žçŽ°å®žæ—¶æ›´æ–°å’Œç»˜åˆ¶å±�幕内容,如下所示:
#刷新界�显示 pygame.display.flip()除了上述方法外,Pygame 还�供了�一个方法。如下所示:
pygame.display.update()这两个方法的主è¦�区别是:å�Žè€…å�¯ä»¥æ ¹æ�®é€‰å®šçš„区域æ�¥æ›´æ–°éƒ¨åˆ†å†…容,而å‰�者则是更新整个待显示的内容。如果å�Žè€…没有æ��供区域ä½�ç½®å�‚数时,其作用和 display.flip() 相å�Œã€‚
通过上述å¦ä¹ ,我们对 Pygame 程åº�有了基本的认识。下é�¢å¯¹ Pygame 模å�—ä¸çš„æ–¹æ³•ã€�属性å�šæ›´åŠ ç»†è‡´çš„è®²è§£ã€‚
关注公众å�·ã€Œç«™é•¿ä¸¥é•¿ç”Ÿã€�,在手机上阅读所有教程,éš�æ—¶éš�地都能å¦ä¹ 。本公众å�·ç”±Cè¯è¨€ä¸æ–‡ç½‘站长亲自è¿�è�¥ï¼Œé•¿æœŸæ›´æ–°ï¼Œå�šæŒ�原创。

微信扫ç �关注公众å�·
优秀文ç«
- mallocå’Œfree函数使用注æ„�事项,Cè¯è¨€mallocå’Œfree使用详解
- Cè¯è¨€åˆ¤æ–三角形的类型
- Linux LV逻辑å�·ï¼ˆåˆ›å»ºã€�查看ã€�调整大å°�å�Šåˆ 除)详解
- Shellå—符串拼接(连接ã€�å�ˆå¹¶ï¼‰
- MySQL UPDATE:修改数�(更新数�)
- B+æ ‘å�ŠåŸºæœ¬æ“�作(æ�’å…¥å’Œåˆ é™¤ï¼‰è¯¦è§£
- 使用mdadm命令��置RAID
- MyBatis下载(多�方�)
- Spring事务(Transaction)
- PHP简介(�常详细)