打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
子沐课堂——Pygame之吃货的诱惑

第一章Pygame

本章工作任务

  • 任务1:什么是pygame

  • 任务2:如何安装pygame

  • 任务3:如何使用pygame

  • 任务4:Hello World

本章技能目标及重难点

编号技能点描述级别
1什么是pygame
2如何安装pygame★★
3u如何使用pygame★★★
4Hello World★★

注: '★'理解级别 '★★'掌握级别 '★★★'应用级别

本章学习目标

本章开始学习Pygame,需要同学们理解pygame的历史,如何安装、有哪些模块。最主要的是如何使用pygame做一个hello world。

本章学习建议

本章适合有Python基础的学员学习。

本章内容(学习活动)

1.1什么是Pygame


Pygame是一个利用SDL库的写就的游戏库,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛写的,据说他为了让Loki(致力于向Linux上移植Windows的游戏的一家大好人公司,可惜已经倒闭,唉,好人不长命啊……)更有效的工作,创造了这个东东。

SDL是用C写的,不过它也可以使用C 进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。Pygame已经存在很多时间了,许多优秀的程序员加入其中,把Pygame做得越来越好,今天我就来给大家说说,游戏不仅仅可以使用Unity 3D做,我们也可以用Pygame做。

有人会提出疑问,为什么要介绍这么一个“过时”的东西?

我的回答是真正的知识是不会过时的,只有技术才会。这里主要是依靠Pygame来介绍的游戏开发的方方面面,并不是说咱就可以靠这个做出什么伟大的游戏了(当然也不是说不可以)!

另外说一下,就产品而言,Pygame更致力于2D游戏的开发,也就是说,你可以用Pygame写一个植物大战僵尸,但是写一个魔兽世界则相当困难……请不要做出鄙夷的目光,底层的东西永远是相通的,而且对于新手而言,从简单的2D入手才是正途。

1.2 如何安装pygame

Pip大法好,pip作为python包管理器,怎么会没有我们伟大的Pygame呢?

所以简单暴力直接敲命令:

Pip install pygame

来看看运行结果:

1.3如何使用pygame

1.3.1Pygame模块

模块名功能
pygame.cdrom访问驱动
pygame.cursors加载光标
pygame.display访问显示设备
pygame.draw绘制形状、线、点
pygame.event管理事件
pygame.font使用字体
pygame.image加载和存储图片
pygame.joystick使用游戏手柄或类似的东西
pygame.key读取键盘按键
pygame.mixer声音
pygame.mouse鼠标
pygame.movie播放视频
pygame.music播放音频
pygame.overlay访问高级视频叠加
pygame就是我们在学的这个东西
pygame.rect管理矩形区域
pygame.sndarray操作声音数据
pygame.sprite操作移动图像
pygame.surface管理图像和屏幕
pygame.surfarray管理点阵图像数据
pygame.time管理时间和帧信息
pygame.transform缩放和移动图像

有些模块可能在某些平台上不存在,你可以用None来测试一下。

1.3.2 pygame.event

本小节就Pygame中也是游戏中最关键(……好吧,也许并不是最关键,但绝对是至关重要的一项)的事件来展开。

事件是什么,其实从名称来看我们就能想到些什么,而且你所想到的基本就是事件的真正意思了。我们上一个程序,会一直运行下去,直到你关闭窗口而产生了一个QUIT事件,Pygame会接受用户的各种操作(比如按键盘,移动鼠标等)产生事件。事件随时可能发生,而且量也可能会很大,Pygame的做法是把一系列的事件存放一个队列里,逐个的处理。

下表是一个常用事件集:

事件产生途径参数
QUIT用户按下关闭按钮none
ATIVEEVENTPygame呗激活或者隐藏gain,state
KEYDOWN键盘被按下unicode,key,mod
KEYUP键盘被放开key,mod
MOUSEMOTION鼠标移动pos,rel,buttons
MOUSEBUTTONDOWN鼠标按下pos,button
MOUSEBUTTONUP鼠标放开pos,button
JOYAXISMOTION游戏手柄移动(Joystick or pad)移动joy,axis,value
JOYBALLMOTION游戏球移动(Joy ball)移动joy,axis,value
JOYHATMOTION游戏手柄(Joystick)移动joy,axis,value
JOYBUTTONDOWN游戏手柄按下joy,button
JOYUBTTONUP游戏手柄放开joy,button
VIDEORESIZEPygame窗口缩放size,w,h
VIDEOEXPOSEPygame窗口部分公开none
USEREVENT出发了一个用户时间code

如果你想把这个表现在就背下来,当然我不会阻止你,但实在不是个好主意,在实际的使用中,自然而然的就会记住。

1.3.3 pygame.surface

掌握了小小的像素,我们可以使用更加复杂一点的东西了,对,就是图像,无数的像素的集合~还记得上次我们为了生成的一张图片,花了无数时间,还好一般游戏不会在游戏的过程中动态生成图像,都是将画好的作为资源封装到游戏中。对2D游戏,图像可能就是一些背景、角色等,而3D游戏则往往是大量的贴图。

虽然是基础,这里还是要罗嗦一下,之前说的RBG图像,在游戏中我们往往使用RGBA图像,这个A是alpha,也就是表示透明度的部分,值也是0~255,0代表完全透明,255是完全不透明,而像100这样的数字,代表部分透明。你可以使用多种软件创建含有Alpha通道的图片,具体的网上查查吧……

