虽然是基础,这里还是要罗嗦一下,之前说的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

使用Surface对象

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

创建Surfaces对象

一种方法就是刚刚说的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)

转换Surfaces

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

background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()

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

矩形对象(Rectangle Objects)

一般来说在制定一个区域的时候,矩形是必须的,比如在屏幕的一部分画东西。在pygame中矩形对象极为常用,它的指定方法可以用一个四元素的元组,或者两个二元素的元组,前两个数为左上坐标,后两位为右下坐标。

Pygame中有一个Rect类,用来存储和处理矩形对象(包含在pygame.locals中,所以如果你写了from pygame.locals import *就可以直接用这个对象了),比如:

my_rect1 = (100, 100, 200, 150)
my_rect2 = ((100, 100), (200, 150))
#上两种为基础方法,表示的矩形也是一样的
my_rect3 = Rect(100, 100, 200, 150)
my_rect4 = Rect((100, 100), (200, 150))

剪裁(Clipping)

通常游戏的时候你只需要绘制屏幕的一部分。比如魔兽上面是菜单,下面是操作面板,中间的小兵和英雄打的不可开交时候,上下的部分也是保持相对不动的。为了实现这一点,surface就有了一种叫裁剪区域(clipping area)的东西,也是一个矩形,定义了哪部分会被绘制,也就是说一旦定义了这个区域,那么只有这个区域内的像素会被修改,其他的位置保持不变,默认情况下,这个区域是所有地方。我们可以使用set_clip来设定,使用get_clip来获得这个区域。

下面几句话演示了如何使用这个技术来绘制不同的区域:

screen.set_clip(0, 400, 200, 600)
draw_map()
#在左下角画地图
screen.set_clip(0, 0, 800, 60)
draw_panel()
#在上方画菜单面板

子表面(Subsurfaces)

Subsurface就是在一个Surface中再提取一个Surface,记住当你往Subsurface上画东西的时候,同时也向父表面上操作。这可以用来绘制图形文字,尽管pygame.font可以用来写很不错的字,但只是单色,游戏可能需要更丰富的表现,这时候你可以把每个字母(中文的话有些吃力了)各自做成一个图片,不过更好的方法是在一张图片上画满所有的字母。把整张图读入,然后再用Subsurface把字母一个一个“抠”出来,就像下面这样:

my_font_image = Pygame.load("font.png")
letters = []
letters["a"] = my_font_image.subsurface((0,0), (80,80))
letters["b"] = my_font_image.subsurface((80,0), (80,80))

填充Surface

填充有时候可以作为一种清屏的操作,把整个surface填上一种颜色:

screen.fill((0, 0, 0))

可以用整个白屏填充屏幕,达到清屏的效果。

设置Surface的像素

我们能对Surface做的最基本的操作就是设置一个像素的色彩了,虽然我们基本不会这么做,但还是要了解。set_at方法可以做到这一点,它的参数是坐标和颜色,下面的小脚本会随机的在屏幕上画点.

import pygame
from pygame.locals import *
from sys import exit
from random import randintpygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)while True:for event in pygame.event.get():if event.type == QUIT:exit()rand_col = (randint(0, 255), randint(0, 255), randint(0, 255))for _ in xrange(100):rand_pos = (randint(0, 639), randint(0, 479))screen.set_at(rand_pos, rand_col)pygame.display.update()

效果图:

获得Surface上的像素

set_at的兄弟get_at可以帮我们做这件事,它接受一个坐标返回指定坐标点上的颜色。不过记住get_at在对hardware surface操作的时候很慢,而全屏的时候总是hardware的,所以慎用这个方法!

get_at:在给定像素处返回RGBA颜色值的副本。 如果Surface没有每个像素的alpha,那么alpha值将始终为255(不透明)。 如果像素位置在Surface的区域之外,则会引发IndexError异常。
逐个获取和设置像素通常太慢而无法用于游戏或实时情况。 最好使用像blit,fill和draw方法一样对许多像素进行操作的方法 - 或者使用surfarray / PixelArray。

该功能将根据需要临时锁定和解锁表面。

set_at:为单个像素设置RGBA或映射的整数颜色值。 如果Surface没有每个像素的alpha,那么alpha值将被忽略。 设置“表面”区域之外或“表面”裁剪之外的像素将不起作用。
逐个获取和设置像素通常太慢而无法用于游戏或实时情况。

该功能将根据需要临时锁定和解锁表面。

锁定Surface

当Pygame往surface上画东西的时候,首先会把surface锁住,以保证不会有其它的进程来干扰,画完之后再解锁。锁和解锁时自动发生的,所以有时候可能不那么有效率,比如上面的例子,每次画100个点,那么就得锁解锁100次

Blitting

blit的的中文翻译给人摸不着头脑的感觉,可以译为位块传送(bit block transfer),其意义是将一个平面的一部分或全部图象整块从这个平面复制到另一个平面,下面还是直接使用英文。

blit是对表面做的最多的操作,我们在前面的程序中已经多次用到,不多说了;blit的还有一种用法,往往用在对动画的表现上,比如下例通过对frame_no的值的改变,我们可以把不同的帧(同一副图的不同位置)画到屏幕上:

screen.blit(ogre, (300, 200), (100 * frame_no, 0, 100, 100))

这一节主要把之前出现过的图像,surface之类的代码问题都做了一个详细的解释。

用Python和Pygame写游戏-从入门到精通(6)学习笔记相关推荐

  1. python教程是用什么博客写的-用Python和Pygame写游戏-从入门到精通(目录)

    目光博客一开始,就有一个将pygame好好介绍一遍的宏伟计划,历时四个月,在各位朋友的关怀鞭策下,如今(2011/8/26)理论学习的部分似乎已经都完成了,在次列一个目录,方便查询.介绍还不是很全,下 ...

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

    From: http://eyehere.net/2011/python-pygame-novice-professional-1/ 博客刚开,打算做一个Pygame的系列,翻译自Will McGug ...

  3. python游戏开发框架_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块1)...

    游戏是为了什么而存在的?Bingo,是为了娱乐~ 在这个最高主题之前,技术啥的什么都无所谓! 前一段时间,有位姓刘的网友用Pygame写了个俄罗斯方块,在用py2exe打包的时候遇到一些问题,和我交流 ...

  4. 用Python和Pygame写游戏-从入门到精通

    博客刚开,打算做一个Pygame的系列,翻译自Will McGugan的<Beginning Game Development with Python and Pygame –From Novi ...

  5. python用户界面游戏_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块2)...

    我们接着来做这个整死人不偿命的俄罗斯方块. 代码组织和名词约定 上一次我们稍微整理了一下游戏运行的框架,这里需要整理一下python代码的框架,一个典型的pygame脚本结构如下: 其中,lib为py ...

  6. 用python和pygame写游戏_用Python和Pygame写游戏-从入门到精通(6)

    掌握了小小的像素,我们可以使用更加复杂一点的东西了,对,就是图像,无数的像素的集合~还记得上次我们为了生成的一张图片,花了无数时间,还好一般游戏不会在游戏的过程中动态生成图像,都是将画好的作为资源封装 ...

  7. python游戏代码示例_用Python和Pygame写游戏-从入门到精通(Sprite篇)

    这又是Pygame教程系列的一个--OVA篇,类似于py2exe篇一样,额外写的,也许不是pygame游戏开发必须的东西,但是知道了绝对大有裨益.因此友情大放送~ 看pygame模块介绍的时候,细心的 ...

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

    经历了长年的艰苦卓绝的披星戴月的惨绝人寰的跋山涉水,我们终于接近了AI之旅的尾声(好吧,实际上我们这才是刚刚开始).这一次真正展示一下这几回辛勤工作的结果,最后的画面会是这个样子: 下面给出完整代码( ...

  9. python编写赛车游戏单机版_用Python和Pygame写游戏-从入门到精通(20)

    声音是游戏中必要的元素之一,音效可以给予用户良好的反馈体验.赛车的时候可以听到振奋人心的启动时的引擎声和刹车时轮胎摩擦声,射击游戏中枪支弹药的音效和呐喊助威的嗓音,无一不是让人热血沸腾的要因. 宛若电 ...

最新文章

  1. cxf使用wsdl文件生成代码
  2. 打印HotSpot VM采用自动优化参数
  3. 动态代理以及对应Spring中AOP源码分析
  4. 拒绝“肌肉记忆”,卡萨帝迈进场景品牌新赛道
  5. 【科研经验】学霸为什么不喜欢给学渣解题?
  6. 【程序员感悟系列】 由一点业务说开去
  7. C语言 fopen 函数 - C语言零基础入门教程
  8. 28 数组中出现次数超过一半的数字
  9. android中打开pdf,在Android应用程序中打开PDF
  10. 如何有效开展小组教学_新型教学方法,小组合作教学,有效的提升了学生的合作技能...
  11. Linux下安装软件命令详解
  12. 普及一下IPTV行业
  13. Ajax (菜鸟教程)学习笔记
  14. 父亲节php源码,剑盟社区-【父亲您在,世界就在】6月20日父亲节系列活动
  15. FLV(ACC+H264)文件格式分析
  16. mapbox-gl开发:带高度的标签
  17. [ ECUG 专题回顾]《再谈 CERL:详论 GO 与 ERLANG 的并发编程模型差异》-许式伟(七牛云存储 CEO)...
  18. 操作系统——存储器管理
  19. 【金猿案例展】中国中车——基于大数据的车辆运维预警监控系统项目
  20. java中atomic特点,Java中Atomic类的使用分析

热门文章

  1. vba传值调用_vba中OnAction属性指定宏名时如何传递参数?
  2. scGPT:单细胞的末日与开端
  3. python(基于字典的学生管理系统)
  4. jzoj3058. 【NOIP2012模拟10.26】火炬手
  5. 全栈学习之JavaWeb基础
  6. 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读
  7. 并网逆变器PQ控制。 逆变器采用两电平逆变器,通过功率闭环控制,实现并网单位功率因数,即并网电流与网侧电压同相位
  8. 2019宽德投资软件开发工程师实习生面试
  9. 汽车线束测试仪怎么保养的
  10. VS2017远程调试 windows 对 windows