ISprite接口用于渲染sprites(精灵)和tile maps(tile 地图)
一个sprite对象可以看做拥有各种附加属性的位图。附加的属性包括:该Sprite要绘制的位置,变
换方式和透明度等。
主要用于在游戏中绘制可以活动的人物和对象。
接口使用方式:
1、调用ISPRITE_SetSpriteBuffer()设置包含sprite的图像到ISprite缓冲中。
2、调用ISPRITE_DrawSprites()将缓冲中的sprite图像绘制出来。
ISPRITE_SetSpriteBuffer()函数说明:
函数原型:
int ISPRITE_SetSpriteBuffer(ISprite *po, uint8 unSpriteSize,
       IBitmap *pbmSpriteBuffer);
函数用于设置sprite缓冲,告知sprite引擎去哪里查找特定大小的sprite图像。
sprite引擎为每个不同大小的sprite维护一个单独的缓冲。
参数说明:
1)po:   ISprite接口对象
2)unSpriteSize: 缓冲区中sprite对象的大小(指单个sprite对象大小,
    而不是缓冲区中整个图像的大小)
    与AEESpriteCmd中的unSpriteSize字段对应。必须设定为
    SPRITE_SIZE_n*n,对应相应的n*n像素大小的正方形图像。
3)pbmSpriteBuffer: 放到sprite缓冲中的位图,该位图包含着以单列方式排列的多个
    大小为unSpriteSize的sprite图像。各个图像 以索引标示,索
    引值从0开始,sprite引擎将在该位图缓冲中查找特定索引值的
    sprite图像。
    pbmSpriteBuffer设为NULL时,将强制sprite引擎释放相应的
    sprite缓冲。
*可以通过多次调用ISPRITE_SetSpriteBuffer(),将一个ISprite接口关联多个sprite图像缓
冲。不过不同的sprite图像缓冲必须为不同size。绘制时分别用相应size的AEESpriteCmd对
象来对应。
ISPRITE_DrawSprites()函数说明:
函数原型:
int ISPRITE_DrawSprites(ISprite *po, AEESpriteCmd *pCmds);
该函数将导致在pCmds数组中的sprite对象绘制到ISPRITE_SetDestination()指定的
目标缓冲区中。sprite引擎将依次遍历pCmds 数组4次,第一次仅绘制数组中unLayer
字段为0的sprite,后续几遍再分别绘制1、2、3层。
pCmds数组必须以unSpriteSize设为SPRITE_SIZE_END的虚拟条目结束。
参数说明:
1)po:   ISprite接口对象。
2)pCmds:  AEESpriteCmd结构数组
AEESpriteCmd结构说明:
typedef struct {
int16 x;
int16 y;
uint16 unTransform;
uint8 unMatrixTransform;
uint8 unSpriteIndex;
uint8 unSpriteSize;
uint8 unComposite;
uint8 unLayer;
uint8 reserved[5];
} AEESpriteCmd;
各字段说明:
1)x ,y:    sprite(没有变换过的no-Transformed)的左上角 在
     目标位图上的坐标。即sprite要绘制到目标位图中的位置。
2)unTransform:  包含了sprite变换属性的组合。可以是以下任意一个或多
     个属性的组合。
     SPRITE_FLIP_X(上下翻转),
     SPRITE_FLIP_Y(左右翻转),
     SPRITE_ROTATE_90(逆时针翻转90。),
     SPRITE_ROTATE_180(逆时针翻转180。),
     SPRITE_ROTATE_270(逆时针翻转270。),
     SPRITE_SCALE_2(放大2倍),
     SPRITE_SCALE_4(放大4倍),
     SPRITE_SCALE_8(放大8倍),
     SPRITE_SCALE_EIGTH(缩小8倍),
     SPRITE_SCALE_QUARTER(缩小4倍),
     SPRITE_SCALE_HALF(缩小2倍),
3)unMatrixTransform: 转换表的索引。只有当字段unTransform 设为
     SPRITE_MATRIX_TRANSFORM时才起作用。
4)unSpriteIndex:  要绘制的sprite图像(在sprite缓冲图像中)的索引。
     在缓冲图像中,该sprite图像的坐标是:
     x = 0, y = unSpriteIndex * [sprite图像高度],
     这里的sprite图像高度为像素值,与unSpriteSize字段的
     字面值相同。
5)unSpriteSize:  sprite图像的大小(单个sprite图像)。格式为
     SPRITE_SIZE_n*n,包括
     SPRITE_SIZE_8*8
     SPRITE_SIZE_16*16
     SPRITE_SIZE_32*32
     SPRITE_SIZE_64*64,分别对应不同的像素大小:
     8*8像素,16*16像素…………。
     unSpriteSize设为SPRITE_SIZE_END时,表示sprite
     数组结束,sprite数组必须有一个元素的unSpriteSize字段
     设为SPRITE_SIZE_END,来表示该数组的结束。
