python之pygame字体 图片 画图模块(三)

在游戏中文字和图像一样重要,关系到我们的游戏体验,故我们需要知道字体和图像的产生以及我们如何产生我们期望的画面


一、字体模块

pygame.font.get_fonts()
返回字符串列表,可获得我们当前系统的所有可用字体
先介绍一个函数的用法

my_font=pygame.font.Font("my_font.ttf",16)

注意到使用了my_font.ttf这个语句,它可以把字体文件随游戏一起分发,避免用户机器上没有需要的字体

  • 创建font对象
    在知道系统可用字体有哪些之后,我们可以开始创建font对象
    除了上面提到过的pygame.font.Font()使用特定字体文件创建之外,
    还可以使用pygame.font.SysFont()系统自带的字体进行创建

一旦创建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")

执行该段代码可以将设置的文字保存为一张图片


二、颜色模块

颜色缩放

把颜色变亮或变暗

  • 把颜色的 RGB 每一个数值乘以一个小于1的正小数,颜色看起来就会变暗了(而当 RGB都是整数所以可能需要取整一下)
  • 乘以一个大于1的数,颜色就会变亮,但每个数值最多255,而一旦超过,就把它归为255
颜色混合

处理一些颜色变化很平滑不突兀的过程

线性插值
为找到两种颜色的中间色,将第二种颜色与第一种颜色的差值乘以一个0-1之间的小数,然后再加上第一种颜色

  • 如果数为0,则结果完全为第一种颜色
  • 如果数为1,则结果完全为第二种颜色
  • 中间的小数则兼具这两种颜色的特色

三、图片模块

先来介绍几种常见图片的类型

类型 描述 用途
JPG 一般后缀名为.jpg 或者.jpeg。有损压缩,可用来减小文件尺寸,不支持透明 数码相机、网上的图片
PNG 支持透明,无损压缩 于网页设计,软件界面设计
JIF 支持透明和动画,只能有256种颜色 网上使用
BMP Windows 上的标准图像格式,无压缩,质量很高但尺寸很大 一般不用

四、surface对象

Surface对象实际

创建surfaces对象
法一:
pygame.image.load加载一个图片,然后就会返回个与图片相同尺寸和颜色的surface对象
法二:
指定尺寸创建一个空的surface

e.g.创建一个256*256像素的surfaces

bland_surface=pygame.Surface((256,256))

而若不指定尺寸,则可选择参数(flags, depth)
对于flags可选择

  • HWSURFACE
    最好不设定,pygame 可以自己优化
  • SRCALPHA
    有 Alpha 通道的surface,如果你需要透明,就要这个选项
    这个选项的使用需要第二个参数为32

而对于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()


五、矩形(Rect)对象

创建矩形对象

一般在制定一个区域时,都是将其放置在一个矩形内,即得到任何不规则图形的外接矩形来进行后面的设置,即只需要知道其四个点的位置便可确定该对象的位置

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()
#在上方画菜单面板
子表面Subsurfaces

即在一个 Surface 中再提取一个 Surface
需注意的是在子表面绘制的时候,也在父表面操作

可举个例子
如果想要把每个字母单独得到并放在游戏界面中

在一张图片上画满所有的字母。把整张图读入,然后再用 Subsurface 把字母一个一个“抠”出来

填充surfaces

最直接的填充为(以填充白色为例)
screen.fill((0,0,0))

设置surfaces像素

以设置一个像素的色彩为例
我们可以使用set_at,其参数为坐标和颜色

获得surfaces像素

get_at
接受一个坐标返回指定坐标点上的颜色

锁定surfaces

当需要向surface上面加东西时,需要锁住,保证不会有其它继承干扰
锁和解锁时自动发生的
但也可自己添加,但是性能会有差别,若自己加了锁,一定要记得解锁

blitting

将一个平面的一部分或全部图像从一个平面复制到另一个平面

六、draw

第一个参数为:surface
第二个参数为:颜色
后面参数为:一系列的坐标
返回一个Rect对象(0,0)表示计算机左上角

一些基本函数为:

函数 作用
rect 绘制矩形
polygon 绘制多边形(三个及三个以上的边)
circle 绘制圆
ellipse 绘制椭圆
arc 绘制弧
line 绘制线
lines 绘制一系列的线
aaline 绘制一根平滑的线
aalines 绘制一系列的平滑的线

下面具体说一下draw函数的具体用法

pygame.draw.rect

用法:
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

用法:
pygame.draw.polygon(Surface, color, pointlist, width=0)
用来画多边形
但polygon 会接受一系列坐标的列表,代表了各个顶点

pygame.draw.polygon(screen, (0, 155, 155), points, 2)
pygame.draw.circle

用法:
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

用法:
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

用法:
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

用法:
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

用法:
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字体 图片 画图模块(三)_第1张图片


第三篇python之pygame到此结束啦!

你可能感兴趣的:(pygame,python,python,pygame,字体模块,图片模块,画图draw)