这个世界上有很多存储图像的方式(也就是有很多图片格式),比如JPEG、PNG等,Pygmae都能很好的支持,具体支持的格式如下:

  • JPEG(Join Photograhpic Exper Group),极为常用,一般后缀名为.jpg或者.jpeg。数码相机、网上的图片基本都是这种格式。这是一种有损压缩方式,尽管对图片质量有些损坏,但对于减小文件尺寸非常棒。优点很多只是不支持透明。

  • PNG(Portable Network Graphics)将会大行其道的一种格式,支持透明,无损压缩。对于网页设计,软件界面设计等等都是非常棒的选择!

  • GIF 网上使用的很多,支持透明和动画,只是只能有256种颜色,软件和游戏中使用很少

  • BMP Windows上的标准图像格式,无压缩,质量很高但尺寸很大,一般不使用

  • PCX

  • TGA

  • TIF

  • LBM, PBM

  • XPM

对于Pygame而已,加载图片就是pygame.image.load,给它一个文件名然后就还给你一个surface对象。尽管读入的图像格式各不相同,surface对象隐藏了这些不同。你可以对一个Surface对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个surface,pygame.display.set_mode就返回了一个屏幕surface对象。

一种方法就是刚刚说的pygame.image.load,这个surface有着和图像相同的尺寸和颜色;另外一种方法是指定尺寸创建一个空的surface,下面的语句创建一个256×256像素的surface:

bland_surface = pygame.Surface((256, 256))

如果不指定尺寸,那么就创建一个和屏幕一样大小的。

你还有两个参数可选,第一个是flags:

HWSURFACE – 类似于前面讲的,更快!不过最好不设定,Pygmae可以自己优化。

SRCALPHA – 有Alpha通道的surface,如果你需要透明,就要这个选项。这个选项的使用需要第二个参数为32~

第二个参数是depth,和pygame.display.set_mode中的一样,你可以不设定,Pygame会自动设的和display一致。不过如果你使用了SRCALPHA,还是设为32吧:

bland_alpha_surface = pygame.Surface((256, 256), flags=SRCALPHA, depth=32)

通常你不用在意surface里的具体内容,不过也许需要把这些surface转换一下以获得更高的性能,还记得一开始的程序中的两句话吗:

第一句是普通的转换,相同于display;第二句是带alpha通道的转换。如果你给convert或者conver_alpha一个surface对象作为参数,那么这个会被作为目标来转换。

1.4简单的Hello World

学程序一开始我们总会写一个Hello world程序,但那只是在屏幕上写了两个字,现在我们来点更帅的!

一言不合,我们就来一段代码,面对疾风吧。

这个程序需要两张图片,你可以在这篇文章最后的地方找到下载地址,虽然你也可以随便找两张。为了达到最佳效果,背景的 sushiplate.jpg应要有640×480的分辨率,而光标的fugu.png大约应为80×80,而且要有Alpha通道(如果你不知道这是什么,还是下载吧……)。

注意:代码中的注释我使用的是中文,如果执行报错,可以直接删除。

游戏中我已经为每一行写了注释,另外如果打算学习,强烈建议自己动手输入一遍而不是复制粘贴!

稍微讲解一下比较重要的几个部分:

set_mode会返回一个Surface对象,代表了在桌面上出现的那个窗口,三个参数第一个为元祖,代表分 辨率(必须);第二个是一个标志位,具体意思见下表,如果不用什么特性,就指定0;第三个为色深。

标志位功能
FULLSCREEN创建全屏窗口
DOUBLEBUF创建一个“双缓冲”窗口,建议在HWSURFACE或者OPENGL时使用
HWSURFACE创建一个硬件加速的窗口,必须和FULLSCREEN同时使用
OPENGL创建一个OPENGL渲染的窗口
RESIZABLE创建一个可以改变大小的窗口
NOFRAME创建一个没有边框的窗口

convert函数是将图像数据都转化为Surface对象,每次加载完图像以后就应该做这件事件(事实上因为 它太常用了,如果你不写pygame也会帮你做);convert_alpha相比convert,保留了Alpha 通道信息(可以简单理解为透明的部分),这样我们的光标才可以是不规则的形状。

游戏的主循环是一个无限循环,直到用户跳出。在这个主循环里做的事情就是不停地画背景和更新光标位置,虽然背景是不动的,我们还是需要每次都画它, 否则鼠标覆盖过的位置就不能恢复正常了。

blit是个重要函数,第一个参数为一个Surface对象,第二个为左上角位置。画完以后一定记得用update更新一下,否则画面一片漆黑。

这是一个最最大概的Pygame程序的印象。

本次使用的两张图片资源:

背景:sushiplate.jpg (http://eyehere.net/wp-content/uploads/2011/04/sushiplate.jpg)

光标:fugu.png (http://eyehere.net/wp-content/uploads/2011/04/fugu.png)

吃货的诱惑

本章工作任务

u 任务1:实战做个小游戏

本章技能目标及重难点

编号

技能点描述

级别

1

实战做个小游戏

★★★

注: '★'理解级别 '★★'掌握级别 '★★★'应用级别

本章学习目标

本章实战Pygame做一个小游戏。

本章学习建议

本章适合有PyGame基础的学员学习。

本章内容(学习活动)

1.1代码


1.2运行效果

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
pygame菜鸟入门指南
用Python和Pygame写游戏
Pygame 图片旋转 缩放
童年记忆第三弹!!!用python写一个天天酷跑
Pygame 官方文档
Pygame写游戏-2:理解事件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服