版本21和27间的区别 (跳过第6版)
于2006-10-11 15:27:19修订的的版本21
大小: 26462
编辑: czk
备注:
于2006-10-16 00:22:42修订的的版本27
大小: 8198
编辑: czk
备注:
删除的内容标记成这样。 加入的内容标记成这样。
行号 3: 行号 3:
= Surface = = 绘图 =
除了可以把事先画好的图片blit到Surface上以外,还可以在Surface上自行在Surface上绘制一些简单的图形,比如点、线、方、圆等。这个功能主要由pygame.draw模块完成。
行号 5: 行号 6:
pygame里的Surface是用来表示图像的对象。Surface有一定的大小和像素格式。如果是8bit像素格式的Surface,它还会用一个调色板映射到24比特颜色。 首先导入pygame.draw模块。{{{
import pygame.draw
}}}如果已经用了{{{import pygame}}},则pygame.draw模块也被自动导入了。
行号 7: 行号 10:
调用pygame.Surface可以创建表示图像的新对象。Surface会整个全是黑的。唯一需要指定的参数是大小。如果不指定其他参数,Surface的像素格式会与display Surface的像素格式尽量一致。 然后准备好要在上面绘制图形的Surface,比如{{{
surface = pygame.display.set_mode((640, 480))
}}}
行号 9: 行号 14:
像素格式可以通过指定像素深度或者已有的Surface来控制。flag标志位参数是其他一些Surface选项的集合,你可以指定如下的标志 == 画矩形 ==
行号 11: 行号 16:
 * HWSURFACE, 在视频内存中创建图像
 * SRCALPHA, 像素格式中会包含一个alpha通道
接下来就可以在surface上面绘制想要的图形了。比如说画矩形可以使用pygame.draw.rect函数:{{{
pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100))
}}}第一个参数指定在哪个Surface上画矩形,第二个参数是矩形的颜色,第三个参数是矩形的位置和大小。
行号 14: 行号 20:
这些参数都仅仅是一个请求,在实际中可能并不能实现。 颜色的参数一般是一个由红绿蓝三种颜色值构成的三元组,0是最暗的,255是最亮的。比如(0,0,255)是纯蓝色,(255,0,0)是纯红色,(0,0,0)是黑色,(255,255,255)是白色等等。有时候也可以使用RGBA四元组来表示颜色。如果Surface包含alpha,四元组中alpha值会被直接写入到Surface里面,画图函数并不会进行透明的绘画。颜色参数也可以是一个整数,是映射到Surface里的像素值。其他绘图函数里面的颜色参数也是一样的。
行号 16: 行号 22:
Advance users can combine a set of bitmasks with a depth value. The masks are a set of 4 integers representing which bits in a pixel will represent each color. Normal Surfaces should not require the masks argument. 矩形参数由四个值构成的元组,分别是矩形左上角的x、y坐标,矩形的宽和高。
行号 18: 行号 24:
Surfaces can have many extra attributes like alpha planes, colorkeys, source rectangle clipping. These functions mainly effect how the Surface is blitted to other Surfaces. The blit routines will attempt to use hardware acceleratio 默认情况下,画出来的矩形是实心的(中间填充了指定的颜色)。如果要画一个只有边框的矩形,可以指定一个可选的参数width。比如{{{
pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100), 2)
}}}可以在屏幕上画一个边框是2个像素粗的矩形,中间是透明的。如果不指定这个width参数,或者width指定为0,则画出来的矩形就是实心的。其他有些绘图函数里面也有类似的参数,功能也是相似的。
行号 20: 行号 28:
 when possible, otherwise will use highly optimized software blitting methods. pygame.draw.rect函数返回一个矩形,表示屏幕上被修改的像素的区域范围。其它绘图函数也都有这样的返回值。
