biancheng-Pygame(python)
http://c.biancheng.net/pygame/
Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac OS 等操作系统,具有良好的跨平台性。Pygame 由 Pete Shinners 于 2000 年开发而成,是一款免费、开源的的软件包,因此您可以放心地使用它来开发游戏,不用担心有任何费用产生。
Pygame 在 SDL(Simple DirectMedia Layer,使用 C语言编写的多媒体开发库) 的基础上开发而成,它提供了诸多操作模块,比如图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模块等。相比于开发 3D 游戏而言,Pygame 更擅长开发 2D 游戏,比如于飞机大战、贪吃蛇、扫雷等游戏。
顾名思义,Pygame 是一个专门用来开发游戏的 Python 模块,主要为开发、设计 2D 电子游戏而生,它是一个免费、开源的第三方软件包,支持多种操作系统,具有良好的跨平台性(比如 Windows、Linux、Mac 等)。Pygame 是 Pete Shinners 在 SDL(Simple DirectMedia Layer,一套开源的跨平台多媒体开发库)基础上开发而来,其目的是取代 PySDL。
截止到 2020 年 10 月 28 日,Pygame 已经诞生 20 周年。
SDL 是一套开放源代码的跨平台多媒体开发库,使用 C语言编写,它提供了多种控制图像、声音、输入/输出的函数,Pygame 可以看做是对 SDL 的封装,在 SDL 库基础上提供了各种 Python 的 API接口。目前 SDL 主要用于多媒体领域,比如开发游戏、模拟器、媒体播放器等。
通过 Pygame 我们能够创建各种各样的游戏和多媒体程序,但相比于开发大型 3D 游戏来说,它更擅长与开发 2D 游戏,比如扫雷、纸牌游戏、贪吃蛇、超级马里奥、飞机大战等,如果是 3D 游戏,可以选择一些功能更为全面的 Python 游戏开发库,比如 Panda3D(迪士尼开发的3D游戏引擎),PyOgre(Ogre 3D渲染引擎)等。
Python 作为一门解释型语言并不适合开发大型的 3D 游戏,但 Python 通过对其他语言的接口封装,使自身具备了开发大型 3D 游戏的能力,例如 Panda3D 的底层是用 C++ 语言编写的。一些较为知名的 3D 游戏,比如魔兽世界、文明帝国4、战地风云2,这些游戏都是使用 Python 语言开发的,而国内较为知名的“阴阳师”手游,也是由 Python 语言开发而成。
1) pip包管理器安装
这是最为轻便的一种安装方式,推荐大家使用。首先确定的您的电脑已经安装了 Python(推荐使用 3.7 以上版本),然后打开 cmd 命令行工具,输入以下命令即可成功安装:
pip install pygame
第一个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 程序
如果您熟悉 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 游戏程序中必不可少的一部分,它主要承担着以下三个重要任务:
- 处理游戏事件
- 更新游戏状态
- 把更新后的游戏状态绘制到屏幕上

