pygame入门(2)

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()

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值