Pygame:提高游戏的颜值3


🚴大家好!我是近视的脚踏实地,虽然近视,但是脚踏实地,这一篇继续来谈谈提高游戏的颜值,这一篇主要将讲如何美化我们加载的图片

(一)纸上谈兵

1️⃣图像显示和移动的原理

首先要知道的概念是图像是特定像素的组合,而Surface 对象是Pygame里面对图像的描述,那么在Pygame里面到处都是Surface 对象,set_mode() 返回的是一个Surface对象,在界面上打印文字不好意思,你要先把文字转化成Surface对象然后再贴上去,老污龟🐢在上面爬呀爬,其实就是不断调整Surface对象上的一些特定的像素的位置,把老污龟🐢所在位置的像素进行移动,就相当于老污龟在上面爬,就是调用 blit() 方法。

bg = pygame.image.load(“bg.jpg”).convert()

那么imag.load() 方法载入图像并会返回一个 Surface 对象,所以此前我们就是一直拿来用接可以了,没有对他进行其他的转换, 这样子就是效率比较低的做法。如果你希望你的Pygame可以尽可能高效的处理你的图片,你应该在图片载入之后立刻调用 convert() 方法进行转换。

游戏事实上都是由各种不同的图片组成的,例如说背景是一个图片,里边的主角是图片,反派也是图片,主角的图片画得漂亮点,反派的图片画的黑暗点,然后路人甲乙丙都是图片。你总不可能用一个圆形或者矩阵画一个主角吧,画不出来,我们只能说现实中用Photoshop 画一个惟妙惟肖的主角,然后贴进去,然后使用 blit() 方法让它移动。

2️⃣为什么要使用convert() 方法

那本来image.load() 就返回一个 Surface 对象了,那么还转化个毛啊🤔,其实这里的转换只是像素格式的转换,而不是说转换为Surface 对象,因为image.load() 载入之后本来就是一个 Surface 对象,但是我们载入之后,例如说一张JPG图片,JPG的图片也都是像素组成的,而这些像素都是有颜色的,所以可以看到图片内的各种颜色

另外我们还可以将这个JPG图片保存为PNG或者GIF格式,但是你会发现,尺寸会发生改变,这是因为里边的像素格式发生改变了,也就是说,他组合这些像素,把他,描述的形式发生改变了,那么Surface 也有它自己的像素格式,所以这个转化指的就是图中的像素格式的转换。

如果我们没有在 image.load() 之后立刻对它进行转换,因为转化非常重要,所以我们的pygame也会在调用 blit() 方法时自动进行转化,即把一张图片贴到另一张图片上面的时候,因为两个图片要进行一个粘贴(复制) 的操作,那么他们的像素格式必须相同

因为要求像素格式必须相同,因此在每次 blit() 的时候,它都会强制转换一次,这样子效率就相当低了,与其让它每次循环去转换一次,我们还不如在载入时调用 convert() 方法将载入的图片转换为 Surface 的像素格式。因为现在的CPU速度是非常快的,所以你是基本上是看不出来的,我们都希望我们的程序小一点、效率高一点。今后我们都会在 image.load() 之后立刻调用 convert()。

3️⃣convert() 的兄弟 convert_alpha()

turtle = pygame.image.load(“python.png”).convert_alpha()

那么转化的方法除了convert() ,还有一个就是 convert_alpha() 方法,那他们之间有什么区别呢🤔,一般情况下,我们使用 RGB(Red Green Blue) 来描述一个颜色,然而在游戏开发中,我们常常用到的是 RGBA(Red Green Blue Alpha), Alpha是指Alpha通道,他是用来表示透明度的,A 占用一个字节,也就是8位(0-255,256种层次)2的8次方嘛,那么它用序号来索引,就是0-255,0表示完全透明,255表示完全不透明。那么100就是在透明与不透明之间偏向于透明一点,而200就是在透明与不透明之间偏向于不透明一点

那么前面说了image.load() 支持多种格式的图片导入,例如 gif、jpg、png等,这些都是当前流行的图片格式,那么对于包含 Alpha 通道的图片,我们就要用 convert_alpha() 方法来转换格式了,其它的就用 convert() 方法。

在这里插入图片描述

那么我们要知道的就是jpg 格式的图片是不包含 Alpha 通道的,因为它不能来表示透明,如上图所示☝️ ,在做图片的时候,我们知道,两种常用的透明格式就是 png和 gif 格式,gif 还支持动图,动图在Pygame 里面是不能解析的,一般我们在Pygame 里面做的图片都是以 png 图片为主,因为 jpg 是有损的,你放大缩小它会损失精度,png 是无损压缩。

所以来总结一下上面那段话:👉jpg 是不支持透明的,所以我们载入这类图片就用 convert();而 png 是支持透明的,所以载入就用 convert_alpha(),那么他会把透明也给描述进去,如果load()png类型图片不加alpha,他就不会把alpha通道给载入,那么他就会变成一个很难看的图片

(二)躬行–Pygame 对透明度的处理

1️⃣三种处理方法简介

首先要知道的是Pygame 支持三种透明度类型:1️⃣colorkeys,2️⃣surface alphas 和 3️⃣pixel alphas

1️⃣colorkeys 是指设置指定一种颜色把它变为透明,比如说上面的老污龟,它有很多种绿色,我把其中一种绿色变为透明,那么在这个图片里面,与这个绿颜色相同的部分都不见了,取而代之的就是背景的颜色,因为透明事实上就是把背景显示出来。这就是编程里面的障眼法,他不是跟你玻璃杯一样的透明,不是那种质感,就是把背景显示出来

2️⃣surface alphas 是整体设置一个图片的透明度

3️⃣pixel alphas就是每一个像素增加一个alpha通道,像上面的那张PNG的老污龟图像,他只有背景是透明的,所以他每一个像素都有一个alpha通道,指定这个像素是否要把它变透明,透明度是多少

还需要指知道的surface alphas 可以和 colorkeys 混合使用,而 pixel alphas 不能和其他两个混合。

说起来很复杂,其实说白了,convert() 方法转换出来的 就 支持surface alphas 可以和 colorkeys 设置透明度,而且他们是可以混合设置的。而 convert_alpha() 方法转换之后呢,就只支持 piexl alphas ,也就是说这个图像本身每个像素就带有Alpha 通道,所以我们载入一个带有 Alpha 通道的图片,我们会看到有一部分是透明的,就像我们上面的小乌龟,它的背景就是透明的。

2️⃣测试+实验:使用JPG图片

在这里插入图片描述
这里准备了两张图片,一种是 jpg,背景是带白色;一种是 png,背景是的透明。

然后为了看得更清楚,更直观,加了一个背景,下面先载入JPG格式的图片👇


import pygame
import sys
from pygame.locals 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值