行号 22: 行号 30:
There are three types of transparency supported in Pygame: colorkeys, surface alphas, and pixel alphas. Surface alphas can be mixed with colorkeys, but an image with per pixel alphas cannot use the other modes. Colorkey transparency makes a single color value transparent. Any pixels matching the colorkey will not be drawn. The surface alpha value is a single value that changes the transparency for the entire image. A surface alpha of 255 is opaque, and a value of 0 is completely transparent. == 画多边形 ==
行号 24: 行号 32:
Per pixel alphas are different because they store a transparency value for every pixel. This allows for the most precise transparency effects, but it also the slowest. Per pixel alphas cannot be mixed with surface alpha and colorkeys. 用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)
}}}
行号 26: 行号 39:
There is support for pixel access for the Surfaces. Pixel access on hardware surfaces is slow and not recommended. Pixels can be accessed using the get_at() and set_at() functions. These methods are fine for simple access, but will be considerably slow when doing of pixel work with them. If you plan on doing a lot of pixel level work, it is recommended to use the pygame.surfarray module, which can treat the surfaces like large multidimensional arrays (and it's quite quick). == 画圆 ==
行号 28: 行号 41:
Any functions that directly access a surface's pixel data will need that surface to be lock()'ed. These functions can lock() and unlock() the surfaces themselves without assistance. But, if a function will be called many times, there will be a lot of overhead for multiple locking and unlocking of the surface. It is best to lock the surface manually before making the function call many times, and then unlocking when you are finished. All functions that need a locked surface will say so in their docs. Remember to leave the Surface locked only while necessary. pygame.draw.circle在Surface上画一个圆形。{{{
pygame.draw.circle(surface, (255,255,0), (100, 100), 50)
}}}第三个参数pos是圆的圆心,第四个参数radius是半径大小。可选的第五个参数width是圆边的粗细,如果width缺省或者是0圆会被填充。
行号 30: 行号 45:
Surface pixels are stored internally as a single number that has all the colors encoded into it. Use the Surface.map_rgb - convert a color into a mapped color value and Surface.unmap_rgb - convert a mapped integer color value into a Color to convert between individual red, green, and blue values into a packed integer for that Surface. == 画椭圆 ==
行号 32: 行号 47:
Surfaces can also reference sections of other Surfaces. These are created with the Surface.subsurface - create a new surface that references its parent method. Any change to either Surface will effect the other. pygame.draw.ellipse在矩形区域中画一个椭圆的形状。比如{{{
pygame.draw.ellipse(surface, (0,255,255), (200, 200, 200, 100))
}}}第三个参数指定的矩形区域是椭圆填充的区域。可选的第四个参数width是边的粗细。如果width缺省或者是0,椭圆会被填充。
行号 34: 行号 51:
Each Surface contains a clipping area. By default the clip area covers the entire Surface. If it is changed, all drawing operations will only effect the smaller area. == 画弧线 ==
行号 36: 行号 53:
== Surface.blit == 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。
行号 38: 行号 58:
      draw one image onto another
      Surface.blit(source, dest, area=None, special_flags = 0): return Rect

      Draws a source Surface onto this Surface. The draw can be positioned with the dest argument. Dest can either be pair of coordinates representing the upper left corner of the source. A Rect can also be passed as the destination and the topleft corner of the rectangle will be used as the position for the blit. The size of the destination rectangle does not effect the blit.

      An optional area rectangle can be passed as well. This represents a smaller portion of the source Surface to draw.

      An optional special flags is for passing in BLEND_ADD, BLEND_SUB, BLEND_MULT, BLEND_MIN, BLEND_MAX With other special blitting flags perhaps added in the future.

      The return rectangle is the area of the affected pixels, excluding any pixels outside the destination Surface, or outside the clipping area.

      Pixel alphas will be ignored when blitting to an 8 bit Surface.

      special_flags new in pygame 1.8.
       

== Surface.convert ==

      change the pixel format of an image
      Surface.convert(Surface): return Surface
      Surface.convert(depth, flags=0): return Surface
      Surface.convert(masks, flags=0): return Surface
      Surface.convert(): return Surface

      Creates a new copy of the Surface with the pixel format changed. The new pixel format can be determined from another existing Surface. Otherwise depth, flags, and masks arguments can be used, similar to the pygame.Surface - pygame object for representing images call.

      If no arguments are passed the new Surface will have the same pixel format as the display Surface. This is always the fastest format for blitting. It is a good idea to convert all Surfaces before they are blitted many times.

      The converted Surface will have no pixel alphas. They will be stripped if the original had them. See Surface.convert_alpha - change the pixel format of an image including per pixel alphas for preserving or creating per-pixel alphas.

== Surface.copy ==

      create a new copy of a Surface
      Surface.copy(): return Surface

      Makes a duplicate copy of a Surface. The new Surface will have the same pixel formats, color palettes, and transparency settings as the original.

== Surface.fill ==

      fill Surface with a solid color
      Surface.fill(color, rect=None): return Rect

      Fill the Surface with a solid color. If no rect argument is given the entire Surface will be filled. The rect argument will limit the fill to a specific area. The fill will also be contained by the Surface clip area.

      The color argument can be either an RGB sequence or a mapped color index.

      This will return the affected Surface area.

== Surface.set_colorkey ==

      Set the transparent colorkey
      Surface.set_colorkey(Color, flags=0): return None
      Surface.set_colorkey(None): return None

      Set the current color key for the Surface. When blitting this Surface onto a destination, and pixels that have the same color as the colorkey will be transparent. The color can be an RGB color or a mapped color integer. If None is passed, the colorkey will be unset.

      The colorkey will be ignored if the Surface is formatted to use per pixel alpha values. The colorkey can be mixed with the full Surface alpha value.

      The optional flags argument can be set to pygame.RLEACCEL to provide better performance on non accelerated displays. An RLEACCEL Surface will be slower to modify, but quicker to blit as a source.
== 画线段 ==
pygame.draw.line函数可以画一条直线段。比如{{{
pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200))
}}}第三个参数指定起点,第四个参数指定终点。可选的第五个参数width指定线的宽度,默认是1。线段终点没有箭头,宽的线段终点是方形的。
行号 99: 行号 64:
== Surface.get_at == == 画连续的线段 ==
pygame.draw.lines画多条连续的线段。比如{{{
pygame.draw.lines(surface, (255,255,255), False, [(100, 100), (200, 200), (300, 200), (200, 100)])
}}}第四个参数pointlist是一系列点的列表。如果第三个参数是True,则在最后一点和第一点之间会画一条线段。可选的第五个参数表示线的宽度,默认为1。这个函数不会画终点箭头和中间连接头。线段有尖锐的拐角,粗的线段会有不太好看的拐角。
行号 101: 行号 69:
      get the color value at a single pixel
      Surface.get_at((x, y)): return Color
