图像数据在Pygame需要被导入,并转化成一个对象储存,想要处理或者调用,就直接调用该对象即可
convert: 将图像转化为Surface对象,每次加载完图像后就要使用这个函数.
例如:
background = pygame.image.load(background_image).convert()
screen.blit(background, (0, 0)) # 画上背景图
convert_alpha:相比convert,保留了Alpha 通道信息(可以简单理解为透明的部分),这样我们的光标才可以是不规则的形状。可以试试不用convert_alpha()生成的效果。
例如:
x, y = pygame.mouse.get_pos() # 获得鼠标位置
# 计算光标左上角位置
x -= mouse_cursor.get_width()/2
y -= mouse_cursor.get_height()/2
# 画上光标
screen.blit(mouse_cursor, (x, y))
blit方法
之前我们一直有调用一个blit方法,效果即在屏幕上加载我们的surface
blit(source, dest, area=None, special_flags = 0)
- 第一个参数为一个Surface对象,第二个为左上角位置。画完以后得用update更新,否则画面一片漆黑。
- dest可以为一个点,也可以是一个矩形,但只有矩形的左上角会被使用,矩形的大小不会造成影响。
- area参数可以指定源图像中的一部分被画到目标位置。
图像的管理方法
除了上面说的pygame.image.load外,还可以指定尺寸创建一个空的surface。
>>> a = pygame.Surface((256,256))
这个Surface对象是全黑的。除了大小外,Surface函数还有flags和depth两个参数。
- HWSURFACE – creates the image in video memory
- SRCALPHA – the pixel format will include a per-pixel alpha。(创建有Alpha通道的surface,选择这个选项需要depth为32。)
alpha_surface = pygame.Surface((256,256), flags=SRCALPHA, depth=32)
矩形对象(Rectangle Objects)
pygame中有Rect类,用来存储和处理矩形对象(包含在pygame.locals)中。这是一个很重要的类,rect对象和surface对象构成了pygame基本的游戏设计要素,之后的一系列游戏效果一般都要通过这两个类来实现。
- Rect(left, top, width, height)
- Rect((left, top), (width, height))
有了Rect对象之后,可以对其做很多操作,例如调整大小、位置,判断一个点是否在其中等。
剪裁(Clipping)
surface中有裁剪区域(clip area),是一个矩形,定义了哪部分会被绘制,即若定义了这个区域,只有这个区域内的像素会被修改。
- set_clip(screen_rect=None): 设定区域,当参数为None时,重置。一个surface对象默认的剪裁区域为这个surface。
- get_clip() : 得到剪裁区域,返回一个Rect对象。
子表面(Subsurfaces)
Subsurfaces是在一个surface中再提取出一个surface。当在subsurface上操作时,同时也向父表面上操作。这可以用来绘制图形文字,比如把文字变成多种颜色。把整张图读入后,用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))
填充
fill(color, rect=None, special_flags=0)
当rect参数为默认参数时,整个surface都会被填充。color参数可以为RGB或者RGBA。如果使用RGBA,除非surface有alpha通道(使用了SRCALPHA flag),否则RGBA的Alpha会被忽略。
设置Surface的像素
- set_at((x, y), Color) : 设置单个像素的颜色
- get_at((x, y)) : 得到单个像素的颜色
下面是对像素进行操作的一个代码实例:
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)()
for _ in range(100):
rand_pos = (randint(0, 639), randint(0, 479))
screen.set_at(rand_pos, rand_col)
# screen.unlock()
pygame.display.update()
图像的缩放
def scale(surface: Surface, size: Union[Tuple[int, int], List[int]], dest_surface: Optional[Surface]=None)
scale(Surface, (width, height), DestSurface = None) -> Surface resize to new resolution
将Surface属性的self.image转化为30×30的大小
self.image = pygame.transform.scale(self.image, (30, 30))
锁定Surface
当对像素进行读或写操作时,surface会被锁定。一个锁定的surface,经常不能被显示或被pygame操作。所以除非必要,在手动lock之后不要忘了unlock。
所有pygame的函数如过需要锁定和解锁,这些操作时自动发生的。如果不想发生自动的lock和unlock(有些时候为了提高效率),可以在一些会造成自动锁定和解锁的语句前后注释掉这两句。