版本23和34间的区别 (跳过第11版)
于2006-10-11 18:15:06修订的的版本23
大小: 25122
编辑: czk
备注:
于2008-02-23 15:34:18修订的的版本34
大小: 18798
编辑: localhost
备注: converted to 1.6 markup
删除的内容标记成这样。 加入的内容标记成这样。
行号 1: 行号 1:
[[TableOfContents]]

= Surface =

表示图像的pygame对象

{{{
<<TableOfContents>>

= 图像处理 =

== 读取和保存 ==
使用pygame.image模块,可以对图像进行读取和保存。

使用pygame.image.load读取图像文件。{{{
img = pygame.image.load(filename)
}}}可以读取文件名为filename的图像文件,pygame会自动确定文件的类型(比如GIF或者BMP),一般来说支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一个包含图像的Surface,Surface的格式和原来的文件相同(包括颜色格式、透明色和alpha透明)。

使用pygame.image.save可以把图像保存到文件中。{{{
pygame.image.save(img, filename)
}}}这个函数可以把img这个Surface的内容保存为filename指定的图像文件,文件格式可以是BMP、TGA、PNG或者JPEG。如果文件扩展名不认识,默认保存为TGA格式。TGA和BMP格式都是非压缩的文件。

还有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函数可以把图像序列化,即把图像保存在字符串中或者从字符串中读取图像。

== 变换 ==
使用pygame.transform模块中的函数,可以对图像进行简单的变换。所有的这些函数都需要一个Surface参数指明要处理的图像,并生成一个新的图像表示处理后的结果,原来的图像不会被改变。

使用pygame.transform.flip可以上下左右颠倒图像,比如{{{
newimg = pygame.transform.flip(img, True, False)
}}}第一个参数指定要翻转的图像,第二个参数指定是否对图像进行左右颠倒,第三个参数指定是否对图像进行上下颠倒。函数返回颠倒后的图像。

使用pygame.transform.scale可以对图像进行缩放,比如{{{
newimg = pygame.transform.resize(img, (640, 480))
}}}第一个参数指定要缩放的图像,第二个参数指定缩放后的图像大小,函数返回缩放后的图像。

使用pygame.transform.rotate可以对图像进行旋转,比如{{{
newimg = pygame.transform.rotate(img, 30.0)
}}}第一个参数指定要旋转的图像,第二个参数指定旋转的角度数,正值为逆时针旋转,负值是顺时针旋转。函数返回旋转后的图像。旋转后的图像可能比原来的图像大,才能够容纳原来的整个图像,空出来的部分会补上透明色或者原来图像的左上角点的颜色。

使用pygame.transform.rotozoom可以对图像进行缩放并旋转,比如{{{
newimg = pygame.transform.rotozoom(img, 30.0, 2.0)
}}}第一个参数指定要处理的图像,第二个参数指定旋转的角度数,第三个参数指定缩放的比例。返回处理后的图像。这个函数和前面两个函数不一样,这个函数会对图像进行滤波处理,图像效果会更好,但是速度会慢很多。

使用pygame.transform.scale2x可以对图像进行快速的两倍大小的放大,比如{{{
newimg = pygame.transform.scale2x(img)
}}}

使用pygame.transform.chop可以对图像进行裁减,比如{{{
newimg = pygame.transform.chop(img, (100, 100, 200, 200))
}}}第一个参数指定要裁减的图像,第二个参数指定要保留的图像的区域。返回裁减后留下的图像。

= 对surface的控制 =

== 像素格式 ==
pygame里的Surface是用来表示图像的对象。Surface有一定的大小和像素格式。在创建的时候,可以指定。{{{
行号 11: 行号 52:

pygame里的Surface是用来表示图像的对象。Surface有一定的大小和像素格式。如果是8bit像素格式的Surface,它还会用一个调色板映射到24比特颜色。

调用pygame.Surface可以创建表示图像的新对象。Surface会整个全是黑的。唯一需要指定的参数是大小。如果不指定其他参数,Surface的像素格式会与display Surface的像素格式尽量一致。

像素格式可以通过指定像素深度或者已有的Surface来控制。flags标志位参数是其他一些Surface选项的集合,你可以指定如下的标志

 * HWSURFACE, 在视频内存中创建图像
 * SRCALPHA, 像素格式中会包含一个alpha通道

这些参数都仅仅是一个请求,在实际中可能并不能实现。

高级用户可以组合一组颜色屏蔽位,masks是4个整数的集合,表示像素里的哪个位用来表示一种颜色。一般的Surface不需要masks参数。

Surface可以有一些额外的属性,比如alpha平面、透明色、源矩形剪切。这些功能主要影响一个Surface如何被blit到其它的Surface。如果可能的话,blit函数会尝试使用硬件加速,否则就会使用优化的软件blit方法。

pygame支持三种类型的透明:透明色(colorkey),Surface alpha和每像素alpha。Surface alpha可以和透明色(colorkey)混合使用,但是有像素alpha的图像不能够使用其它模式。透明色(colorkey)让一种颜色值透明。任何和这个颜色相同的像素都不会被画出来。Surface alpha值是单独一个值用来改变整个图像的透明度。Surface alpha值是255表示不透明,值是0表示全透明。

而每像素alpha是不一样的,它为每个像素保存了一个透明值。这种方法允许精确的控制透明效果,但是这种方法也是最慢的。每像素alpha不能和其它方法混用。

Surface支持对单个像素的访问。访问硬件surface的像素是比较慢的,推荐不要这样做。像素可以由get_at()和set_at()函数访问。用这些函数做一些简单的操作是很好的,但是做比较复杂的像素操作就比较慢了。如果你打算做很多像素级的工作,你最好使用pygame.surfarray模块,它可以把surface像多维数组一样使用(而且比较快)。

任何直接访问Surface的像素数据的函数都要求先锁定(lock())。这些函数可以自动调用lock()和unlock()完成加锁和解锁。但是如果一个函数被调用很多次,那么就会有很多多余的加锁和解锁操作。最好是在多次使用这个函数之前,手动锁定Surface,并在结束时手动解锁。所有的需要解锁的函数的文档里面都会这样说。记住,只在需要的时候才锁住Surface。

Surface的数据在内部是表示成一个数字,包含所有的颜色。使用Surface.map_rgb和Surface.unmap_rgb来在独立的红绿蓝值和Surface的内部表示值之间的转换。

一个Surface可以引用另一个Surface的一部分。这通过Surface.subsurface函数创建。改变任何一个Surface都会影响其它的Surface。

每个Surface包含一个剪切区域。默认情况下,剪切区域是整个Surface。如果改变了剪切区域,所有的画图操作都会限制在一个比较小的范围之内。

== Surface.blit ==

把一个图像画到另一个上面
{{{
Surface.blit(source, dest, area=None, special_flags = 0): return Rect
}}}

把源Surface画到这个Surface上。画的位置可以由dest参数指定。dest可以是一对坐标值,表示源Surface的左上角在这个Surface上的坐标。dest也可以是一个矩形,矩形的左上角作为blit的位置,而矩形的大小不影响blit。

有一个可选的area矩形参数,可以用来指定只画源Surface的一部分。

一个可选的special_flags参数,可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。将来也可能有其它特殊标记添加进来。

返回的矩形表示受影响的像素的区域,不包括目标Surface以外的像素,也不包括剪切区域以外的像素。

如果blit到一个8位的Surface上,像素的alpha值会被忽略。

special_flags是在pygame 1.8中新增的。

== Surface.convert ==
改变图像的像素格式
{{{
如果是8bit像素格式的Surface,它还会用一个调色板映射到24比特颜色。像素格式可以通过指定像素深度或者已有的Surface来控制。flags标志位参数是其他一些Surface选项的集合,你可以指定如下的标志

    * HWSURFACE, 在视频内存中创建图像
    * SRCALPHA, 像素格式中会包含一个alpha通道

这些参数都仅仅是一个请求,在实际中可能并不能实现。高级用户可以组合一组颜色屏蔽位,masks是4个整数的集合,表示像素里的哪个位用来表示一种颜色。一般的Surface不需要masks参数。

8bit的Surface有一个调色板,把8bit的整数映射到RGB彩色。通过下面函数可以对调色板进行设置:{{{
Surface.set_at(index, RGB): return None
Surface.set_palette([RGB, RGB, RGB, ...]): return None
}}}通过下面的函数可以获得当前的调色板:{{{
Surface.get_palette(): return [RGB, RGB, RGB, ...]
Surface.get_palette_at(index): return RGB
}}}

不同像素类型的Surface之间的blit操作是很慢的,所以一般在blit之前要先通过Surface.convert对图像进行像素格式的变换。Surface.convert有多种不同的用法{{{
行号 67: 行号 72:
}}}
创建一个像素格式不一样的新的Surface。
新的像素格式可以由现存其它Surface确定,也可以由depth,flags或者masks决定。这些参数和pygame.Surface的参数类似。
}}}新的像素格式可以由现存其它Surface确定,也可以由depth,flags或者masks决定。这些参数和pygame.Surface的参数类似。
行号 74: 行号 78:
== Surface.copy ==
创建一个Surface的拷贝
{{{
Surface.copy(): return Surface
}}}
创建一个Surface的复制品。新创建的Surface和原来的Surface有相同的像素格式、调色板和透明设置。

== Surface.fill ==

用一个颜色填充Surface
{{{
Surface.fill(color, rect=None): return Rect
}}}
用一种颜色填充Surface。如果没有给定rect参数,整个Surface会被填充。rect参数会限制备填充的区域。填充区域同样受到Surface的剪切区域的影响。

颜色参数可以是RGB序列或者是颜色索引值。

这个函数会返回受影响的Surface区域。

== Surface.set_colorkey ==

设置透明色colorkey
{{{
如果Surface是有alpha通道的,并且需要保留这个信息,则需要使用Surface.convert_alpha:{{{
Surface.convert_alpha(Surface): return Surface
Surface.convert_alpha(): return Surface
}}}

== 块复制 ==
一个图像复制到另一个上面,这是游戏中最常用的操作,由blit函数来实现{{{
Surface.blit(source, dest, area=None, special_flags = 0): return Rect
}}}画的位置可以由dest参数指定。dest可以是一对坐标值,表示源Surface的左上角在这个Surface上的坐标。dest也可以是一个矩形,矩形的左上角作为blit的位置,而矩形的大小不影响blit。

有一个可选的area矩形参数,可以用来指定只画源Surface的一部分。

一个可选的special_flags参数,可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。将来也可能有其它特殊标记添加进来。

函数返回的矩形表示受影响的像素的区域,不包括目标Surface以外的像素,也不包括剪切区域以外的像素。



== 透明 ==
pygame支持三种类型的透明:透明色(colorkey),Surface alpha和每像素alpha。Surface alpha可以和透明色(colorkey)混合使用,但是有像素alpha的图像不能够使用其它模式。透明色(colorkey)让一种颜色值透明。任何和这个颜色相同的像素都不会被画出来。Surface alpha值是单独一个值用来改变整个图像的透明度。Surface alpha值是255表示不透明,值是0表示全透明。而每像素alpha是不一样的,它为每个像素保存了一个透明值。这种方法允许精确的控制透明效果,但是这种方法也是最慢的。每像素alpha不能和其它方法混用。

要设置透明色,使用Surface.set_colorkey函数:{{{
行号 99: 行号 102:
}}}
设置Surface的透明色。当把这个Surface blit到令一个Surface时候,和这个透明色颜色相同的像素会变成透明。color参数可以是RGB颜色或者是一个映射的整数。如果传送的是None,则Surface会没有透明色。

如果是有每像素透明的Surface,透明色会被忽略。透明色可以和Surface alpha混合使用。

可选的flags参数可以是pygame.RLEACCEL,用来在没有加速的时候提供更好的性能。设置了RLEACCEL的Surface作为源Surface blit更快,但是修改Surface的内容会更慢。


== Surface.get_at ==

获得特定像素点的颜色值
{{{
Surface.get_at((x, y)): return Color
}}}

返回指定像素的RGBA颜色值。如果Surface没有每像素alpha,alpha值总是255(不透明)。如果像素位置在Surface的区域以外,会引发一个IndexError异常。

在游戏和实时模拟中,一次取得和设置一个像素是很慢的。

这个函数会根据需要临时加锁和解锁Surface。

== Surface.set_at ==

设置特定像素点的颜色值
{{{
Surface.set_at((x, y), Color): return None
}}}

为一个像素设置RGBA或者映射的整数颜色值。如果Surface没有每像素alpha,alpha值会被忽略。对Surface区域之外或者剪切区域之外的像素设置颜色不会有任何效果。

在游戏和实时模拟中,一次取得和设置一个像素是很慢的。

这个函数会根据需要临时加锁和解锁Surface。

== Surface.set_clip ==
设置Surface的剪切区域
{{{
}}}当把这个Surface blit到令一个Surface时候,和这个透明色颜色相同的像素会变成透明。color参数可以是RGB颜色或者是一个映射的整数。如果传送的是None,则Surface会没有透明色。如果是有每像素透明的Surface,透明色会被忽略。透明色可以和Surface alpha混合使用。可选的flags参数可以是pygame.RLEACCEL,用来在没有加速的时候提供更好的性能。设置了RLEACCEL的Surface作为源Surface blit更快,但是修改Surface的内容会更慢。

Surface的当前透明色可以通过Surface.get_colorkey获得:{{{
Surface.get_colorkey(): return RGB or None
}}}如果没有透明色,则函数返回None。


要设置Surface的alpha值,可以通过Surface.set_alpha来实现:{{{
Surface.set_alpha(value, flags=0): return None
Surface.set_alpha(None): return None
}}}透明值value可以取0到255之间的值,0是完全透明,255是完全不透明。如果value是None,则Surface就没有alpha透明了。

Surface当前的alpha值可以通过Surface.get_alpha获得:{{{
Surface.get_alpha(): return int_value or None
}}}如果没有alpha透明,则这个函数返回None。

每像素在绘图的时侯可以通过颜色元组的第四个参数指定。

== 剪切区域 ==
每个Surface包含一个剪切区域。默认情况下,剪切区域是整个Surface。如果改变了剪切区域,所有的画图操作都会限制在一个比较小的范围之内。

通过Surface.set_clip可以设置剪切区域:{{{
行号 138: 行号 126:
}}}
每个Surface都有一个剪切区域。这个区域是个矩形,表示只有在这个矩形内的像素可以被修改。
如果指定None作为矩形区域,则整个Surface都可以修改。

剪切区域总是在Surface本身的区域只内的。如果剪切区域比Surface的区域大,则会自动缩小到Surface区域之内。
       

== Surface.get_clip ==
获得Surface的当前剪切区域
{{{
}}}如果参数是None,则整个Surface都可以修改。剪切区域总是在Surface本身的区域只内的。如果剪切区域比Surface的区域大,则会自动缩小到Surface区域之内。


要获得Surface的当前剪切区域,可以通过Surface.get_clip{{{
行号 148: 行号 131:
}}}
返回Surface的当前剪切区域。一个Surface总是返回一个有效的矩形,不会超过图像的边界范围。如果Surface设置了None作为剪切区域,则Surface会返回整个Surface的区域。

== Surface.get_size ==

获得Surface的大小
{{{
Surface.get_size(): return (width, height)
}}}
返回Surface的像素高度和宽度

== Surface.get_width ==

获得Surface的宽度
{{{
Surface.get_width(): return width
}}}
返回Surface的像素宽度

== Surface.get_height ==

获得Surface的高度
{{{
Surface.get_height(): return height
}}}
返回Surface的像素高度

= pygame.image =

image模块包含读取和保存图片的函数,也包括把Surfaces变成其它包可以使用的格式的函数。

注意,没有Image类。图片是作为Surface对象读入的。Surface类允许画线、设置像素、捕捉区域等操作。

image模块是pygame必须的一个模块,但是对于扩展部分的文件格式的支持是可选的。默认情况下,它只支持不压缩的BMP图像。当编译成完整的图像格式支持后,pygame.image.load函数可以支持如下类型:

    * JPG
    * PNG
    * GIF (non animated)
    * BMP
    * PCX
    * TGA (uncompressed)
    * TIF
    * LBM (and PBM)
    * PBM (and PGM, PPM)
    * XPM

保存图像只支持有限的格式。你可以保存为下列格式:

    * BMP
    * TGA
    * PNG
    * JPEG

存为PNG, JPEG格式在pygame 1.8中支持。

== pygame.image.load ==

从文件中读取一个图像。
{{{
pygame.image.load(filename): return Surface
pygame.image.load(fileobj, namehint=""): return Surface
}}}
从文件中读取一个图片。你可以传过去一个文件名,或者一个Python的文件对象。

pygame会自动确定文件的类型(比如GIF或者BMP),并创建一个新的Surface对象。某些情况下,需要知道文件的扩展名(比如GIF图像文件以.gif扩展名命名)。如果传递一个文件对象,你可能要把原来的文件名作为namehint参数传过去。

返回的Surface对象包含和文件中相同的颜色格式、透明色和alpha透明。你常常要调用Surface.convert函数来创建一个拷贝,使得图像在屏幕上画得更快。

对于alpha透明,比如.png图像,在读入后使用convert_alpha()方法来保留每个像素透明信息。

pygame并不是支持所有的图像格式。但是至少它支持不压缩的BMP格式。如果pygame.image.get_extended返回True,则你可以使用大部分的图像格式(包括png、jpg和gif)。


你应该使用os.path.join来保证兼容性。比如asurf = pygame.image.load(os.path.join('data', 'bla.png'))


== pygame.image.save ==

把图像保存到文件中
{{{
pygame.image.save(Surface, filename): return None
}}}
这个函数可以把Surface保存为BMP、TGA、PNG或者JPEG图像文件。如果文件扩展名不认识,默认保存为TGA格式。TGA和BMP格式都是非压缩的文件。

保存为PNG、JPEG格式在pygame1.8种支持。

== pygame.image.tostring ==

把图像转换为字符串。
{{{
pygame.image.tostring(Surface, format, flipped=False): return string
}}}
创建一个字符串,这个字符串可以在其它包中用fromstring方法转换回图像。某些Python图像包希望使用自底向上的图像格式(比如PyOpenGL)。如果你给flipped传送True,则字符串中表示的图像会上下翻转。

format参数可以是以下这些值。注意并不是只有8位的Surface才能使用P格式。其它的格式也能被所有Surface使用。同时也要注意,其它的图像包支持比pygame更多的图像格式。
 * P, 8bit palettized Surfaces
 * RGB, 24bit image
 * RGBX, 32bit image with unused space
 * RGBA, 32bit image with an alpha channel
 * ARGB, 32bit image with alpha channel first

== pygame.image.fromstring ==

从字符串创建一个新的Surface。

pygame.image.fromstring(string, size, format, flipped=False): return Surface

这个函数和pygame.image.tostring有类似的参数。size参数包括一对数字用来指定图像的高度和宽度。一旦新的Surface创建后,你就可以释放你的字符串了。

根据图像的大小和格式计算出来的大小必须和传过来的字符串大小一样。 否则,会导致一个异常。

参看pygame.image.frombuffer方法来更快的创建一个图像的方法。

== pygame.image.frombuffer ==

创建一个新的Surface,它的数据空间和一个字符串共享。

pygame.image.frombuffer(string, size, format): return Surface

插件一个新的Surface,它的像素数据直接从字符串中得到。这个方法和pygame.image.fromstring一样,但是不能够上下翻转原始数据。

这个函数比pygame.image.fromstring快很多,因为没有像素数据需要分配和拷贝。

= pygame.draw =

在Surface上画一些简单的图形。这些函数可以在任何格式的Surface上使用。在硬件Surface上使用会比普通的软件Surface上慢。

大部分的函数都包括一个width参数来表示画笔的大小(即形状的边缘的宽度)。如果width是0则整个图形会被颜色填充。

所有的函数都有Surface剪切区域,它的操作会被限制在这个区域里面。这些函数返回一个矩形区域表示被改动的像素的范围。

大部分表示颜色的参数是一个RGB三元组,也可以使用RGBA四元组。如果Surface包含alpha,四元组中alpha值会被直接写入到Surface里面,画图函数并不会进行透明的绘画。颜色参数也可以是一个整数,可以映射到Surface的像素格式。

这些函数在操作时必须临时锁定Surface。如果有很多一系列的绘图操作,可以使用Surface的锁定和解锁操作来加速。


== pygame.draw.rect ==

画一个矩形

pygame.draw.rect(Surface, color, Rect, width=0): return Rect

在Surface上画一个矩形。指定的Rect是矩形的区域。width参数是矩形框的粗细。如果width是0,整个矩形会被填充。

要记住的是,Surface.fill也可以画一个填充的矩形。实际上,Surface.fill在某些平台上可以用硬件加速。
      

== pygame.draw.polygon ==

画一个有任意条边的图形

pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect

在Surface上画一个多边形。pointlist参数是多边形顶点的列表。width参数是多边形的边的粗细。如果width是0,多边形是被填充的。

对于aapolygon,使用带closed参数的aalines。


== pygame.draw.circle ==

围绕一个点画一个圆

pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect

在Surface上画一个圆形。pos参数是圆的圆心,radius是半径大小。width参数是圆边的粗细,如果width是0圆会被填充。

== pygame.draw.ellipse ==

在矩形区域中画一个椭圆的形状

pygame.draw.ellipse(Surface, color, Rect, width=0): return Rect

在Surface上画一个椭圆。给定的矩形区域是椭圆填充的区域。width是边的粗细。如果width是0,椭圆会被填充。

== pygame.draw.arc ==

画椭圆的一部分

pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1): return Rect

在Surface上画一个椭圆状的弧线。rect参数指定椭圆填充的矩形。两个角度参数指定起始和终止的角度(以弧度为单位),朝右为0度。width参数是弧线的粗细。

== pygame.draw.line ==

画一条直线段

pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect

在Surface上画一条直线段。线段终点没有箭头,宽的线段终点是方形的。

== pygame.draw.lines ==

画多条连续的线段

pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rect

在Surface上画一系列的直线。pointlist是一系列点的列表。如果closed参数是True,则在最后一点和第一点之间会画一条线段。

这个函数不会画终点箭头和中间连接头。线段有尖锐的拐角,粗的线段会有看上去不正确的拐角。

== pygame.draw.aaline ==

画抗锯齿的线段

pygame.draw.aaline(Surface, color, startpos, endpos, blend=1): return Rect

在Surface上画一条抗锯齿的直线段。如果blend是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。

== pygame.draw.aalines ==

pygame.draw.aalines(Surface, color, closed, pointlist, blend=1): return Rect

画多条连续的线段,每个线段都是抗锯齿的。pointlist里面至少要两个点。closed参数如果是True,则在第一个点和最后一点之间会画一条直线。如果blend参数是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。

= pygame.font =

font模块允许允许在新创建的Surface上画TrueType字体。这个模块是可选的,并依赖于SDL_ttf。你应该测试pygame.font是否可用,并在尝试使用前初始化它。

字体的大部分工作使用Font对象来实现。这个模块它自己仅有初始化函数和pygame.font.Font函数用来创建Font对象。

你可以使用pygame.font.SysFont从系统载入字体。有一些其它的函数用来帮助查找系统字体。

pygame自带一个默认的字体。这个字体总是可以用None作为字体名字被使用。

== pygame.font.init ==

初始化font模块

pygame.font.init(): return None

这个方法会在pygame.init时自动调用。它初始化font模块。在使用这个模块的其他函数之前必须先初始化。

多次调用这个函数也不会有副作用。

== pygame.font.quit ==

uninitialize font模块

pygame.font.quit(): return None

手动uninitialize SDL_ttf的字体系统。这个函数会被pygame.quit自动调用。

如果font模块没有被初始化,调用这个函数也不会有问题。

== pygame.font.get_init ==

返回True如果font模块被初始化了

pygame.font.get_init(): return bool

测试font模块是否被初始化了。

== pygame.font.get_default_font ==

得到默认字体的文件名

pygame.font.get_default_font(): return string

返回系统字体的文件名。这个不是文件的完整路径。这个文件通常可以在和font模块相同的目录中找到,但是它也可能在其它文档中。

== pygame.font.get_fonts ==

获得所有可用的字体

pygame.font.get_fonts(): return list of strings

返回一个系统所有可用字体的列表。字体的名字会用小写,所有的空格和其它字符都被去掉了。这在大部分系统都可以用,但是某些系统找不到字体会返回一个空的列表。

== pygame.font.match_font ==

在系统中查找一个特定的字体

pygame.font.match_font(name, bold=False, italic=False): return path

返回一个系统中字体文件的完整路径。如果bold或者italic参数是True,函数会尝试去查找正确的字体族。

字体的名字可以是逗号隔开的字体的列表。如果没有一个给定字体找到,函数返回None。

比如:{{{
print pygame.font.match_font('bitstreamverasans')
# output is: /usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf
# (but only if you have Vera on your system)
}}}

== pygame.font.SysFont ==

从系统字体创建一个Font对象

pygame.font.SysFont(name, size, bold=False, italic=False): return Font

返回一个新建的从系统字体装载的Font对象。字体会对应请求的bold和italic标志。如果不能找到合适的系统字体,这个函数会载入缺省的pygame字体。字体名字可以是逗号隔开的字体名字的列表。

== pygame.font.Font ==

从文件创建一个Font对象

pygame.font.Font(filename, size): return Font

pygame.font.Font(object, size): return Font

从给定的文件名或者python文件对象载入新的字体。size是字体的高度。如果文件名是None,pygame的默认字体会被载入。如果参数指定的字体不能载入,会引发一个异常。一旦字体创建后,字体的大小不能被改变。

Font对象主要用来把文字画成新的Surface对象。画的过程可以模拟黑体和斜体的效果,但是最好使用真正的斜体和黑体字体。被画文字可以使普通字符串,也可以是unicode串。
       
=== Font.render ===

在新的Surface上画出文字。

Font.render(text, antialias, color, background=None): return Surface

这个函数创建一个新Surface对象,它上面包含了画出来的文字。pygame没有提供直接在存在的Surface上画文字的方法,而必须采用Font.render来创建一个新的Surface,然后把它blit到其他Surface上。

文字只能包含一行,换行符不会被画出来。antialias抗锯齿参数如果是真的,字符会有光滑的边缘。color参数指定了文字的颜色(比如(0,0,255)为蓝色)。可选的background参数用来指定文字背景的颜色。如果没有指定background,背景是透明的。

返回的Surface的大小是包含文字的必须的大小。(和Font.size()一样。)如果text是空字符串,会返回一个空白的Surface,只有一个像素宽和一个字符的高度。

返回的Surface的类型依赖于background和antialias的类型。因为性能的原因,最好要知道图像是哪种类型的。如果没有使用antialias,返回的图像是带两个调色板的8位的图像。如果background是透明的,会设置一个透明色colorkey。抗锯齿的图像会使用24位RGB图像。如果背景是透明的,会使用像素alpha。

优化:如果你知道最后文字的背景是单一的颜色,并且文字是抗锯齿的,那么你可以通过指定背景色来改进性能。这使得图像通过透明色colorkey而不是alpha(这个要慢得多)来指定透明信息。

如果你画'\n'字符,一个未知的字符会被画出来,通常是一个矩形。你应该自己去处理多行字符串。

画字体不是线程安全的:一个时刻只能有一个线程在画文字。

=== Font.size ===

确定画文字需要的大小

Font.size(text): return (width, height)

返回画文字需要的大小。这个函数可以帮助确定文字的位置,也可以用来确定文字换行和其他布局效果。

注意,大部分字体都会对特定的字符使用字据调整。比如说字符串“ae”的宽度不总是和"a"+"e"的宽度一致。

=== Font.set_underline ===

控制文字是否有下划线

Font.set_underline(bool): return None

当开启这个选项, 所有的文字都会有下划线。不管字体多大,下划线总是只有一个像素的宽度。这个选项可以和粗体、斜体混合使用。

=== Font.get_underline ===

检查画出来的文字是否有下划线。

Font.get_underline(): return bool

当字体设置有下划线,这个函数返回真。
       

=== Font.set_bold ===

开启文字的伪粗体

Font.set_bold(bool): return None

开启伪粗体。这是对字体进行伸展而得到的伪粗体,用在很多字体上不好看。如果可能的话,应该载入一个真正的粗体。当这个选项开启后,字符会有不同的宽度。这个选项可以和斜体和下划线混合使用。

=== Font.get_bold ===

检查字体设置是否用粗体。

Font.get_bold(): return bool

如果字体设置了粗体,返回真。

=== Font.set_italic ===

设置字体的伪斜体

Font.set_bold(bool): return None

开启字体的伪斜体。这是对字体进行倾斜而得到的伪斜体,用在很多字体上不好看。如果可能的话,应该载入真正的斜体。当开启了斜体后,字符的宽度可能会不同。这个选项可以和粗体、下划线混合使用。

=== Font.get_italic ===

检查字体设置是否为斜体

Font.get_italic(): return bool

如果字体设置了斜体,则返回真。


=== Font.get_linesize ===

获得行的高度。

Font.get_linesize(): return int

返回一行文字的像素高度。当画很多行字符的时候,这个高度是两行间的间隔的推荐值。

=== Font.get_height ===

获取字体的高度。

      Font.get_height(): return int

返回文字的实际像素高度。这是这种这种字体里的字符的平均高度。

=== Font.get_ascent ===

获得字体的ascent高度。

Font.get_ascent(): return int

返回字体的ascent像素高度。ascent是从字体的基线到字体顶部的像素高度。

=== Font.get_descent ===

获得字体的descent高度

Font.get_descent(): return int

返回字体的descent高度。descent是指从字体基线到字体底部的像素高度。
}}}一个Surface总是返回一个有效的矩形,不会超过图像的边界范围。如果Surface设置了None作为剪切区域,则Surface会返回整个Surface的区域。

== 锁定 ==
对于硬件加速的Surface,它有可能被存在显示内存中。要访问这些Surface上面的像素,就必须先通过Surface.lock对像素进行锁定:{{{
Surface.lock(): return None
}}}锁定完后,可以对Surface上的像素进行操作,操作完成后,应该及时解锁:{{{
Surface.unlock(): return None
}}}一个Surface是否要先锁定再操作,可以通过Surface.mustlock来判断:{{{
Surface.mustlock(): return bool
}}}这个函数返回Ture则需要锁定,否则不需要锁定。一个Surface当前的锁定状态可以通过Surface.get_locked来获得:{{{
Surface.get_locked(): return bool
}}}这个函数返回True表示已经锁定了,False表示没有锁定。

实际上,pygame中所有需要锁定Surface才能操作的函数都会自动地对Surface锁定和解锁。一般情况下不需要调用lock和unlock函数。但是如果在一段代码中需要反复对Surface上的像素进行操作,则每次都进行锁定和解锁会非常的慢,所以可以在这一串操作开始的时候进行锁定,这一串操作结束后解锁,避免重复的锁定解锁操作。


= 绘图 =
除了可以把事先画好的图片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))
}}}