== 抗锯齿的线段 ==
pygame.draw.aaline画抗锯齿的线段。{{{
pygame.draw.aaline(surface, (255,255,0), (200, 100), (300, 200))
}}}这个函数的用法和画线段的函数差不多,只是画出来的线段有抗锯齿效果,看上去比较光滑。有一个可选的第五个参数blend,如果blend是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。
行号 104: 行号 74:
      Return the RGBA color value at the given pixel. If the Surface has no per pixel alpha, then the alpha value will always be 255 (opaque). If the pixel position is outside the area of the Surface an IndexError exception will be raised. pygame.draw.aalines可以画多条连续的抗锯齿线段。{{{
pygame.draw.aalines(surface, (0,0, 255), False, [(100, 100), (200, 200), (300, 100), (200, 0)])
}}}如果第三个参数如果是True,则在第一个点和最后一点之间会画一条直线。有一个可选的第五个参数blend,如果blend参数是True,则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。
行号 106: 行号 78:
      Getting and setting pixels one at a time is generally too slow to be used in a game or realtime situation. == 点操作 ==
画点的方法和其它方法不太一样,用Surface.set_at方法完成画点的操作,比如:{{{
surface.set_at((100, 100), (255,255,255))
}}}第一个参数是点的坐标,第二个参数是颜色。在游戏和实时模拟中,一次取得和设置一个像素是很慢的。
行号 108: 行号 83:
      This function will temporarily lock and unlock the Surface as needed.
       
除了可以在Surface上画点,还可以用Surface.get_at读取Surface上像素的值。比如{{{
color = surface.get_at((100, 100))
}}}这个函数返回给定点的颜色值。
行号 111: 行号 87:
== Surface.set_at == == 填充区域 ==
Surface.fill方法可以用一种颜色填充一个矩形区域。比如{{{
surface.fill((255,0,0), (100, 200, 100, 100))
}}}第一个参数指定要填充的颜色,第二个参数指定填充的矩形区域。如果没有给定第二个参数,整个Surface会被填充。第二个参数会限制备填充的区域。这个函数会返回受影响的Surface区域。
行号 113: 行号 92:
      set the color value for a single pixel
      Surface.set_at((x, y), Color): return None
