一。pygame.draw 绘制形状、线点
函数 | 作用 |
---|---|
rect | 绘制矩形 |
polygon | 绘制多边形(三个及三个以上的边) |
circle | 绘制圆 |
ellipse | 绘制椭圆 |
arc | 绘制圆弧 |
line | 绘制线 |
lines | 绘制一系列的线 |
aaline | 绘制一根平滑的线 |
aalines | 绘制一系列平滑的线 |
1.画矩形
画矩形可以使用pygame.draw.rect函数:
pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100))
第一个参数指定在哪个Surface上画矩形,第二个参数是矩形的颜色,第三个参数是矩形的位置和大小。第四个参数是矩形的位置大小,分别是左上角的x,y坐标,矩形的宽和高。
颜 色的参数一般是一个由红绿蓝三种颜色值构成的三元组,0是最暗的,255是最亮的。比如(0,0,255)是纯蓝色,(255,0,0)是纯红色, (0,0,0)是黑色,(255,255,255)是白色等等。有时候也可以使用RGBA四元组来表示颜色。如果Surface包含alpha,四元组中 alpha值会被直接写入到Surface里面,画图函数并不会进行透明的绘画。颜色参数也可以是一个整数,是映射到Surface里的像素值。其他绘图 函数里面的颜色参数也是一样的。
默认情况下,画出来的矩形是实心的(中间填充了指定的颜色)。如果要画一个只有边框的矩形,可以指定一个可选的参数width。比如pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100), 2)
可以在屏幕上画一个边框是2个像素粗的矩形,中间是透明的。如果不指定这个width参数,或者width指定为0,则画出来的矩形就是实心的。其他有些绘图函数里面也有类似的参数,功能也是相似的。
pygame.draw.rect函数返回一个矩形,表示屏幕上被修改的像素的区域范围。其它绘图函数也都有这样的返回值。
2.画多边形
用pygame.draw.polygon可以在Surface上画一个多边形。比如
pygame.draw.polygon(surface, (255,0,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)])
第二个参数是颜色
第三个参数pointlist参数是多边形顶点的列表。可选的第四个width参数是多边形的边的粗细。如果width是0或者被忽略,多边形是被填充的。
pygame.draw.polygon(surface, (0,255,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)],1)
3.画圆
pygame.draw.circle在Surface上画一个圆形。
pygame.draw.circle(surface, (255,255,0), (100, 100), 50)
第三个参数pos是圆的圆心,第四个参数radius是半径大小。可选的第五个参数width是圆边的粗细,如果width缺省或者是0圆会被填充。
4.画椭圆
pygame.draw.ellipse在矩形区域中画一个椭圆的形状。比如
pygame.draw.ellipse(surface, (0,255,255), (200, 200, 200, 100))
第三个参数指定的矩形区域是椭圆填充的区域。可选的第四个参数width是边的粗细。如果width缺省或者是0,椭圆会被填充。
5.画弧线
pygame.draw.arc画椭圆的一段。比如
pygame.draw.arc(surface, (0,255,0), (200, 200, 200, 100), 3.14159/3, 3.14159*2/3)
在Surface上画一个椭圆状的弧线。第三个参数rect指定椭圆填充的矩形。接下来两个角度参数指定起始和终止的角度(以弧度为单位),朝右为0度。可选的第六个参数width是弧线的粗细,默认值是1。
6.画线段 pygame.draw.line函数可以画一条直线段。比如
pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200))第一个参数指定要填充的颜色,第二个参数指定填充的矩形区域。如果没有给定第二个参数,整个Surface会被填充。第二个参数会限制备填充的区域。这个函数会返回受影响的Surface区域。
实例1.颜色平滑
我们用一种叫做“线性插值(linear interpolation)”的方法来做这件事情。为了找到两种颜色的中间色,我们将这第二种颜色与第一种颜色的差乘以一个0~1之间的小数,然后再加上第一种颜色就行了。如果这个数为0,结果就完全是第一种颜色;是1,结果就只剩下第二种颜色;中间的小数则会皆有两者的特色。
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
color1 = (221, 99, 20)
color2 = (96, 130, 51)
factor = 0.
def blend_color(color1, color2, blend_factor):
r1, g1, b1 = color1
r2, g2, b2 = color2
r = r1 + (r2 - r1) * blend_factor
g = g1 + (g2 - g1) * blend_factor
b = b1 + (b2 - b1) * blend_factor
return int(r), int(g), int(b)
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
screen.fill((255,255,255))
tri = [ (0, 120), (639, 100), (639, 140) ]
pygame.draw.polygon(screen, (0, 255, 0), tri) #画多边形 第二个参数为多边形颜色,第三个参数为多边形的顶点位置
pygame.draw.circle(screen, (0, 0, 0), (int(factor * 639.0), 120), 10)
#画圆:第二个参数为圆的颜色,第三个参数为圆心,第四个参数为半径pygame.display.update()
二、pygame.surface 管理图像和屏幕
1.剪裁:clipping
surface有一种叫裁剪区域(clipping area)的东西,也是一个矩形,定义了哪部分会被绘制,也就是说一旦定义了这个区域,那么只有这个区域内的像素会被修改,其他的位置保持不变,默认情况下,这个区域是所有地方。我们可以使用set_clip来设定,使用get_clip来获得这个区域。
screen.set_clip(100,100,200,200)
2.设置Surface的像素
我们能对Surface做的最基本的操作就是设置一个像素的色彩了,虽然我们基本不会这么做,但还是要了解。set_at方法可以做到这一点,它的参数是坐标和颜色,下面的小脚本会随机的在屏幕上画点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import
pygame
from
pygame
.
locals
import
*
from
sys
import
exit
from
random
import
randint
pygame
.
init
(
)
screen
=
pygame
.
display
.
set_mode
(
(
640
,
480
)
,
0
,
32
)
while
True
:
for
event
in
pygame
.
event
.
get
(
)
:
if
event
.
type
==
QUIT
:
exit
(
)
rand_col
=
(
randint
(
0
,
255
)
,
randint
(
0
,
255
)
,
randint
(
0
,
255
)
)
#screen.lock() #很快你就会知道这两句lock和unlock的意思了
for
_
in
xrange
(
100
)
:
rand_pos
=
(
randint
(
0
,
639
)
,
randint
(
0
,
479
)
)
screen
.
set_at
(
rand_pos
,
rand_col
) #画点,点的位置,点的颜色
#screen.unlock()
pygame
.
display
.
update
(
)
|
获得Surface上的像素
set_at的兄弟get_at可以帮我们做这件事,它接受一个坐标返回指定坐标点上的颜色。不过记住get_at在对hardware surface操作的时候很慢,而全屏的时候总是hardware的,所以慎用这个方法!