![零基础入门Python游戏](https://wfqqreader-1252317822.image.myqcloud.com/cover/70/44510070/b_44510070.jpg)
2.8 图形绘制
大家应该还记得,向屏幕绘制内容时大多使用pygame.Surface模块的fill()函数和blit()函数,但是绘制线条和图形却并非如此,其相关函数是在pygame.draw模块中定义的。
pygame.draw模块提供了一些用来绘制基本图形的函数,如直线、折线、矩形、多边形、圆形、椭圆形、弧线等。
下面依次介绍这些函数的用法。
1. 绘制直线
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P40_1537.jpg?sign=1738903803-rgWQIpLONeeJyFKymLVMul81W7AJ1Kt6-0-a7ec90d22540b023604a901db1278b2e)
该函数将在Surface上绘制一条直线段,颜色为color,起点坐标为start_pos,终点坐标为end_pos,粗细程度为width。其中,参数color的取值为RGB三元组或RGBA四元组,start_pos和end_pos的取值为由点的x坐标与y坐标组成的二元组,参数width的默认值为1,取值越大,直线段越粗。
注意:在所有参数中,只有width有默认值,其他参数在函数调用时都必须提供。
除了line()函数以外,以下函数也可以绘制直线段。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P40_1554.jpg?sign=1738903803-GSFjzWoQdyyItBPDGa4NwPWSgk3cDXz1-0-fda94872f1d50c22bb7b505255be208e)
该函数的功能与line()函数类似,只不过它绘制的是抗锯齿后的直线段。函数名称aaline开头的两个字母a代表anti-aliased,其参数与line()函数类似,但是并没有参数width,无法设置直线段的粗细;最后一个参数blend代表是否打开直线段边缘的融合效果,一般情况下都是使用其默认值,无须设置其为False。
2. 绘制折线
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P40_1563.jpg?sign=1738903803-v39vG1dgMuTl7Lm1nNzUjmLlMKurETu0-0-e0ae1859560c84c79a96f7894853eff3)
该函数可以在Surface上绘制一条折线,即多条连续的直线段,其参数color代表折线的颜色,为RGB三元组或RGBA四元组;参数closed代表折线是否封闭,如果为True,则pointlist中的第一个点和最后一个点会被一条直线段连接;参数pointlist是构成折线的点的坐标的列表,其中所有相邻的两个点都会被直线段连接;最后一个参数width代表线条的粗细程度。
与line()函数类似,lines()函数也有其相应的抗锯齿版本,如下。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P40_1572.jpg?sign=1738903803-OSw6uevV2AexAF24bQhftxLCd7rm3CAt-0-e04fec702e3f78bb5d5b3925ccf76ba9)
aalines()函数绘制的是抗锯齿后的折线,其参数与lines()函数类似,不同的只是最后一个参数,这一点与aaline()函数类似。
pygame.draw模块中并没有专门绘制三角形的函数,不过稍做思考即可发现,使用lines()或者aalines()函数可以很容易地绘制出三角形:只要在参数pointlist中给出三个不在同一条直线的点的坐标,然后把closed参数设置为True即可。
3. 绘制矩形
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P40_1581.jpg?sign=1738903803-FUF0afMCUysZyfyIexBUnE8TCwfkMcVT-0-1de11a85da88936d88c8079f4aa7cb3f)
该函数用来在Surface上绘制矩形,参数color用来指定矩形颜色的RGB值或RGBA值;Rect代表将要绘制的矩形区域,它可以是Rect对象,也可以是一个四元组(a,b,c,d),其中,a、b、c、d分别代表矩形左上角的横坐标、左上角的纵坐标、矩形的宽度和矩形的高度。对于前面已经介绍过的blit()函数等众多需要使用矩形区域作为参数的地方,我们都可以利用这种方法传参。最后一个参数width代表矩形外边框的粗细程度,如果为0,则整个矩形区域都会被颜色color填充,在这种情况下,该函数的功能与pygame.Surface.fill()函数类似。
4. 绘制多边形
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P41_1593.jpg?sign=1738903803-kKlkUyCiQAtQTPfZvcXxcvCpFZpaCXbF-0-a5fdc56da250a30a70dfd4b8e340d9d9)
该函数用来在Surface上绘制多边形,color代表多边形的颜色,pointlist代表多边形各个顶点的坐标列表,width用来指定多边形外边框的粗细程度。如果width的值为0,则多边形内部的整个区域将会被颜色color填充。
可想而知,polygon()函数也可以绘制三角形和矩形。
5. 绘制圆形
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P41_1602.jpg?sign=1738903803-bAVLUiOPWX7wGidVQ853X9jDV99wHA7w-0-dad2a64b936e6f903caad93ff0e7ac0f)
该函数用来在Surface上绘制圆形,color代表颜色的RGB值或RGBA值,pos代表圆心的坐标,radius代表圆的半径,width代表圆形外边框的粗细程度。同样,如果width的值为0,则整个圆形区域都会被颜色color填充。
6. 绘制椭圆形
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P41_1611.jpg?sign=1738903803-QUtKkh2lLK6zaQBxL4SY5dCm4rzjpSOL-0-88d9b72389ec54c0ed64eaa851cbdd15)
该函数用来在Surface上绘制椭圆形,color代表颜色,Rect代表椭圆的外接矩形,width代表椭圆形外边框的粗细程度。如果width的值为0,则整个椭圆形区域都会被颜色color填充。
7. 绘制弧线
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P41_1620.jpg?sign=1738903803-IMM60ct3mxM8o9vPlInp82Gw7ymABNlr-0-5272b4d1617f7994e2a2efe581c98774)
该函数用来绘制弧线。
注意:这里的弧线是被当作椭圆的一部分进行绘制的,因此在其参数中,也需要Rect参数指定椭圆的外接矩形。除此之外,还需要输入角度以指定绘制的弧线是椭圆的哪一部分,其参数color代表弧线的颜色;Rect代表椭圆的外接矩形;start_angle代表弧线的初始弧度,stop_angle代表弧线的终止弧度。
注意:它们的单位都是弧度(radians),而不是角度(°),其典型取值在[0,2π]范围内;参数width代表弧线线条的粗细程度。
8. 具体示例
最后给出一个示例,它使用到了上面提到的一系列函数在屏幕上绘制基本图形,代码如下。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P42_9740.jpg?sign=1738903803-bPI9pIgURraKUjJY1rTzHj0gEbeECPCD-0-42c486109a2dce42eb5509bd479a5acc)
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P43_9742.jpg?sign=1738903803-z1H8PDnMtvee2E9FpSFl0HFR2FWJVIri-0-be17059f4c1334d3e4884a71d77d71fe)
该示例的执行效果如图2-7所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P43_1677.jpg?sign=1738903803-MZcVTpErdABr37OB8Gj9Ak09c4tSiWEG-0-916cfe5021e3a36653b8e2b39bb766e6)
图2-7 图形绘制示例程序