图像处理

1. 读取和保存

使用pygame.image模块,可以对图像进行读取和保存。

使用pygame.image.load读取图像文件。

img = pygame.image.load(filename)

可以读取文件名为filename的图像文件,pygame会自动确定文件的类型(比如GIF或者BMP),一般来说支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一个包含图像的Surface,Surface的格式和原来的文件相同(包括颜色格式、透明色和alpha透明)。

使用pygame.image.save可以把图像保存到文件中。

pygame.image.save(img, filename)

这个函数可以把img这个Surface的内容保存为filename指定的图像文件,文件格式可以是BMP、TGA、PNG或者JPEG。如果文件扩展名不认识,默认保存为TGA格式。TGA和BMP格式都是非压缩的文件。

还有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函数可以把图像序列化,即把图像保存在字符串中或者从字符串中读取图像。

2. 变换

使用pygame.transform模块中的函数,可以对图像进行简单的变换。所有的这些函数都需要一个Surface参数指明要处理的图像,并生成一个新的图像表示处理后的结果,原来的图像不会被改变。

使用pygame.transform.flip可以上下左右颠倒图像,比如

newimg = pygame.transform.flip(img, True, False)

第一个参数指定要翻转的图像,第二个参数指定是否对图像进行左右颠倒,第三个参数指定是否对图像进行上下颠倒。函数返回颠倒后的图像。