图2:主循环示意图
游戏画面和游戏操作状态会因为动画效果和玩家的操作而改变,因此需要以循环的方式实时地更新主屏幕(screen)的显示内容。把下列代码放入游戏主循环中即可实现实时更新和绘制屏幕内容,如下所示:
- #刷新界面显示
- pygame.display.flip()
除了上述方法外,Pygame 还提供了另一个方法。如下所示:
- pygame.display.update()
这两个方法的主要区别是:后者可以根据选定的区域来更新部分内容,而前者则是更新整个待显示的内容。如果后者没有提供区域位置参数时,其作用和 display.flip() 相同。
biancheng-Pygame(python)的更多相关文章
- python编程学习--Pygame - Python游戏编程入门(0)---转载
原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html 引言 博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因 ...
- Pygame - Python游戏编程入门(0) 转
博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因为我感觉Python是一门很有意思的语言,很早以前就想学了(碍于懒),它的功能很强大,你可以用它来做科学运算,或者数 ...
- Pygame - Python游戏编程入门
>>> import pygame>>> print(pygame.ver)1.9.2a0 如果没有报错,应该是安装好了~ 如果报错找不到模块,很可能是安装版本的问 ...
- centos上安装pygame
安装前依赖包检查及安装 python-devel SDL_image-devel SDL_mixer-devel SDL_ttf-devel SDL-devel numpy subversion po ...
- pygame安装
进入这个网站 http://www.pygame.org/wiki/Compilation 可以选择不同系统的安装方法 其中ubuntu的安装命令是 #这是python .X #install dep ...
- linux下pip安装pygame
在学习python的过程中要用到pygame,在安装过程中遇到一些问题,经百度解决.因为使用的版本为python3,故以下教程针对python3版本.安装教程如下: 一.首先你要确保你已经安装了pip ...
- ubuntu14.04 pygame安装 python2.7
系统:ubuntu14.04 LTS amd64python版本:2.7.6pygame版本:1.9.1release别这种方法了,这么安装不知道什么原因就出现了问题,在使用pygame.image. ...
- pygame 安装教程
步骤: 1.去官网下载PyGame 注意:要下载对应版本的包 官网地址:http://www.pygame.org/download.shtml 其中,如果python为以下版本: python 3. ...
- python模块统计
.处理日期和时间 datetime/time/pytz/dateutil/calendar 注:calendar有很广泛的方法用来处理年历和月历,例如打印某月的月历 .处理字符串 re .处理字符集编 ...
- windows上安装python虚拟环境
一.windows上安装python虚拟环境 1.安装pip install virtualenvvirtualenv --version 2.新建一个python虚拟环境virtual_env_01 ...
随机推荐
- 企业级zabbix监控搭建及邮件报警
Zabbix简介 Zabbix 是由Alexei Vladishev创建,目前由Zabbix SIA在持续开发和支持.Zabbix 是一个企业级的分布式开源监控方案.Zabbix是一款能够监控各种 ...
- vue2-vuex
专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信 应用场景: 多个组 ...
- Solr Facet技术的应用与研究
http://tech.meituan.com/solr-facet.html 问题背景 在 <搜索引擎关键字智能提示的一种实现> 一文中介绍过,美团的CRM系统负责管理销售人员的门店 ...
- java中的集合包简要分析
1.集合包 集合包是java中最常用的包,它主要包括Collection和Map两类接口的实现. 对于Collection的实现类需要重点掌握以下几点: 1)Collection用什么数据结构实现? ...
- Java Study For Six Day( 面向对象二)
static(静态)关键字 用于修饰成员(成员变量和成员函数) 被修饰后的成员具备以下的特点 随着类的加载而加载 优先于对象存在 被所有的对象共享 可以被类名直接调用 静态注意事项 静态方法只能访问静 ...
- golang之泛型
Go 1.18版本增加了对泛型的支持,泛型也是自 Go 语言开源以来所做的最大改变. 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型.ーー换句话 ...
- golang之测试testing
01 介绍 我们使用 Golang 语言开发的项目,怎么保证逻辑正确和性能要求呢?也就是说我们如何测试我们的 Golang 代码呢?在 Golang 语言中,可以使用标准库 testing 包编写单 ...
- nginx之日志处理
日常对于NGINX日志文件的处理 1.将访问日志中爬虫相关请求导出 cat access.log | grep Baiduspider > spider.log
- Nuxt.js 应用中的 request 事件钩子
title: Nuxt.js 应用中的 request 事件钩子 date: 2024/12/4 updated: 2024/12/4 author: cmdragon excerpt: 在构建现代 ...
- Echarts 图例组件
1.图例组件的基本介绍 图例组件legend展现了不同系列的标记(symbol),颜色和名字.可以通过点击图例控制哪些系列不显示. 2.开启图例组件 开启图例组件默认时关闭状态,通过配置legend字 ...