= 写字 =
行号 116: 行号 94:
      Set the RGBA or mapped integer color value for a single pixel. If the Surface does not have per pixel alphas, the alpha value is ignored. Settting pixels outside the Surface area or outside the Surface clipping will have no effect. 相对于在Surface上画图,在Surface上写文字要复杂得多。
行号 118: 行号 96:
      Getting and setting pixels one at a time is generally too slow to be used in a game or realtime situation.

      This function will temporarily lock and unlock the Surface as needed.

== Surface.set_clip ==

      set the current clipping area of the Surface
      Surface.set_clip(rect): return None
      Surface.set_clip(None): return None

      Each Surface has an active clipping area. This is a rectangle that represents the only pixels on the Surface that can be modified. If None is passed for the rectangle the full Surface will be available for changes.

      The clipping area is always restricted to the area of the Surface itself. If the clip rectangle is too large it will be shrunk to fit inside the Surface.
       

== Surface.get_clip ==

      get the current clipping are of the Surface
      Surface.get_clip(): return Rect

      Return a rectangle of the current clipping area. The Surface will always return a valid rectangle that will never be outside the bounds of the image. If the Surface has had None set for the clipping area, the Surface will return a rectangle with the full area of the Surface.


== Surface.get_size ==

      get the dimensions of the Surface
      Surface.get_size(): return (width, height)

      Return the width and height of the Surface in pixels.
       

== Surface.get_width ==

      get the width of the Surface
      Surface.get_width(): return width

      Return the width of the Surface in pixels.
       

== Surface.get_height ==

      get the height of the Surface
      Surface.get_height(): return height

      Return the height of the Surface in pixels.
= 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模块并初始化。{{{
import pygame.font
pygame.font.init()
行号 421: 行号 101:
== pygame.font.SysFont == == 选择字体 ==
行号 423: 行号 103:
从系统字体创建一个Font对象 然后用pygame.font.get_fonts获取可用的字体的列表。{{{
pygame.font.get_fonts()
}}}它返回一个字体名字的列表。
行号 425: 行号 107:
pygame.font.SysFont(name, size, bold=False, italic=False): return Font 然后再用字体名字列表中的一个名字可以创建一个字体对象。{{{
font = pygame.font.SysFont("monospace", 12)
}}}第一个参数指定字体的名字,第二个参数指定字体的大小。可选的第三个参数bold指定是否粗体,默认不是粗题。可选的地四个参数italic指定是否斜体,默认不是斜体。
行号 427: 行号 111:
返回一个新建的从系统字体装载的Font对象。字体会对应请求的bold和italic标志。如果不能找到合适的系统字体,这个函数会载入缺省的pygame字体。字体名字可以是逗号隔开的字体名字的列表。 如果是要使用自己给的字体文件,可以这样创建字体对象{{{
font = pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12)
}}}第一个参数指定要载入的字体文件的完整路径,第二个参数指定字体的大小。
行号 429: 行号 115:
== pygame.font.Font == == 创建文字Surface ==
使用字体对象的Font.render函数可以创建一个Surface,里面包含写出来的文字。比如{{{
font_surface = font.render("Hello world!", False, (255,0,0))
}}}第一个参数是要写的文字,文字只能包含一行,换行符不会被画出来。第二个参数指定是否使用抗锯齿效果,如果是True字符会有光滑的边缘。第三个参数是字体的颜色。可选的第四个参数background用来指定文字背景的颜色。如果没有指定background,背景是透明的。返回创建的Surface,它上面包含了画出来的文字,它的大小是能容纳这些字的最小的大小。
行号 431: 行号 120:
从文件创建一个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,然后把它blit到已有的Surface上。比如:{{{
surface.blit(font_surface, (100, 100))
}}}

TableOfContents

绘图

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

== 选择字体 ==

然后用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)

第一个参数指定要载入的字体文件的完整路径,第二个参数指定字体的大小。

1. 创建文字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.