使用pygame.transform.scale可以对图像进行缩放,比如

newimg = pygame.transform.resize(img, (640, 480))

第一个参数指定要缩放的图像,第二个参数指定缩放后的图像大小,函数返回缩放后的图像。

使用pygame.transform.rotate可以对图像进行旋转,比如

newimg = pygame.transform.rotate(img, 30.0)

第一个参数指定要旋转的图像,第二个参数指定旋转的角度数,正值为逆时针旋转,负值是顺时针旋转。函数返回旋转后的图像。旋转后的图像可能比原来的图像大,才能够容纳原来的整个图像,空出来的部分会补上透明色或者原来图像的左上角点的颜色。

使用pygame.transform.rotozoom可以对图像进行缩放并旋转,比如

newimg = pygame.transform.rotozoom(img, 30.0, 2.0)

第一个参数指定要处理的图像,第二个参数指定旋转的角度数,第三个参数指定缩放的比例。返回处理后的图像。这个函数和前面两个函数不一样,这个函数会对图像进行滤波处理,图像效果会更好,但是速度会慢很多。

使用pygame.transform.scale2x可以对图像进行快速的两倍大小的放大,比如

newimg = pygame.transform.scale2x(img)

使用pygame.transform.chop可以对图像进行裁减,比如

newimg = pygame.transform.chop(img, (100, 100, 200, 200))

