前言
基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。
我们的下一步目标是完成python crash course中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。
私信我发送消息python资料,领取python crash course中文版PDF。
Pygame
Pygame是一个开源的Python多媒体开发库,专门用于开发2D游戏。它是Python编程语言的一个扩展,基于 SDL (Simple DirectMedia Layer) 库,提供了丰富的功能来处理图形、声音、事件处理等游戏开发所需的基本要素,使得创建游戏变得更加简单直接。
图片填充
之前已经学习了图形绘制,我们可以通过一些命令来绘制图形,但是想完成一个游戏,面对各种各样的NPC,地图场景,很明显这些简单命令是不够的,pygame
提供了图片填充的功能,可以将某些图片直接填充到Surface
对象上。
blit()函数
blit()函数就是填充图片的函数,我们简单了解一下函数的参数与返回值后,编写代码尝试使用。
参数说明:
- source_surface: 要复制的源Surface对象。
- destination: 目标位置,可以是一个tuple或list,表示目标左上角的位置(x, y),也可以是一个Rect对象。
- area: 可选参数,如果指定,仅复制源Surface中指定的Rect区域。
- special_flags: 可选参数,用于控制特殊效果,如混合颜色。
返回值:
- 此函数没有返回值。
示例
每个示例的代码我都会写上注释,后面就不在单独分析每行代码的作用了,但是关键的函数还是会讲一下。填充函数就了解一个blit(),不同示例只是不同参数的调用。
基础使用
import pygame
# 初始化
pygame.init()
# 新建窗口
screen = pygame.display.set_mode((800, 600))
# 命名
pygame.display.set_caption('image blit')
# 加载图片
image = pygame.image.load("tree.webp")
# 填充
screen.blit(image, (0, 0))
# 更新屏幕
pygame.display.flip()
# 点击关闭退出程序,这个后面再讲,代码可以先写上。
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
执行文件,出现了一个窗口,但是很奇怪只有蓝天,命名我的图片是树(tree.webp)来着。
是不是我们的图片太大,但是窗口太小导致的呢?
这个问题又该怎么解决呢?
pygame.transform.scale()函数可以解决这个问题。
import pygame
--snip--
# 根据窗口尺寸缩放图片
scaled_image = pygame.transform.scale(image, (800, 600))
# 填充
screen.blit(scaled_image, (0, 0))
--snip--
现在看,图片已经变成适应窗口大小了。
不过这个函数会返回一个新的Surface
对象,也就是说函数是对图片进行了适应窗口的缩放后返回一个新的画布,这种缩放在缩放比例特别大时可能导致图片质量下降,这个时候就需要考虑其他的算法或者库来实现了。不过大多数情况下我们是够用的。
进阶使用
blit函数中area参数可以对图片进行截取,通过area参数定义的矩形,可以对图片进行截取,填充的图片也是截取出来的图片。
special_flags参数则是让目标图片和源图片混合。源图片指的是加载的图片,也就是image代表的画布对象,目标图片指的是接收源图片的图片,就是screen所代表的的窗口画布。
常用取值如下:
- BLEND_ADD: 将源图像的颜色值与目标图像对应位置的颜色值相加,产生一种类似于光照的效果。这通常会导致颜色变得更亮。
- BLEND_SUB: 将源图像的颜色值从目标图像的颜色值中减去,可能产生暗化的效果。
- BLEND_MULT: 将源图像的颜色值与目标图像的颜色值相乘,通常会产生一种暗淡的效果,因为颜色通道的值会被降低。
- BLEND_MIN: 取源图像和目标图像对应像素的最小值,这样可以产生遮罩或阴影效果。
- BLEND_MAX: 取源图像和目标图像对应像素的最大值,这可以用于高光或其他亮度增强效果。
这些混合模式可以单独使用,也可以组合在一起使用,通过按位或运算(|)来实现多种效果的叠加。
接下来代码示例。
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
image = pygame.image.load("tree.webp").convert()
# 定义要绘制的图像区域
area = pygame.Rect(500, 500, 300, 300)
# 使用BLEND_ADD混合模式
screen.blit(image, (100, 100), area, pygame.BLEND_MAX)
# 不使用
screen.blit(image, (400, 100), area)
# 更新屏幕
pygame.display.flip()
# 点击关闭退出程序,这个后面再讲,代码可以先写上。
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
通过代码和结果,我们可以看到,我们填充了两个正方形,并且这两个 正方形的图案是一致的,因为都是从一个顶点坐标,同宽通长截取出来的,但是混合模式啥的,没看出啥情况来来,可能和我图片和背景色有关系。这个我后面慢慢研究,目前来说这个参数用不上,我先不浪费时间纠结这个了。
结尾
图片填充功能正常应在图片模块一起讲的,但是昨天讲了图形绘制,顺嘴提了图片填充,仔细看看了先讲后讲差不多,干脆就接着图形绘制讲了。这个讲完就接上图片模块(pygame.image
)的学习。
今天来活了,最近学习不会停,但是记录的笔记可能不会特别长,见谅。
作业
- 新建窗口,先新建一个画布进行图片填充,而不是直接填充到窗口画布中。