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

使用Surface对象

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

创建Surfaces对象

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

Python

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

1

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

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

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

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

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

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

Python

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

1

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

转换Surfaces

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

Python

background = pygame.image.load(background_image_filename).convert()

mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()

1

2

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 *就可以直接用这个对象了),比如:

Python

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))

1

2

3

4

5

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))

一旦有了Rect对象,我们就可以对其做很多操作,比如调整位置和大小,判断一个点是否在其中等等。以后会慢慢接触到,求知欲旺盛的可以在http://www.pygame.org/docs/ref/rect.html中找到Rect的详细信息。

剪裁(Clipping)

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

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

Python

screen.set_clip(0, 400, 200, 600)

draw_map()

#在左下角画地图

screen.set_clip(0, 0, 800, 60)

draw_panel()

#在上方画菜单面板

1

2

3

4

5

6

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把字母一个一个“抠”出来,就像下面这样:

Python

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))

1

2

3

4

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填上一种颜色:

Python

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

1

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

同样可以提供一个矩形来制定填充哪个部分(这也可以作为一种画矩形的方法)。

设置Surface的像素

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

Python

import pygame

from pygame.locals import *

from sys import exit

from random import randint

pygame.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))

#screen.lock() #很快你就会知道这两句lock和unlock的意思了

for _ in xrange(100):

rand_pos = (randint(0, 639), randint(0, 479))

screen.set_at(rand_pos, rand_col)

#screen.unlock()

pygame.display.update()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

importpygame

frompygame.localsimport*

fromsysimportexit

fromrandomimportrandint

pygame.init()

screen=pygame.display.set_mode((640,480),0,32)

whileTrue:

foreventinpygame.event.get():

ifevent.type==QUIT:

exit()

rand_col=(randint(0,255),randint(0,255),randint(0,255))

#screen.lock() #很快你就会知道这两句lock和unlock的意思了

for_inxrange(100):

rand_pos=(randint(0,639),randint(0,479))

screen.set_at(rand_pos,rand_col)

#screen.unlock()

pygame.display.update()

获得Surface上的像素

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

锁定Surface

当Pygame往surface上画东西的时候,首先会把surface锁住,以保证不会有其它的进程来干扰,画完之后再解锁。锁和解锁时自动发生的,所以有时候可能不那么有效率,比如上面的例子,每次画100个点,那么就得锁解锁100次,现在我们把两句注释去掉,再执行看看是不是更快了(好吧,其实我没感觉出来,因为现在的机器性能都不错,这么点的差异还不太感觉的出来。不过请相信我~复杂的情况下会影响效率的)?

当你手动加锁的时候,一定不要忘记解锁,否则pygame有可能会失去响应。虽然上面的例子可能没问题,但是隐含的bug是我们一定要避免的事情。

Blitting

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

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

Python

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

1

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

这次东西真是不少,打完脖子都酸了……

很多以前的程序中已经出现,看完这部分才能算是真正了解。图像是游戏至关重要的一部分,值得多花时间,下一次讲解绘制图形~

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

  1. HTML5游戏_基于DOM平台跳跃小游戏开发_9.按键监听

    HTML5游戏_基于DOM平台跳跃小游戏开发 按键监听 视频讲解 HTML5游戏 效果图 本章知识点: 对象自定义名称属性,可以用变量来命名属性名称 //这段代码把多个属性(品牌, 型号, 排量)赋给 ...

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

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

  3. pygame做的著名游戏_用python写游戏之2D跑酷游戏(一)

    2D的跑酷游戏有很多,著名的例如Chrome的彩蛋小游戏,手机上的天天酷跑等. 打开Chrome浏览器输入 chrome://dino/,按空格激活彩蛋 这篇文章来分析一下这类横版跑酷游戏的主角奔跑, ...

  4. python pygame模块怎么写游戏_使用 Python 和 Pygame 模块构建一个游戏框架

    这系列的第一篇通过创建一个简单的骰子游戏来探究 Python.现在是来从零制作你自己的游戏的时间. 在我的这系列的第一篇文章 中, 我已经讲解如何使用 Python 创建一个简单的.基于文本的骰子游戏 ...

  5. pygame做的著名游戏_用Python和Pygame写游戏-从入门到放弃(1)

    Pygame的介绍 Pygame是一组专门为编写游戏设计的Python模块,增加了SDL库功能.可以使你在Python语言中轻松的创建全功能的游戏和多媒体程序. Pygame是免费的,在GPL许可下发 ...

  6. 用python写数字_用python 写游戏之数字华容道

    当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏.写2048游戏的时候,又想起了这个游戏,想着来研究一下. 游戏玩法 用尽量少的步数,尽量短的时间,将棋盘上的数字方块,按照 ...

  7. 使用python制作聊天框解谜游戏_使用Python写一个小游戏alien invasion!

    最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的 ...

  8. 我的世界python写游戏_用python写游戏之 Give it up

    <永不言弃 Give It Up>,这是一款极具虐心色彩的音乐题材闯关游戏. 这篇文章就来分析这款游戏原理,并用python写出来一个简易版.废话不多说,直接开始分析. 游戏元素,暂且把主 ...

  9. python实现消消乐游戏_用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

最新文章

  1. 日本語を勉強するの日記(八)
  2. 执行命令npm install XXX后仍然提示 Cannot find Module XXX
  3. Epoll 的tcp通信代码(服务器+客户端)
  4. 【Servlet】Servlet体系结构
  5. Elasticsearch性能监控(一)
  6. MyBatis框架笔记01:MyBatis初探
  7. React 编程思想 正反向数据流(单向数据流) 为了好理解我才叫正反向
  8. C# UDP通讯实例
  9. Oracle分页查询
  10. PDFLib去水印办法
  11. 开源中国正式挂牌,新三板首家软件众包平台
  12. pytorch drop_last参数
  13. 毕业设计之 --- 基于大数据分析的金融产品销售预测分析
  14. Linux定时任务配置
  15. linux查询数据库归档日志,关于 Oracle 归档日志
  16. 手机链游撼动腾讯王者荣耀?Nova Battles更具潜力
  17. hr面试性格测试30题_面试性格测试题60道
  18. 基于matlab的数值分析实例研究,基于MATLAB的数值分析答辩.ppt
  19. 计算机学院年会,全国高等院校计算机基础教育研究会2019学术年会在我校成功举办...
  20. Ubuntu20.04安装Nvidia显卡驱动后屏幕不显示的问题

热门文章

  1. pwn——ciscn_2019_n_1#pwn1_sctf_2016#jarvisoj_level0
  2. Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
  3. QBASIC+dosbox成功实现声卡输出
  4. 关于博世热水器售后维修的问题(收费乱,态度劣)
  5. BICOMB文献统计软件
  6. PBI培训(3):PBI常用DAX、M语言函数
  7. 标准化智慧工地主要包括哪些方面
  8. WEB站点之 吞吐率、吞吐量、TPS、性能测试
  9. 【项目经验】转:双十一谈如何从零开始搭建大型机票交易平台
  10. Docker部署Emqx并配置ssl支持微信小程序