第一个参数指定要裁减的图像,第二个参数指定要保留的图像的区域。返回裁减后留下的图像。

对surface的控制

1. 像素格式

pygame里的Surface是用来表示图像的对象。Surface有一定的大小和像素格式。在创建的时候,可以指定。

pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surface
pygame.Surface((width, height), flags=0, Surface): return Surface

如果是8bit像素格式的Surface,它还会用一个调色板映射到24比特颜色。像素格式可以通过指定像素深度或者已有的Surface来控制。flags标志位参数是其他一些Surface选项的集合,你可以指定如下的标志

  • HWSURFACE, 在视频内存中创建图像
  • SRCALPHA, 像素格式中会包含一个alpha通道

这些参数都仅仅是一个请求,在实际中可能并不能实现。高级用户可以组合一组颜色屏蔽位,masks是4个整数的集合,表示像素里的哪个位用来表示一种颜色。一般的Surface不需要masks参数。

8bit的Surface有一个调色板,把8bit的整数映射到RGB彩色。通过下面函数可以对调色板进行设置:

Surface.set_at(index, RGB): return None
Surface.set_palette([RGB, RGB, RGB, ...]): return None

通过下面的函数可以获得当前的调色板:

Surface.get_palette(): return [RGB, RGB, RGB, ...]
Surface.get_palette_at(index): return RGB

