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); |
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);