[GBA教程]pokeemerald动态地图块实操记录

[GBA教程]pokeemerald动态地图块实操记录

以我的地图集名字是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
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容