不同像素类型的Surface之间的blit操作是很慢的,所以一般在blit之前要先通过Surface.convert对图像进行像素格式的变换。Surface.convert有多种不同的用法

Surface.convert(Surface): return Surface
Surface.convert(depth, flags=0): return Surface
Surface.convert(masks, flags=0): return Surface
Surface.convert(): return Surface

新的像素格式可以由现存其它Surface确定,也可以由depth,flags或者masks决定。这些参数和pygame.Surface的参数类似。

如果没有参数,新的Surface会和display Surface的像素格式一样。这是画图最快的格式。转换所有需要多次blit的Surface是一个好主意。

转换出来的Surface不会有像素alpha。如果原来的Surface里面有,他们会被去掉。参看Surface.convert_alpha来保留或者创建每像素alpha。

如果Surface是有alpha通道的,并且需要保留这个信息,则需要使用Surface.convert_alpha:

Surface.convert_alpha(Surface): return Surface
Surface.convert_alpha(): return Surface

2. 块复制

一个图像复制到另一个上面,这是游戏中最常用的操作,由blit函数来实现

Surface.blit(source, dest, area=None, special_flags = 0): return Rect

画的位置可以由dest参数指定。dest可以是一对坐标值,表示源Surface的左上角在这个Surface上的坐标。dest也可以是一个矩形,矩形的左上角作为blit的位置,而矩形的大小不影响blit。

