34
备注:
|
8244
|
删除的内容标记成这样。 | 加入的内容标记成这样。 |
行号 2: | 行号 2: |
= 图片处理 = = 绘图 = 除了可以把事先画好的图片blit到Surface上以外,还可以在Surface上自行在Surface上绘制一些简单的图形,比如点、线、方、圆等。这个功能主要由pygame.draw模块完成。 首先导入pygame.draw模块。{{{ import pygame.draw }}}如果已经用了{{{import pygame}}},则pygame.draw模块也被自动导入了。 然后准备好要在上面绘制图形的Surface,比如{{{ surface = pygame.display.set_mode((640, 480)) }}} == 画矩形 == 接下来就可以在surface上面绘制想要的图形了。比如说画矩形可以使用pygame.draw.rect函数:{{{ pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100)) }}}第一个参数指定在哪个Surface上画矩形,第二个参数是矩形的颜色,第三个参数是矩形的位置和大小。 颜色的参数一般是一个由红绿蓝三种颜色值构成的三元组,0是最暗的,255是最亮的。比如(0,0,255)是纯蓝色,(255,0,0)是纯红色,(0,0,0)是黑色,(255,255,255)是白色等等。有时候也可以使用RGBA四元组来表示颜色。如果Surface包含alpha,四元组中alpha值会被直接写入到Surface里面,画图函数并不会进行透明的绘画。颜色参数也可以是一个整数,是映射到Surface里的像素值。其他绘图函数里面的颜色参数也是一样的。 矩形参数由四个值构成的元组,分别是矩形左上角的x、y坐标,矩形的宽和高。 默认情况下,画出来的矩形是实心的(中间填充了指定的颜色)。如果要画一个只有边框的矩形,可以指定一个可选的参数width。比如{{{ pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100), 2) }}}可以在屏幕上画一个边框是2个像素粗的矩形,中间是透明的。如果不指定这个width参数,或者width指定为0,则画出来的矩形就是实心的。其他有些绘图函数里面也有类似的参数,功能也是相似的。 pygame.draw.rect函数返回一个矩形,表示屏幕上被修改的像素的区域范围。其它绘图函数也都有这样的返回值。 == 画多边形 == 用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) }}} == 画圆 == pygame.draw.circle在Surface上画一个圆形。{{{ pygame.draw.circle(surface, (255,255,0), (100, 100), 50) }}}第三个参数pos是圆的圆心,第四个参数radius是半径大小。可选的第五个参数width是圆边的粗细,如果width缺省或者是0圆会被填充。 == 画椭圆 == pygame.draw.ellipse在矩形区域中画一个椭圆的形状。比如{{{ pygame.draw.ellipse(surface, (0,255,255), (200, 200, 200, 100)) }}}第三个参数指定的矩形区域是椭圆填充的区域。可选的第四个参数width是边的粗细。如果width缺省或者是0,椭圆会被填充。 == 画弧线 == 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。 == 画线段 == pygame.draw.line函数可以画一条直线段。比如{{{ pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200)) }}}第三个参数指定起点,第四个参数指定终点。可选的第五个参数width指定线的宽度,默认是1。线段终点没有箭头,宽的线段终点是方形的。 == 画连续的线段 == pygame.draw.lines画多条连续的线段。比如{{{ pygame.draw.lines(surface, (255,255,255), False, [(100, 100), (200, 200), (300, 200), (200, 100)]) }}}第四个参数pointlist是一系列点的列表。如果第三个参数是True,则在最后一点和第一点之间会画一条线段。可选的第五个参数表示线的宽度,默认为1。这个函数不会画终点箭头和中间连接头。线段有尖锐的拐角,粗的线段会有不太好看的拐角。 == 抗锯齿的线段 == pygame.draw.aaline画抗锯齿的线段。{{{ pygame.draw.aaline(surface, (255,255,0), (200, 100), (300, 200)) }}}这个函数的用法和画线段的函数差不多,只是画出来的线段有抗锯齿效果,看上去比较光滑。有一个可选的第五个参数blend,如果blend是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。 pygame.draw.aalines可以画多条连续的抗锯齿线段。{{{ pygame.draw.aalines(surface, (0,0, 255), False, [(100, 100), (200, 200), (300, 100), (200, 0)]) }}}如果第三个参数如果是True,则在第一个点和最后一点之间会画一条直线。有一个可选的第五个参数blend,如果blend参数是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。 == 点操作 == 画点的方法和其它方法不太一样,用Surface.set_at方法完成画点的操作,比如:{{{ surface.set_at((100, 100), (255,255,255)) }}}第一个参数是点的坐标,第二个参数是颜色。在游戏和实时模拟中,一次取得和设置一个像素是很慢的。 除了可以在Surface上画点,还可以用Surface.get_at读取Surface上像素的值。比如{{{ color = surface.get_at((100, 100)) }}}这个函数返回给定点的颜色值。 == 填充区域 == Surface.fill方法可以用一种颜色填充一个矩形区域。比如{{{ surface.fill((255,0,0), (100, 200, 100, 100)) }}}第一个参数指定要填充的颜色,第二个参数指定填充的矩形区域。如果没有给定第二个参数,整个Surface会被填充。第二个参数会限制备填充的区域。这个函数会返回受影响的Surface区域。 = 写字 = 相对于在Surface上画图,在Surface上写文字要复杂得多。 首先需要导入pygame.font模块并初始化。{{{ import pygame.font pygame.font.init() }}} == 选择字体 == 然后用pygame.font.get_fonts获取可用的字体的列表。{{{ pygame.font.get_fonts() }}}它返回一个字体名字的列表。 然后再用字体名字列表中的一个名字可以创建一个字体对象。{{{ font = pygame.font.SysFont("monospace", 12) }}}第一个参数指定字体的名字,第二个参数指定字体的大小。可选的第三个参数bold指定是否粗体,默认不是粗题。可选的地四个参数italic指定是否斜体,默认不是斜体。 如果是要使用自己给的字体文件,可以这样创建字体对象{{{ font = pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12) }}}第一个参数指定要载入的字体文件的完整路径,第二个参数指定字体的大小。 == 创建文字Surface == 使用字体对象的Font.render函数可以创建一个Surface,里面包含写出来的文字。比如{{{ font_surface = font.render("Hello world!", False, (255,0,0)) }}}第一个参数是要写的文字,文字只能包含一行,换行符不会被画出来。第二个参数指定是否使用抗锯齿效果,如果是True字符会有光滑的边缘。第三个参数是字体的颜色。可选的第四个参数background用来指定文字背景的颜色。如果没有指定background,背景是透明的。返回创建的Surface,它上面包含了画出来的文字,它的大小是能容纳这些字的最小的大小。 要在已有的Surface上写字,只能先创建一个只包含文字的Surface,然后把它blit到已有的Surface上。比如:{{{ surface.blit(font_surface, (100, 100)) }}} = 对surface的控制 = |
图片处理
绘图
除了可以把事先画好的图片blit到Surface上以外,还可以在Surface上自行在Surface上绘制一些简单的图形,比如点、线、方、圆等。这个功能主要由pygame.draw模块完成。
首先导入pygame.draw模块。
import pygame.draw
如果已经用了import pygame,则pygame.draw模块也被自动导入了。
然后准备好要在上面绘制图形的Surface,比如
surface = pygame.display.set_mode((640, 480))
1. 画矩形
接下来就可以在surface上面绘制想要的图形了。比如说画矩形可以使用pygame.draw.rect函数:
pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100))
第一个参数指定在哪个Surface上画矩形,第二个参数是矩形的颜色,第三个参数是矩形的位置和大小。
颜色的参数一般是一个由红绿蓝三种颜色值构成的三元组,0是最暗的,255是最亮的。比如(0,0,255)是纯蓝色,(255,0,0)是纯红色,(0,0,0)是黑色,(255,255,255)是白色等等。有时候也可以使用RGBA四元组来表示颜色。如果Surface包含alpha,四元组中alpha值会被直接写入到Surface里面,画图函数并不会进行透明的绘画。颜色参数也可以是一个整数,是映射到Surface里的像素值。其他绘图函数里面的颜色参数也是一样的。
矩形参数由四个值构成的元组,分别是矩形左上角的x、y坐标,矩形的宽和高。
默认情况下,画出来的矩形是实心的(中间填充了指定的颜色)。如果要画一个只有边框的矩形,可以指定一个可选的参数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。
== 画线段 == pygame.draw.line函数可以画一条直线段。比如
pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200))
第三个参数指定起点,第四个参数指定终点。可选的第五个参数width指定线的宽度,默认是1。线段终点没有箭头,宽的线段终点是方形的。
6. 画连续的线段
pygame.draw.lines画多条连续的线段。比如
pygame.draw.lines(surface, (255,255,255), False, [(100, 100), (200, 200), (300, 200), (200, 100)])
第四个参数pointlist是一系列点的列表。如果第三个参数是True,则在最后一点和第一点之间会画一条线段。可选的第五个参数表示线的宽度,默认为1。这个函数不会画终点箭头和中间连接头。线段有尖锐的拐角,粗的线段会有不太好看的拐角。
7. 抗锯齿的线段
pygame.draw.aaline画抗锯齿的线段。
pygame.draw.aaline(surface, (255,255,0), (200, 100), (300, 200))
这个函数的用法和画线段的函数差不多,只是画出来的线段有抗锯齿效果,看上去比较光滑。有一个可选的第五个参数blend,如果blend是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。
pygame.draw.aalines可以画多条连续的抗锯齿线段。
pygame.draw.aalines(surface, (0,0, 255), False, [(100, 100), (200, 200), (300, 100), (200, 0)])
如果第三个参数如果是True,则在第一个点和最后一点之间会画一条直线。有一个可选的第五个参数blend,如果blend参数是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。
8. 点操作
画点的方法和其它方法不太一样,用Surface.set_at方法完成画点的操作,比如:
surface.set_at((100, 100), (255,255,255))
第一个参数是点的坐标,第二个参数是颜色。在游戏和实时模拟中,一次取得和设置一个像素是很慢的。
除了可以在Surface上画点,还可以用Surface.get_at读取Surface上像素的值。比如
color = surface.get_at((100, 100))
这个函数返回给定点的颜色值。
9. 填充区域
Surface.fill方法可以用一种颜色填充一个矩形区域。比如
surface.fill((255,0,0), (100, 200, 100, 100))
第一个参数指定要填充的颜色,第二个参数指定填充的矩形区域。如果没有给定第二个参数,整个Surface会被填充。第二个参数会限制备填充的区域。这个函数会返回受影响的Surface区域。
写字
相对于在Surface上画图,在Surface上写文字要复杂得多。
首先需要导入pygame.font模块并初始化。
import pygame.font pygame.font.init()
1. 选择字体
然后用pygame.font.get_fonts获取可用的字体的列表。
pygame.font.get_fonts()
它返回一个字体名字的列表。
然后再用字体名字列表中的一个名字可以创建一个字体对象。
font = pygame.font.SysFont("monospace", 12)
第一个参数指定字体的名字,第二个参数指定字体的大小。可选的第三个参数bold指定是否粗体,默认不是粗题。可选的地四个参数italic指定是否斜体,默认不是斜体。
如果是要使用自己给的字体文件,可以这样创建字体对象
font = pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12)
第一个参数指定要载入的字体文件的完整路径,第二个参数指定字体的大小。
2. 创建文字Surface
使用字体对象的Font.render函数可以创建一个Surface,里面包含写出来的文字。比如
font_surface = font.render("Hello world!", False, (255,0,0))
第一个参数是要写的文字,文字只能包含一行,换行符不会被画出来。第二个参数指定是否使用抗锯齿效果,如果是True字符会有光滑的边缘。第三个参数是字体的颜色。可选的第四个参数background用来指定文字背景的颜色。如果没有指定background,背景是透明的。返回创建的Surface,它上面包含了画出来的文字,它的大小是能容纳这些字的最小的大小。
要在已有的Surface上写字,只能先创建一个只包含文字的Surface,然后把它blit到已有的Surface上。比如:
surface.blit(font_surface, (100, 100))
对surface的控制