Python:pygame游戏编程之旅七(pygame基础知识讲解1)
与Python自带的random、math、time等模块一样,Pygame框架也带有许多模块来提供绘图、播放声音、处理鼠标输入等功能。
本章将讲述Pygame提供的基本模块及功能,并假设读者已经具有基本的python编程知识,如果在这方面遇到困难,可阅读“Ivent Your Own Computer Games With Python”这本书。
GUI和CLI
使用Python自带的函数print()和input()来操作文本,你的程序可以将文本显示在显示器上并可以让用户从键盘输入文本,这类的程序具有命令行界面(command line interface, 简称CLI),但它不能显示图像、颜色、或者使用鼠标,此类型程序仅通过input()函数接收键盘输入,并当用户按下回车键之后才对输入进行响应,所以它不适合实时动作游戏的开发。
Pygame提供了编写用户图形界面(graphicaluser interface, 简称GUI)程序的功能,来替代基于文本的CLI程序,GUI程序可以显示具有图像和颜色的窗口。
Pygame版本的HelloWorld程序
我们将使用Pygame编写一个显示“Hello World”的窗口程口程序,源码如下:
- import pygame, sys
- from pygame.locals import *
- pygame.init()
- DISPLAYSURF = pygame.display.set_mode((400, 300))
- pygame.display.set_caption('Hello World!')
- while True: # main game loop
- for event in pygame.event.get():
- if event.type == QUIT:
- pygame.quit()
- sys.exit()
- pygame.display.update()
运行程序,出现如下一个空窗口:

是的,你刚刚制造了世界上最无聊的一个游戏,它仅仅在窗口的标题上显示了“Hello World”,但创建窗口是图形界面游戏的第一步,当你点击窗口右上角的关闭按钮,程序将会退出,并且窗口消失。
如果调用print()函数来显示文本在窗口上,它将不能工作,因为print()是CLI程序的函数,input函数也是一样。Pygame使用其他的函数提供输入及输出,这些将在本章的后面讲述,让我们先解读一下“Hello World”程序每一行的含义。
建立一个Pygame程序
此程序中的第一行是几乎所有pygame程序必备的。
- import pygame, sys
此行使用import 语句导入程序中要使用的pygame和sys模块,pygame模块提供了图形、声音等函数。
注意,当你导入了pygame模块,你将默认地导入了pygame的所有子模块,例如pygame.images,pygame.mixer.music等,所以没有必要再导次导入它们。
- from pygame.locals import *
第2行也是import语句,但它没有使用import modulename的格式,而使用from modulename import *的格式,通常,如果你要调用一个模块中的函数,必须使用modulename.functionname()的格式,然而,使用frommodulename improt *的格式,将不用模块名称前缀,直接使用函数名称即可(就像Python内置函数一样)。
我们导入pygame.locals的原因是因为它包含了许多Pygame提供的常量。from … import *这种格式使我们不用在常量名称前添加pyame.locals前缀。
- pygame.init()
第4行调用了pygame.init()函数,它必须在导入pygame模块之后,且开始使用Pygame提供的任何函数前调用,你不必知道此函数的作用,只需要知道,为了使用pygame函数能正常工作,必须在一开始就调用它。如果你碰到像pygame.error: font not initialized这样的错识,请检查一下是否忘记了在程序前面调用pygame.init()。
- DISPLAYSURF = pygame.display.set_mode((400, 300))
第5行调用了pygame.display.set_mode()函数,它将返回一个当前窗口的pygame.Surface对象(Surface对象将在本章后面描述),注意,你给函数传入了一个具有两个整形值的元组,这个元组通知set_mode()函数当前窗口的宽和高(单位为像素),(400, 300)将建立一个宽400像素、高300像素的窗口。
请记住需要传递一个带有两个整形的元组类型变量给set_mode()函数,而不是两个独立的数字,正确的调用方法是:pygame.display.set_mode((400, 300))。像pygame.display.set_mode(400,300)将产生一个如TypeError: argument 1 must be 2-item sequence, not int的错误。
返回的pygame.Surface将被保存在变量DISPLAYSURF中。
- pygame.display.set_caption('Hello World!')
第6行调用pygame.display.set_caption()来设置标题栏上的文本。
游戏循环和游戏状态
- while True: # main game loop
- for event in pygame.event.get():
第7行是带了条件为True的while循环语句,它表示一个无限循环,退出循环的方式只有在while循环中使用break语句(使执行重新从while的下一行开始)或者使用sys.exit()函数(它将结束整个程序)。
本书中的所有游戏均具有while True循环,并注明“main game loop”字样的注释。一个游戏循环主要做以下三件事情:
1. 处理事件
2. 更新游戏状态
3. 在屏幕上绘图
游戏状态可理解为程序中所有变量的值的集合,在有些游戏中,游戏状态包括存放人物健康和位置的变量,这些值可以以分数形在屏幕上显示,如果人物受到伤害,健康值将减少,我们称这些均为为游戏状态改变。
保存游戏也是如此,大多数游戏中,暂停表示使用游戏状态变化停止。
游戏状态通常随事件的发生而改变,例如鼠标点击、键盘输入、或者时间的流失,游戏循环在一秒中执行多次来不挺地检查是否有新事件产生,并且会根据事件来更新游戏状态,这通常叫做事件处理。

