以我的地图集名字是n2为例,比如我现在新增一个花的4帧动画
现在我需要为n2地图集添加花动画支持。首先,在tileset_anims.c文件中添加n2地图集的花动画帧数据定义和相关函数。
const u16 gTilesetAnims_n2_Flower_Frame0[] = INCBIN_U16("data/tilesets/primary/n2/anim/flower/0.4bpp");
const u16 gTilesetAnims_n2_Flower_Frame1[] = INCBIN_U16("data/tilesets/primary/n2/anim/flower/1.4bpp");
const u16 gTilesetAnims_n2_Flower_Frame2[] = INCBIN_U16("data/tilesets/primary/n2/anim/flower/2.4bpp");
const u16 gTilesetAnims_n2_Flower_Frame3[] = INCBIN_U16("data/tilesets/primary/n2/anim/flower/3.4bpp");const u16 *const gTilesetAnims_n2_Flower[] = {gTilesetAnims_n2_Flower_Frame0,
gTilesetAnims_n2_Flower_Frame1,
gTilesetAnims_n2_Flower_Frame2,
gTilesetAnims_n2_Flower_Frame3
};
接下来需要添加n2地图集的动画初始化函数、动画回调函数和花动画队列函数。
void InitTilesetAnim_n2(void)
{sPrimaryTilesetAnimCounter = 0;
sPrimaryTilesetAnimCounterMax = 256;
sPrimaryTilesetAnimCallback = TilesetAnim_n2;
}
static void TilesetAnim_n2(u16 timer)
{if (timer % 16 == 0)
QueueAnimTiles_n2_Flower(timer / 16);
}
现在需要添加QueueAnimTiles_n2_Flower函数,用于将n2地图集的花动画帧添加到DMA缓冲区。(223是Tile的编号)
static void QueueAnimTiles_n2_Flower(u16 timer)
{u16 i = timer % ARRAY_COUNT(gTilesetAnims_n2_Flower);
const u16 *frameData = gTilesetAnims_n2_Flower[i];
// 更新上半截 tiles (0x223, 0x224)
AppendTilesetAnimToBuffer(frameData, (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x223)), 2 * TILE_SIZE_4BPP);
// 更新下半截 tiles (0x22C, 0x22D)
AppendTilesetAnimToBuffer(frameData + (2 * TILE_SIZE_4BPP / 2), (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(0x22C)), 2 * TILE_SIZE_4BPP);
}
src\data\tilesets\headers.h找到n2地图集的定义,需要将其callback字段从NULL修改为InitTilesetAnim_n2,这样当n2地图集加载时,就会注册我们刚刚创建的动画回调函数。
const struct Tileset gTileset_N2 =
{.isCompressed = TRUE,
.isSecondary = FALSE,
.tiles = gTilesetTiles_N2,
.palettes = gTilesetPalettes_N2,
.metatiles = gMetatiles_N2,
.metatileAttributes = gMetatileAttributes_N2,
.callback = InitTilesetAnim_n2,
};
在tileset_anims.c文件的开头添加函数声明,确保所有函数在使用前都已声明。
static void QueueAnimTiles_n2_Flower(u16 timer);
static void TilesetAnim_n2(u16 timer);
void InitTilesetAnim_n2(void);确保InitTilesetAnim_n2函数在tilesets.h文件中被正确声明,以便在headers.h中使用。
// tileset animations
extern void InitTilesetAnim_n2(void);
发表评论