显示图片

图片是组成游戏的重要元素,pyglet中提供了多种对于图片的处理,包括前面提到的精灵。

图片的加载十分简单,只需要使用image = pyglet.image.load(filename)即可完成加载,或者还可以使用文件流的方式进行加载,例如以下示例。

house_stream = open('house.png', 'rb')
house = pyglet.image.load('house.png', file=house_stream)

pyglet在不同的操作系统中支持不同的图片格式,这是与操作系统本身相关的,所以在图片资源格式选择上,推荐使用.bmp.dds.gif.jpg.png.tif这些比较通用的文件格式。

pyglet.image.load()返回的是AbstractImage类的实例,实例的实际类型取决于pyglet使用哪个解码器对图片文件进行了解码。但是所有被加载的图片都会有以下属性:

  • width: 图片宽度。
  • height: 图片高度。
  • anchor_x: 锚点x轴位置。
  • anchor_y: 锚点y轴位置。

在默认情况下,锚点都是位于\((0,0)\)的位置。可以使用.get_region()方法从目标图像上截取一个方形区域并重新设定锚点。

图片类型转换

通过pyglet.image.load()加载的图片默认为AbstractImage类型,但是在实际使用中常常使用到Texture和ImageData、BufferImage等类型的实例,所以pyglet提供了.get_texture().get_image_data()来转换不同的类型。

其中ImageData、ImageDataRegion、CompressedImageData、BufferImage可以通过调用.get_texture()来转换为Texture和TextureRegion类型的图像;反之则可以使用.get_image_data()来获得。

分区图像

接触过CSS Sprites的读者可能会对此节内容比较熟悉。对于序列动画的存储,一般不是将每一帧图片都保存为一个图片文件的,而是将其放置在同一个图片文件中,排布形成一个较大的图片文件,之后在读取时只需要按照一定格式进行拆解即可。

pyglet提供了一个可以用来直接读取这种分区图像的类,ImageGrid。其创建格式为image_seq = pyglet.image.ImageGrid(AbstractImage, rows, columns)。之后可以通过序列索引来访问每个分区图像的内容。

精灵

这里再一次提到了精灵(Sprites),前面所介绍的全部都是图片的加载和转换,但是真正能够将图片渲染到画面上,需要借助于Sprites类。Sprites类除了用于将图片渲染到画面中,还可以对图片进行变换、移动等操作。

要通过一个加载后的图片来创建精灵,可以使用以下初始化格式sprite = pyglet.sprite.Sprite(img=AbstractImage)。调用sprite.draw()方法可以将精灵渲染到画面上。

精灵也支持批量渲染,并且批量渲染是推荐的渲染方法。要将精灵加入批量渲染的队列中,可以在建立精灵实例时,使用batch参数指定队列。

在实际的渲染中,精灵还会分为前景物体和背景物体,这种分层渲染可以通过对精灵进行分组来完成。pyglet通过OrderedGroup类来定义不同层次的组,其创建格式为group = pyglet.graphics.OrderedGroup(n),其中n的值越小,该组内容越在最底层。要将精灵分配至不同的组,需要在创建精灵实例时,使用group参数指定其所属的组。