pygame.event.Event 对象
用户可能会不时地做一些操作,如按键、在窗口中移动鼠标,这时,一个pygame.event.Event对象将产生,此对象定义在pygame.event模块中,可以使用pygame.event.get()函数来捕获这些事件,这将返回一个pygame.event.Event对象的列表。这个列表中包含了pygame.event.Event函数调用后的所有事件。
- while True: # main game loop
- for event in pygame.event.get():
第8行将pygame.event.get()捕获到的事件逐一取出并赋值给event变量,例如用户点击了鼠标并且按键,鼠标点击事件将先返回,紧接着按键事件返回,如果没有事件产生,pygame.event.get将返回一个空的列表。
QUIT事件和pygame.quit()函数
- if event.type == QUIT:
- pygame.quit()
- sys.exit()
Event对象具有一些表示事件的成员变量(或者称为属性),第9行检查如果事件对象的类型是否为QUIT,记住,我们使用了from pygame.locals improt *的格式,这样将可以用QUIT来替代pyame.locals.QUIT 这种形式。
如果事件类型为退出,将调用pygame.quit()和sys.exit()函数,pygame.quit()与pygame.init()作用相反,它将注销pygame库,程序应该在调用sys.exit()前调用pygame.quit()。
我们没有使用if语句来处理其他的事件,例如鼠标点击、按键等,所以这些事件虽然会产生,但程序不做处理。
- pygame.display.update()
第12行调用pygame.display.update()函数来绘制由pygame.display.set_mode()函数返回的Surface对象,如果Surface对象没有变化,每次调用pygame.dispaly.update()时一个空白的图像将会在屏幕上绘制。
整个程序讲解完毕,除过显示一个空白窗口在屏幕上之外,此程序什么都没做,接下来我们将学习如何在窗口上显示一些有趣的东西,在这之前,需要了解像素、Surface 对象、Color对象、Rect对象,以用pygame的绘图函数。
注:最近计划翻译Sweigart的《Making Games with Python & Pygame》这本书,所有内容会依据进度发布与此博客。原书可在http://inventwithpython.com/上找到。
Python:pygame游戏编程之旅七(pygame基础知识讲解1)的更多相关文章
- python基础知识讲解——@classmethod和@staticmethod的作用
python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...
- 【python游戏编程之旅】第七篇---pygame中的冲突检测技术
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...
- 【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中冲突检测技术:http://www.cnblogs.com/msxh/ ...
- 【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...
- 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...
- 【python游戏编程之旅】第三篇---pygame事件与设备轮询
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame中的IO.数据http://www.cnblogs.com/msxh/ ...
- 【python游戏编程之旅】第一篇---初识pygame
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 一.pygame简介 Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础 ...
- 【Python游戏编程01--初步认识pygame】
一.pygame简介 Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础上开发.允许你在 Python 程序中创建功能丰富的游戏和多媒体程序,Pygame 是一个高 ...
- 【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷 ...
- 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...
随机推荐
- Honor X20 忽然不能与Android Studio 连接
背景:前一天还正常使用,可以连接Android Studio,第二天就连不上了 已知:数据线没问题,驱动没问题,设备开了开发者模式,连接上电脑时会提示已连接USB调试, 测试过程:(点击撤销USB调试 ...
- 淘宝开放平台api申请,淘宝开放平台api租用,淘宝开放平台api无法申请,淘宝开放平台api暂停接入
目前淘宝开放平台应用申请是关闭了的,已经无法申请到了,如果你是天猫店铺,可以申请供自己店铺使用的权限,如果你不是天猫店铺或者你是软件开发商,目前是申请不到权限的 如果你必须要用到这个权限包的话,可以联 ...
- Ubuntu开机直接进入grub终极解决方法
https://zhuanlan.zhihu.com/p/59062434 我遇到的问题是,每一步都操作没问题,但是开机还是会进入grub.最后只能进bios解决了. 我的服务器是supermicro ...
- JS常见的API扩展形式(prototype、jquery、vue插件封装)以及怎样设计出易扩展的表单验证功能?
常见的API扩展形式 prototype 比如我现在有一个需求,给定一个字符串,给方法传递一个参数为数字类型来确定当前字符串重复次数,例如: 'abc'.repeatStringNumTimes(3) ...
- webpack笔记-生产环境与开发环境常用plugin介绍(五)
mode 和 plugin 前边我们介绍 mode 时提过,mode 不同值会影响 webpack 构建配置,其中有一个就是会启用 DefinePlugin 来设置process.env.NODE_E ...
- CSS – Design System
介绍 这篇 Tailwind CSS 的教程:Translating a Custom Design System to Tailwind CSS 充分的体现了什么是 Design System. 设 ...
- C++ STL(标准模版库)—— vector 与 迭代器
STL 基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称. STL 从广义上讲分为三类:algorithm(算法).containe ...
- php7新内容总结(随时更新)
一.参数和返回值类型申明 可以申明的有:float,int,bool,string,interfaces,array,callable 一般模式: function sum(int ...$ints) ...
- maven的pom.xml基础配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Android复习(六)核心组件—>Activity 简介、生命周期、状态变更
1. 可以在activity上声明权限,来保证只在进入某个activity是否有某种权限 <manifest> <activity android:name="....&q ...