Surface对象
窗口屏幕是surface对象,图片也是surface对象,什么是surface呢,他又有哪些功能呢?
pygame.Surface下的功能函数其实都是Surface类的成员函数,Surface对象其实就是指pygame.Surface类的对象
Surface的定义
Surface是一块矩形显示区域,用来表示任意图像,它具有固定的宽度、高度、像素格式。也可以把Surface理解为一张画布,在上面可以做很多事情,如绘制图像、绘制线条和文字、填充颜色等;还可以把当前的Surface作为图像复制到另一个Surface上。
在pygame中,所有与显示相关的区域都被表示为Surface
创建Surface
-
通过pygame.display.set_mode()返回的display surface创建Surface,它是一个特殊的Surface对象
-
通过pygame.image.load()返回的image surface 创建Surface,它也是一个Surface对象
-
通过Surface类的构造函数创建Surface对象,该方式会默认创建一个空的Surface对象,内部都被初始化为黑色,其构造函数包含多个参数,其中只有分辨率是必须指定的
Surface((width,height),flags=0,depth=0,masks=None) Surface((width,height),flags=0,Surface)
-
使用pygame.font.Font.render()创建Surface对象,该方式将在需要显示文字时用到,该函数可以创建一个包含指定文字的Surface对象。
绘制Surface
两个绘制函数
fill(color,rect=None,special_flags=0)
#可以向Surface填充指定颜色,第二个参数rect代表颜色填充目标区域,没指定填充整个Surface
blit(source,dest,area=None,special_flags=0)
#类似copy,把一个Surface绘制到另一个Surface,source为源Surface,第二个参数为待绘制区域的左上
#角坐标,可以取值一个点或者Rect对象;第三个area代表源Surface中需要绘制的区域,即可以把源
#Surface中的一部分区域绘制到目标Surface,没有指定参数则默认整个源Surface绘制到目标Surface
#前面两个参数必须指定
转换Surface像素格式
使用blit()函数绘制到目标Surface时,如果两者像素格式不一致,则blit()函数内部会自动进行像素格式转换。一般情况下,blit()每帧都会被调用,如果调用一次就进行一次格式转换,则会花费大量时间。因此创建源Surface后,执行blit()函数前,需要把源Surface转换成和屏幕display surface一致的像素格式,这样可以大幅加快blit的过程,提升程序性能
convert()
#该函数把当前Surface转换成屏幕Surface(display surface)一致的像素格式,返回值为转换后的
#Surface()
convert_alpha()
#功能相似但是它会保留像素的alpha值
如果使用的图片带有透明度,则必须用该函数进行转换,转换后仍然保留图片原来的透明效果,如果使用convert()则会丢失图片原本的透明信息
Image1=pygame.image.load("xxx.png").convert()
#不带透明效果
Image2=pygame.image.load("xxx.png").convert_alpha()
#保留透明效果
获取Surface属性
Surface就是一个用来显示的矩形区域,所以应该具备的信息是:高度、宽度、坐标等信息;pygame.Surface模块也提供了一些函数用来获取信息:
get_width()
#获取宽度,单位为像素
get_height()
#获取高度,单位为像素
get_size()
#获取尺寸,返回值为:(width,height)二元组,单位为像素
get_rect(**kwargs)
#获取所在矩形区域,返回值为一个Rect对象,默认返回(0,0)、宽度高度与Surface相同的矩形Rect对象
图片加载
pygame.image模块提供了一些与图片加载、保存、转换等相关功能,下面介绍常见图片加载功能
图片加载所使用函数为:
pygame.image.load(filename)
#可以绝对路径也可以相对路径,返回值是surface对象
#支持的图片格式JPG\PNG\GIF(不包括动画)\PCX\TGA(未压缩)\TIF\LBM\PBM\PGM\PPM\XPM格式
get_extended()
#判断对扩展图片支持格式
图形绘制
屏幕绘制一般用pygame.Surface中的fill() and blit()函数,但是绘制线条和图形用的是pygame.draw模块的函数
绘制直线
line(Surface,color,start_pos,end_pos,width=1)
#画直线,起点坐标为start_pos,终点坐标为end_pos取值为二元组,width是粗细程度
Surface表示画布
aaline(Surface,color,startpos,endpos,blend=1)
#画的是抗锯齿后的折线,没有width无法设置粗细,blend表示是否打开直线段边缘的融合效果
pygame.draw.line(screen,"red",(0,0),(50,50),2)
pygame.draw.aaline(screen,"yellow",(0,0),(500,500))
绘制折线
lines(Surface,color,closed,pointlist,width=1)
#参数pointlist构成折线的点的坐标的列表,表中所有相邻的两个点都会连接起来;
#参数Surface上绘制一条折线,参数closed表示折线是否封闭,如果为True。则第一个点和最后点会连接起来
pygame.draw.lines(screen,"blue",True,[(0,0),(100,50),(79,50),(200,450)])
#抗锯齿版本
aalines(Surface,color,closed,pointlist,blend=1)
绘制矩形
rect(Surface,color,Rect,width=0)
#Rect可以是一个四元组(a,b,c,d)左上角横坐标,纵坐标,宽度,高度 width外边框粗细如果为0则填充矩形
绘制多边形
polygon(Su日法测,color,point list,width=0)
#pointlist表示顶点坐标列表,可以拿来画三角形
绘制圆形
circle(Surface,color,pos,radius,width)
#pos代表圆心坐标,radius代表圆的半径
pygame.draw.circle(screen,"green",(250,250),50,0)
绘制椭圆形
ellipse(Surface,color,Rect,width=0)
Rect表示椭圆的外接矩形
绘制弧线
arc(Surface,color,Rect,width=0)
#弧线当作椭圆一部分绘制,需要外接矩形,start_angle表示初始弧度和终止弧度
#(0,2Π)
实例:
from math import pi
import pygame
import sys
BLACK=(0,0,0)
WHITE=(255,255,255)
BLUE=(0,0,255)
GREEN=(0,255,0)
RED=(255,0,0)
def main():
pygame.init()
#绘制一个600*600的屏幕
screen=pygame.display.set_mode((600,600))
#起名
pygame.display.set_caption("Draw Shapes")
#游戏循环
while True:
for event in pygame.event.get():
if event.type in (pygame.QUIT,pygame.KEYDOWN):
pygame.quit()
sys.exit()
#填充颜色
screen.fill(WHITE)
#画直线
pygame.draw.line(screen,RED,(20,80),(160,0))
#画抗锯齿直线
pygame.draw.aaline(screen,GREEN,(20,100),(160,20))
#画折线
pygame.draw.lines(screen,BLACK,False,((20,140),(50,180),(160,60),(220,80)))
#画抗锯齿折线
pygame.draw.aalines(screen,GREEN,True,((30,320),(110,200),(190,320)))
#画直线
pygame.draw.lines(screen,RED,True,((30,320),(110,200),(190,320)),2)
#画矩形
pygame.draw.rect(screen,BLACK,(30,380,160,40),1)
pygame.draw.rect(screen,BLACK,(30,440,160,40))
#画多边形
pygame.draw.polygon(screen,BLUE,((20,580),(60,500),(100,580)),2)
pygame.draw.polygon(screen,BLUE,((120,580),(160,500),(200,580)))
#画圆
pygame.draw.circle(screen,GREEN,(360,60),60,1)
pygame.draw.circle(screen,GREEN,(500,60),60)
#画椭圆
pygame.draw.ellipse(screen,RED,(330,160,60,180),2)
pygame.draw.ellipse(screen,RED,(470,160,60,180))
#画弧线
pygame.draw.arc(screen,BLACK,(310,400,120,100),pi,2*pi,2)
pygame.draw.arc(screen,BLUE,(430,400,120,100),0,pi,2)
#更新
pygame.display.update()
#运行时启动main()方法
if __name__=="__main__":
main()