Python学习笔记32:进阶篇(二十一)pygame的使用之图片填充

发布于:2024-07-09 ⋅ 阅读:(49) ⋅ 点赞:(0)

前言

基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。

我们的下一步目标是完成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)的学习。

今天来活了,最近学习不会停,但是记录的笔记可能不会特别长,见谅。

作业

  1. 新建窗口,先新建一个画布进行图片填充,而不是直接填充到窗口画布中。

网站公告

今日签到

点亮在社区的每一天
去签到