赞
踩
窗口屏幕是surface对象,图片也是surface对象,什么是surface呢,他又有哪些功能呢?
pygame.Surface下的功能函数其实都是Surface类的成员函数,Surface对象其实就是指pygame.Surface类的对象
Surface是一块矩形显示区域,用来表示任意图像,它具有固定的宽度、高度、像素格式。也可以把Surface理解为一张画布,在上面可以做很多事情,如绘制图像、绘制线条和文字、填充颜色等;还可以把当前的Surface作为图像复制到另一个Surface上。
在pygame中,所有与显示相关的区域都被表示为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对象。
两个绘制函数
- 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
- #前面两个参数必须指定
使用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就是一个用来显示的矩形区域,所以应该具备的信息是:高度、宽度、坐标等信息;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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。