以我的地图集名字是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);
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
![[GBA教程]pokeemerald动态地图块实操记录-宝可梦营地](https://pokedream.cn/wp-content/uploads/2026/01/QQ20260123-171516.png)

![[GBA教程]pokeemerald新增NPC头像显示,并支持镜像翻转-宝可梦营地](https://pokedream.cn/wp-content/uploads/2026/01/QQ20260114-144714.png)
![[GBA]宝可梦 彼岸花绽放之夜 v1.0正式版-宝可梦营地](https://pokedream.cn/wp-content/uploads/2026/01/1.png)
![[GBA教程]pokeemerald三层地图块详解-宝可梦营地](https://pokedream.cn/wp-content/uploads/2026/01/QQ20260115-154539.png)
![[GBA教程]pokeemerald新增自定义多项选择框-宝可梦营地](https://pokedream.cn/wp-content/uploads/2026/01/1F90AAF66BB1765251BED3AB10ACDD15.png)

![[NDS中文]宝可梦白2加强v1.0.1测试版-宝可梦营地](https://pokedream.cn/wp-content/uploads/2025/12/pokew2.png)

![[NDS]心金魂银自用debug内置修改器-宝可梦营地](https://pokedream.cn/wp-content/uploads/2026/01/game_patched__13041.png)
![[GBA教程]pokeemerald实现动态地图色板功能-宝可梦营地](https://pokedream.cn/wp-content/uploads/2025/12/LittlerootTown.png)
![[记录]GBA反编译上踩过的一些坑-宝可梦营地](https://pokedream.cn/wp-content/uploads/2025/12/water.jpg)
暂无评论内容