有一个可选的area矩形参数,可以用来指定只画源Surface的一部分。

一个可选的special_flags参数,可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。将来也可能有其它特殊标记添加进来。

函数返回的矩形表示受影响的像素的区域,不包括目标Surface以外的像素,也不包括剪切区域以外的像素。

3. 透明

pygame支持三种类型的透明:透明色(colorkey),Surface alpha和每像素alpha。Surface alpha可以和透明色(colorkey)混合使用,但是有像素alpha的图像不能够使用其它模式。透明色(colorkey)让一种颜色值透明。任何和这个颜色相同的像素都不会被画出来。Surface alpha值是单独一个值用来改变整个图像的透明度。Surface alpha值是255表示不透明,值是0表示全透明。而每像素alpha是不一样的,它为每个像素保存了一个透明值。这种方法允许精确的控制透明效果,但是这种方法也是最慢的。每像素alpha不能和其它方法混用。

要设置透明色,使用Surface.set_colorkey函数:

Surface.set_colorkey(Color, flags=0): return None
Surface.set_colorkey(None): return None

当把这个Surface blit到令一个Surface时候,和这个透明色颜色相同的像素会变成透明。color参数可以是RGB颜色或者是一个映射的整数。如果传送的是None,则Surface会没有透明色。如果是有每像素透明的Surface,透明色会被忽略。透明色可以和Surface alpha混合使用。可选的flags参数可以是pygame.RLEACCEL,用来在没有加速的时候提供更好的性能。设置了RLEACCEL的Surface作为源Surface blit更快,但是修改Surface的内容会更慢。