6)unComposite:  指定sprite的透明度:COMPOSITE_KEYCOLOR(透明),
         COMPOSITE_OPAQUE(不透明)
7)unLayer:   sprite的层次,目前分为4个现实层和一个隐藏层。
     绘制sprite时,从SPRITE_LAYER_0开始,依次绘制到
     SPRITE_LAYER_3层,设为SPRITE_LAYER_HIDDEN
     表示不绘制当前sprite。
8)reserved:   预留,设为0。
AEESpriteCmd结构主要是用来描述ISprite接口中的sprite对象。理论上,每个sprite对象
对应图像源中的一个sprite图像。调用ISPRITE_DrawSprites()函数时,ISprite会将pCmds
数组中所有的sprites对象都绘制出来。
当ISprite接口设置了多个图像缓冲源时,ISprite会根据AEESpriteCmd结构中unSpriteSize
字段设定的大小来区分不同的图像源。
一个tile map可以看做多个位图(tiles)组成的二维矩阵。所有的位图都具有相同的大小,并且相互之间无缝连接。
一个tile map可以表示成一个索引数组。元素在数组中的位置决定了该tile要在哪里绘制,而该元素保存的索引值则
决定了哪一个tile将被绘制。
不仅数组中的每个tile元素可以关联附加属性,比如透明度和简单的变换方式,而且,整个tile map也可以设定不同
的属性,比如绘制的偏移量,tile的大小,和是否自动滚动等。
tile map主要在游戏中绘制游戏背景。
主要涉及函数:
1)ISPRITE_SetTileBuffer()
2)ISPRITE_DrawTiles()
3)ISPRITE_SetTransformTable()
ISPRITE_SetTileBuffer()
函数原型:
int ISPRITE_SetTileBuffer(ISprite *po, uint8 unTileSize, IBitmap *pbmTileBuffer);

函数用于告知sprite引擎到哪里(pbmTileBuffer)查找特定大小的tile图像。sprite引擎为不同大小的tile维护
一个单独的缓冲区。tile在该图像缓冲区中以单列的形式进行排列,如同sprite一样。同样的,tile索引的作用与
sprite索引的作用一样,都用于定位不同的tile。
参数说明:
1)po:   ISprite接口对象。
2)unTileSize:  tile图像的大小(单个),与Sprite解释相同。
3)pbmTileBuffer: 用于关联到ISprite接口的图像源。与Sprite解释相同。当设置为NULL时,将强制释放
    关联的图像源。

ISPRITE_DrawTiles()
函数原型:
int ISPRITE_DrawTiles(ISprite *po, AEETileMap *pMaps);
函数用于将pMaps数组中的tile maps绘制到指定缓冲区。数组中的每个元素都描述了一个tile map对象。
sprite引擎会遍历该数组一次。
pMaps中必须有一个元素的pMapArray字段设为NULL,表示该数组结束。
参数说明:
1)po:  ISprite接口对象。
2)pMaps: AEETileMap结构的数组。
typedef struct {
uint16 *pMapArray;
uint32 unFlags;
uint32 reserved[4];
int32 x;
int32 y;
uint16 w;
uint16 h;
uint8 unTileSize;
uint8 reserved2[3];
} AEETileMap;
参数说明:
1)pMapArray: tile图像索引和属性的数组。它是二维tile矩阵的一维表示。数组中的每个元素
   包含了相应tile的索引和属性。
   每个元素的低10位表示tile在图像源中的索引:
   TILE_INDEX_MASK和TILE_INDEX_NOTHING(0x03FF)
   都表示不在该位置上绘制tile
   高6为表示该tile的变换属性:
   TILE_FLIP_X、TILE_FLIP_Y、(横向、竖向变换)
   TILE_ROTATE_90、TILE_ROTATE_180、TILE_ROTATE_270(逆向旋转)
   TILE_TRANSPARENT
   每个元素的pMapArray都是以上一个或几个属性的组合。
   当pMapArray设为NULL时,表示数组结束,该结构的其他字段此时无效。
2)unFlags:  整个tile map的属性,目前只有MAP_FLAG_WRAP属性有效,表示可以连续显示。
3)reserved:  预留属性,必须设为0。
4)x,y:   要绘制到屏幕上的整个tile map的左上角坐标,相对于屏幕左上角坐标(0,0)的偏移量。
   注意,地图的大小一般比屏幕的要大(减少地图重绘次数),所以y有可能为负值,
   表示超出屏幕大小的位置。这一点与sprite有所区别。
   位图:

5)w,h:   整个tile map的大小,定义tile的个数,相当于tile矩阵的列数和行数。
   使用MAP_SIZE_*表示。 *为2n
6)unTileSize:  每个tile的大小,表示为TILE_SIZE_*。
7)reserved2: 预留位,必须设置为0。
ISPRITE_SetTransformTable()
函数原型:
int ISPRITE_SetTransformTable(ISprite *po, AEETransformMatrix *pTransformTable);