ISprite接口学习笔记

    技术2022-05-19  20

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


    最新回复(0)