2010-04-30
一个tile map可以看做多个位图(tiles)组成的二维矩阵。所有的位图都具有相同的大小,并且相互之间无缝连接。
一个tile map可以表示成一个索引数组。元素在数组中的位置决定了该tile要在哪里绘制,而该元素保存的索引值则
决定了哪一个tile将被绘制。
不仅数组中的每个tile元素可以关联附加属性,比如透明度和简单的变换方式,而且,整个tile map也可以设定不同
的属性,比如绘制的偏移量,tile的大小,和是否自动滚动等。
tile map主要在游戏中绘制游戏背景。
主要涉及函数:
1)ISPRITE_SetTileBuffer()
2)ISPRITE_DrawTiles()
3)ISPRITE_SetTransformTable()
函数原型:
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时,将强制释放
关联的图像源。
函数原型:
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);