Surface的当前透明色可以通过Surface.get_colorkey获得:

Surface.get_colorkey(): return RGB or None

如果没有透明色,则函数返回None。

要设置Surface的alpha值,可以通过Surface.set_alpha来实现:

Surface.set_alpha(value, flags=0): return None
Surface.set_alpha(None): return None

透明值value可以取0到255之间的值,0是完全透明,255是完全不透明。如果value是None,则Surface就没有alpha透明了。

Surface当前的alpha值可以通过Surface.get_alpha获得:

Surface.get_alpha(): return int_value or None

如果没有alpha透明,则这个函数返回None。

每像素在绘图的时侯可以通过颜色元组的第四个参数指定。

4. 剪切区域

每个Surface包含一个剪切区域。默认情况下,剪切区域是整个Surface。如果改变了剪切区域,所有的画图操作都会限制在一个比较小的范围之内。

通过Surface.set_clip可以设置剪切区域:

Surface.set_clip(rect): return None
Surface.set_clip(None): return None

如果参数是None,则整个Surface都可以修改。剪切区域总是在Surface本身的区域只内的。如果剪切区域比Surface的区域大,则会自动缩小到Surface区域之内。

要获得Surface的当前剪切区域,可以通过Surface.get_clip:

Surface.get_clip(): return Rect

一个Surface总是返回一个有效的矩形,不会超过图像的边界范围。如果Surface设置了None作为剪切区域,则Surface会返回整个Surface的区域。

5. 锁定

对于硬件加速的Surface,它有可能被存在显示内存中。要访问这些Surface上面的像素,就必须先通过Surface.lock对像素进行锁定:

Surface.lock(): return None

锁定完后,可以对Surface上的像素进行操作,操作完成后,应该及时解锁:

Surface.unlock(): return None

一个Surface是否要先锁定再操作,可以通过Surface.mustlock来判断:

Surface.mustlock(): return bool

这个函数返回Ture则需要锁定,否则不需要锁定。一个Surface当前的锁定状态可以通过Surface.get_locked来获得:

Surface.get_locked(): return bool

这个函数返回True表示已经锁定了,False表示没有锁定。

实际上,pygame中所有需要锁定Surface才能操作的函数都会自动地对Surface锁定和解锁。一般情况下不需要调用lock和unlock函数。但是如果在一段代码中需要反复对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))

The end

Pygame图形接口基础 (2008-02-23 15:34:18由localhost编辑)

ch3n2k.com | Copyright (c) 2004-2020 czk.