用Python和Pygame写游戏-从入门到精通(1)

From: http://eyehere.net/2011/python-pygame-novice-professional-1/

博客刚开,打算做一个Pygame的系列,翻译自Will McGugan的《Beginning Game Development with Python and Pygame –From Novice to Professional》,有兴趣的朋友可以搜一下,有英文版的PDF可以下载。其实也不是翻译,把精华摘出来,共同学习。

看这个系列需要有Python的基础知识,虽然一开始想写一篇Python概要的,实在是很庞杂,而且有那么多好的Python基础教程,自己就不多插一脚了吧。入门的话,有Python入门,详尽的话,可以看看Python核心编程或者Python编程金典,然后IBM上的“可爱的Python”系列也很不错,可以扩展一下思维。

OK,让我们开始吧~

Pygame的历史



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

SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。Pygame已经存在很多时间了,许多优秀的程序员加入其中,把Pygame做得越来越好。

安装Pygame

你可以从www.pygame.org下载Pygame,选择合适你的操作系统和合适的版本,然后安装就可以了(什么,你连Python都没有?您可能是不适合看这个系列了,不过如果执意要学,很好!快去www.python.org下载吧!)。 一旦你安装好,你可以用下面的方法确认下有没有安装成功:

1
2
3
>>> import pygame
>>> print pygame.ver
1.9.1release

你的版本可能和我不同,这没关系。我所翻译的这本书上的版本还是1.7.1的……所以如果有些过时的不合时宜的东西,千万不要客气请指出来!

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

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

使用Pygame

Pygame有很多的模块,下面是一张一览表:

模块名 功能
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
2
3
if pygame.font is None:
    print "The font module is not available!"
    exit()

新的Hello World

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python
background_image_filename = 'sushiplate.jpg'
mouse_image_filename = 'fugu.png'
#指定图像文件名称
import pygame
#导入pygame库
from pygame.locals import *
#导入一些常用的函数和常量
from sys import exit
#向sys模块借一个exit函数用来退出程序
pygame.init()
#初始化pygame,为使用硬件做准备
screen = pygame.display.set_mode((640, 480), 0, 32)
#创建了一个窗口
pygame.display.set_caption("Hello, World!")
#设置窗口标题
background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
#加载并转换图像
while True:
#游戏主循环
    for event in pygame.event.get():
        if event.type == QUIT:
            #接收到退出事件后退出程序
            exit()
    screen.blit(background, (0,0))
    #将背景图画上去
    x, y = pygame.mouse.get_pos()
    #获得鼠标位置
    x-= mouse_cursor.get_width() / 2
    y-= mouse_cursor.get_height() / 2
    #计算光标的左上角位置
    screen.blit(mouse_cursor, (x, y))
    #把光标画上去
    pygame.display.update()
    #刷新一下画面

这个程序需要两张图片,你可以在这篇文章最后的地方找到下载地址,虽然你也可以随便找两张。为了达到最佳效果,背景的 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程序的印象,接下来我们会学习更多深层次的东西,并且把各条语句都真正读懂。

>> 用Python和Pygame写游戏-从入门到精通(2)

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

背景:sushiplate.jpg

光标:fugu.png

Tags: pygame, Python, 游戏开发 Posted in Python by xishui.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决el-select后台一次返回大数据量渲染慢导致页面卡顿的问题

场景一 解决了一次性渲染大量数据问题 业务场景是后台一次返回10万多条数据需要在下拉框中展示,直接渲染会导致页面卡顿且需要很长时间等待,用户体验极差,所以我把这个改造了一下,直接上代码, 里面注释写的很清楚了就不解释了. <template><div class"content&q…

在诺基亚S60v3上运行.NET程序

诺基亚手机采用的几乎都是Symbian OS操作系统。而.NET Framework则是Windows平台的专利&#xff0c;因此.NET程序只能运行在使用Windows Mobile系统的手机上。那么Symbian OS是否就没法运行.NET程序了呢&#xff1f; 答案是否定的。RedFiveLabs一直致力于在Symbian OS上实现.NE…

React开发(162):React关于 this.props.children 总结

this.props.children 的值有三种可能&#xff1a; 如果当前组件没有子节点&#xff0c;它就是 undefined ; 如果有一个子节点&#xff0c;数据类型是 Object&#xff1b; 如果有多个子节点&#xff0c;数据类型就是 Array。

响应式布局---菜单

一个简单的响应式菜单,仅使用media query实现. 上图的作用就是将普通的菜单在缩小浏览器屏幕到一定宽度,或者是在移动设备上的显示效果.现在分步进行实现: 第一步:先构建一个普通的菜单,具体显示如图: 结构如下: <nav class"nav"><ul><li class"…

