在游戏中文字和图像一样重要,关系到我们的游戏体验,故我们需要知道字体和图像的产生以及我们如何产生我们期望的画面
pygame.font.get_fonts()
返回字符串列表,可获得我们当前系统的所有可用字体
先介绍一个函数的用法
my_font=pygame.font.Font("my_font.ttf",16)
注意到使用了my_font.ttf这个语句,它可以把字体文件随游戏一起分发,避免用户机器上没有需要的字体
一旦创建font对象,就可以用render来写字了,然后blit到屏幕上
text_surface=my_font.render("Pygame is cool!",True, (0,0,0), (255,255,255))
第一个参数为需要写的文字
第二个参数为布尔值,为True,字体更平滑
第三个参数为字体颜色
第四个参数为背景色,如果想要透明效果,则不设置该参数
my_name="Will MrGao"
import pygame
pygame.init()
my_font=pygame.font.SysFont("arial",64)
name_surface=my_font.render(my_name,True, (0,0,0), (255,255,255))
pygame.image.save(name_surface,"name.png")
执行该段代码可以将设置的文字保存为一张图片
把颜色变亮或变暗
处理一些颜色变化很平滑不突兀的过程
线性插值
为找到两种颜色的中间色,将第二种颜色与第一种颜色的差值乘以一个0-1之间的小数,然后再加上第一种颜色
先来介绍几种常见图片的类型
类型 | 描述 | 用途 |
---|---|---|
JPG | 一般后缀名为.jpg 或者.jpeg。有损压缩,可用来减小文件尺寸,不支持透明 | 数码相机、网上的图片 |
PNG | 支持透明,无损压缩 | 于网页设计,软件界面设计 |
JIF | 支持透明和动画,只能有256种颜色 | 网上使用 |
BMP | Windows 上的标准图像格式,无压缩,质量很高但尺寸很大 | 一般不用 |
Surface对象实际
创建surfaces对象
法一:
pygame.image.load加载一个图片,然后就会返回个与图片相同尺寸和颜色的surface对象
法二:
指定尺寸创建一个空的surface
e.g.创建一个256*256像素的surfaces
bland_surface=pygame.Surface((256,256))
而若不指定尺寸,则可选择参数(flags, depth)
对于flags可选择
而对于depth
可以不设定,Pygame 会自动设的和display 一致
其代码为:
bland_alpha_surface=pygame.Surface((256,256), flags=SRCALPHA, depth=32)
转换surfaces
为获得更高性能
#为普通转换
background = pygame.image.load(background_image_filename).convert()
#加了alpha通道的转换
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
一般在制定一个区域时,都是将其放置在一个矩形内,即得到任何不规则图形的外接矩形来进行后面的设置,即只需要知道其四个点的位置便可确定该对象的位置
Pygame 中有一个 Rect 类,用来存储和处理矩形对象(包含在 pygame.locals 中,
故可知道我们前面代码中写了 from pygame.locals import *就可以直接用这个对象了)
#可得到两个相同的矩形
my_rect3=Rect(100,100,200,150)
my_rect4=Rect((100,100), (200,150))
定义哪部分会被绘制,即哪部分的像素会被修改,默认情况下为整个界面
set_clip 来设定区域
get_clip 来获得该区域
e.g.
screen.set_clip(0,100,50,200)
draw_map()
#在左下角画地图
screen.set_clip(0,0,300,30)
draw_panel()
#在上方画菜单面板
即在一个 Surface 中再提取一个 Surface
需注意的是在子表面绘制的时候,也在父表面操作
可举个例子
如果想要把每个字母单独得到并放在游戏界面中
在一张图片上画满所有的字母。把整张图读入,然后再用 Subsurface 把字母一个一个“抠”出来
最直接的填充为(以填充白色为例)
screen.fill((0,0,0))
以设置一个像素的色彩为例
我们可以使用set_at,其参数为坐标和颜色
get_at
接受一个坐标返回指定坐标点上的颜色
当需要向surface上面加东西时,需要锁住,保证不会有其它继承干扰
锁和解锁时自动发生的
但也可自己添加,但是性能会有差别,若自己加了锁,一定要记得解锁
将一个平面的一部分或全部图像从一个平面复制到另一个平面
第一个参数为:surface
第二个参数为:颜色
后面参数为:一系列的坐标
返回一个Rect对象(0,0)表示计算机左上角
一些基本函数为:
函数 | 作用 |
---|---|
rect | 绘制矩形 |
polygon | 绘制多边形(三个及三个以上的边) |
circle | 绘制圆 |
ellipse | 绘制椭圆 |
arc | 绘制弧 |
line | 绘制线 |
lines | 绘制一系列的线 |
aaline | 绘制一根平滑的线 |
aalines | 绘制一系列的平滑的线 |
下面具体说一下draw函数的具体用法
用法:
pygame.draw.rect(Surface, color, Rect, width=0)
用来画一个矩形
rect接受一个矩形的坐标和线宽参数,如果线宽是0或省略,则填充
#画随机矩形
rc = (randint(0,255),randint(0,255),randint(0,255))
rp = (randint(0,639),randint(0,479))
rs = (639-randint(rp[0],639),479-randint(rp[1],479))
pygame.draw.rect(screen,rc,Rect(rp,rs))
用法:
pygame.draw.polygon(Surface, color, pointlist, width=0)
用来画多边形
但polygon 会接受一系列坐标的列表,代表了各个顶点
pygame.draw.polygon(screen, (0, 155, 155), points, 2)
用法:
pygame.draw.circle(Surface, color, pos, radius, width=0)
用来画圆
接收一个圆心坐标和半径参数
#画随机圆形
rc = (randint(0,255),randint(0,255),randint(0,255))
rp = (randint(0,639),randint(0,479))
rr = randint(1,200)
pygame.draw.circle(screen, rc, rp, rr)
用法:
pygame.draw.ellipse(Surface, color, Rect, width=0)
画一个椭圆,pygame.draw.ellipse 的第三个参数就是这个椭圆的外接矩形
#根据点击位置画椭圆
pygame.draw.ellipse(screen,(0,255,0),(0,0,x,y))
用法:
pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1)
椭圆一部分
start_angle 和 stop_angle 为开始和结束的角度
#获得当前鼠标点击的位置
x, y = pygame.mouse.get_pos()
points.append((x, y))
#根据点击位置画弧线
angle = (x/639.)*pi*2
pygame.draw.arc(screen, (0,0,0), (0,0,639,479),0, angle, 3)
用法:
pygame.draw.line(Surface, color, start_pos, end_pos, width=1)
#从左上和右下画两条线连接到点击位置
pygame.draw.line(screen, (0,0,255),(0,0),(x,y))
pygame.draw.line(screen,(255,0,0),(640,480),(x,y))
用法:
pygame.draw.lines(Surface, color, closed, pointlist, width=1)
closed 是一个布尔变量,指明是否需要多画一条线来使这些线条闭合
pointlist 是一个点的数组
#画点击轨迹图
if len(points) >1:
pygame.draw.lines(screen, (155,155,0), False, points,2)
第三篇python之pygame到此结束啦!