文章目录
在游戏设计中,图像显示是必不可少的功能,pygame中的image模块便用于加载图像。
load
通过load函数,可以加载多种图像格式,如下表所示
旧版本 | bmp, gpeg, png, pcx, tiff, xpmc, lbm(以及pbm, pgm, ppm) |
有条件支持 | 非动画gif;非压缩tga;svg |
2.0新增 | pnm, webp, svg |
下面就演示一下load加载图像的示例
python
import pygame
pygame.init()
screen = pygame.display.set_mode((500,300))
ball = pygame.image.load("intro_ball.gif")
ballrect = ball.get_rect()
while True:
if pygame.QUIT in [e.type for e in pygame.event.get()]:
pygame.quit()
break
screen.blit(ball, ballrect)
pygame.display.flip()
其中intro_ball.gif是pygame的一张示例图像,位于pygame路径下的docs\generated\_images
文件夹中。
ballrect是一个框住了ball的矩形。在后面的死循环中,通过ballrect来设置ball的位置。
效果如下
转换和存储
通过save函数,可将图像另存为BMP, JPEG, PNG, TGA四种格式。此外,pygame还提供了图像与字符串、字节数组的转换方法
字符串 | 字节数组 | |
---|---|---|
tostring | tobytes | |
fromstring | frombytes | frombuffer |
在数据转换过程中,需要指明图像的颜色格式,列表如下
位数 | 类型 | |
---|---|---|
P | 8位 | 调色盘图像 |
RGB | 24位 | RGB图像 |
RGBX | 32位 | RGB和一个空通道 |
RGBA | 32 | RGB和透明图层 |
ARGB | 32 | 透明和RGB图层 |
BGRA | 32 | BGR和透明图层 |
RGBA_PREMULT | 32 | RGBA格式中,A通道用于放缩RGB |
ARGB_PREMULT | 32 | ARGB格式中,A通道用于放缩RGB |
示例如下
python
p = pygame.image.tostring(ball, "P")
rgb = pygame.image.tostring(ball, "RGB")
len(p) # 12321
len(rgb) # 36963
二者可以重新变回图像
python
pIm = pygame.image.fromstring(p, (111,111), "P")
rgbIm = pygame.image.fromstring(rgb, (111,111), "RGB")
pygame.image.save(pIm, "pIm.png")
pygame.image.save(rgbIm, "rgbIm.png")
自由落体
下面用pygame来演示一下小球的自由落体动画。自由落体的方程是个高中生就会 y = y 0 − 1 2 g t 2 y=y_0-\frac{1}{2}gt^2 y=y0−21gt2,考虑到动画生成采取的是差分的逻辑,所以设 v n = v n − 1 + 1 v_n=v_{n-1}+1 vn=vn−1+1,则代码如下
python
import time
pygame.init()
size = width, height = 640, 320
speed = [10, 0]
screen = pygame.display.set_mode(size)
ball = pygame.image.load("intro_ball.gif")
rect = ball.get_rect()
while True:
if pygame.QUIT in [e.type for e in pygame.event.get()]:
break
time.sleep(0.02)
rect = rect.move(speed)
if rect.right>width:
speed = [10, 0]
rect = ball.get_rect()
if rect.bottom>height:
speed[1] = -speed[1]
speed[1] += 1
screen.fill("black")
screen.blit(ball, rect)
pygame.display.flip()
pygame.quit()
效果如下