Element el-row el-col 布局组件详解

本文目录 背景分栏布局分栏间隔分栏偏移对齐方式响应式布局小结 1. 背景 element的布局方式与bootstrap原理是一样的&#xff0c;将网页划分成若干行&#xff0c;然后每行等分为若干列&#xff0c;基于这样的方式进行布局&#xff0c;形象的成为栅栏布局。 区别是element可…

C# WinForm 中Label自动换行 解决方法

From: http://hi.baidu.com/tewuapple/blog/item/74070a2451cbcc7c36a80f76.html 在TableLayoutPannel中放着一些Label 如果把Label的AutoSize属性设成True的话&#xff0c;文字超过label长度时就会自动增加&#xff0c;直到后面的字出窗体以外 设置成False时&#xff0c;一旦…

项目最终复审报告

“北航学堂”项目最终复审报告 一、团队成员简介 Sevens团队在M1和M2阶段都是一共有七名队员&#xff0c;M1阶段我们的团队成员有&#xff1a;陈少杰&#xff0c;金鑫&#xff0c;高孟烨&#xff0c;雷元勇&#xff0c;王迪&#xff0c;邓亚梅&#xff0c;郑培蕾&#xff1b;在…

旁门左道也谈cacti安装

cacti作为一个优秀的流量监控软件&#xff0c;很多人都在用它&#xff0c;很多人也很想使用它。但是后面的这很多人&#xff0c;确没有能用上它。为啥呢&#xff1f;有句话说&#xff1a;“今天很难过&#xff0c;明天很难熬&#xff0c;后天很美好&#xff0c;但是很多人在明天…

js二进制流转Blob对象。Blob对象再转File对象

JavaScript 二进制转文件 使用js将blob对象转file对象 前端处理后端返回的二进制流文件 js中Blob对象一般用法 js中关于Blob对象的介绍与使用 上传的文件对象 完整代码实例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8…

element-ui cascader 级联选择器 存最后一级id及回显

:props"{emitPath:false}" 加上这行就可以&#xff0c;只存最后一级id&#xff0c;且以最后一级id完整回显。<el-cascader expand-trigger"click" placeholder"请输入" filterable clearable:props"{emitPath:false}":options"…

freebsd点到点的ipsec ***

使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 ,以实现两个网络通过通道互访&#xff0c;IPsec 是一种建立在 Internet 协议 (IP) 层之上的协议&#xff0c;它能够让两个或更多主机以安全的方式来通讯&#xff0c;IPsec 既可以用来直接加密主机之间的网络通讯 (也就是…

怎么使用7zip进行分批压缩_怎么使用钢结构抛丸机对钢结构进行除锈?

我们生活中所见的钢结构用的时间长了以后都会产生锈渍&#xff0c;表面还会存在各种污浊物&#xff0c;所以说除锈处理是钢结构生产环节的一道主要工序&#xff0c;如果处理不好直接影响钢结构的品质和质量&#xff0c;使钢结构的维修周期缩短或影响使用寿命&#xff0c;有时会…

(简单) POJ 3984 迷宫问题,BFS。

Description 定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜着走&…

一个托盘程序演示 -闹钟 Alert

From: http://www.vckbase.com/document/viewdoc/?id996 下载源代码 关键字&#xff1a;托盘 Tray   想必大家都看见过那些在系统托盘&#xff08;Tray&#xff09;中的程序吧&#xff0c;本文就演示了如何创建一个这样的托盘程序Alert。Alert是一个运行在系统托盘中的小…

adam算法效果差原因_冷库制冷效果差原因

冷库常见的现象有冷库温度降不下来和下降缓慢的时候&#xff0c;现在对库温下降缓慢的原因简单分析&#xff1a;1、冷库工程由于隔热或密封性能差&#xff0c;导致冷量损耗大隔热性能差是由于管道、库房隔热墙等的保温层厚度不够&#xff0c;隔热和保温效果不良&#xff0c;它主…

解决hive交互模式退格键乱码

在hive的交互模式下&#xff0c;输入退格、方向键等&#xff0c;出现乱码&#xff0c;可以通过如下方法解决&#xff1a; 1、修改bashrc文件&#xff1a; vi ~/.bashrc 在文件最后添加一行&#xff1a; stty erase ^H。 2、使修改生效&#xff1a; source ~/.bashrc 这样&#…

VS2010删除所有断点时不弹出提示窗口

用VS.NET平台程序时&#xff0c;如何才能在删除所有断点时不弹出提示窗口呢&#xff1f;请看下图&#xff0c;马上明白&#xff1a;