十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Flipper Zero Dolphin 动画资产格式完全指南:manifest.txt 与 meta.txt 详解

Flipper Zero Dolphin 动画资产格式完全指南:manifest.txt 与 meta.txt 详解 Flipper Zero Dolphin 动画资产格式完全指南manifest.txt 与 meta.txt 详解【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmwareDolphin 是 Flipper Zero 固件内置的桌面宠物其待机动画、系统通知动画与 SD 卡上的扩展动画全部由结构化文本资产驱动。本文以 assets/dolphin/ReadMe.md 为骨架结合固件端解析实现 animation_storage.c、构建期打包脚本 dolphin.py 与资产构建配置 assets/SConscript系统讲解动画资产的目录划分、manifest.txt与meta.txt两种 Flipper Format 文件的全部字段、帧索引与气泡bubble调度规则并给出仓库内真实动画配置的逐行解读。读完本文你将具备阅读、校验乃至自行制作 Dolphin 动画资产文件的完整能力。Dolphin 资产的三大分区assets/dolphin下的动画被划分为三个独立分区每个分区都拥有自己的manifest.txt与动画子目录分区目录用途交付形式blockingassets/dolphin/blocking用于阻塞式系统通知的关键动画例如新邮件、SD 卡状态、数据库异常等打包为assets_dolphin_blocking.[h,c]编译进固件internalassets/dolphin/internal用于待机idleDolphin 动画的内置动画打包为assets_dolphin_internal.[h,c]编译进固件externalassets/dolphin/external用于待机 Dolphin 动画的扩展动画打包为资源文件夹放置到 SD 卡三者最终去处不同blocking 与 internal 通过 assets/SConscript 中的DolphinSymBuilder编译为 C 符号dolphin_blocking/dolphin_internal链入固件external 则通过DolphinExtBuilder输出到ASSETS_WORK_DIR/dolphin最终随构建产物布置到 SD 卡的dolphin目录对应运行时路径EXT_PATH(dolphin)。从固件端看这种分层在 animation_storage.c 中得到印证animation_storage_fill_animation_list()先读取 SD 卡上的外部清单再把dolphin_internal[]硬编码数组追加进候选列表animation_storage_find_animation()则按「blocking 数组 → internal 数组 → SD 卡外部动画」的顺序按名称精确查找动画。动画目录的文件组成每个动画独占一个子目录目录名必须与manifest.txt中的Name一致其中包含三类文件manifest.txt—— 动画枚举清单Dolphin 随机选择动画的起点meta.txt—— 描述动画如何绘制尺寸、帧序、周期、气泡等frame_X.png—— 动画的第 X 帧位图源资产为 PNG。值得注意的细节源目录中的帧是frame_X.png而构建期脚本 dolphin.py 在save()阶段会把每一帧转换为frame_X.bm写入输出目录固件运行时也只会加载frame_%d.bm见 animation_storage.c。因此.png是面向创作的可读源格式.bm是面向运行的压缩格式。manifest.txt动画注册清单manifest.txt是 Flipper Format File有序键值对文件头固定为Filetype: Flipper Animation Manifest Version: 1其后每个动画注册块包含 6 个有序键键含义Name动画名称必须与动画目录名完全一致Min butthurt/Max butthurt该动画适用的 Dolphin butthurt受伤值范围Min level/Max level该动画适用的 Dolphin 等级范围Weight随机选择动画时该动画被选中的权重关于随机选择有两个关键规则一是当Min level/Max level为 0 时动画不参与随机待机动画选择只能按名称精确调用二是Weight决定随机挑选时的命中概率Weight为 0 同样不会被随机选中。文档中举出的典型排除案例是L1_NoSd_128x49这类仅在特定系统状态下才有意义的动画。仓库中三类分区清单的实际配置可以对照查看assets/dolphin/blocking/manifest.txt —— 5 个动画L0_NoDb、L0_SdBad、L0_SdOk、L0_Url、L0_NewMail全部为Min level: 0 / Max level: 0 / Weight: 0正好印证了「level 为 0 即排除随机选择、只能按名称精确触发」的机制assets/dolphin/internal/manifest.txt —— 3 个内置动画L1_Tv、L1_BadBattery、L1_NoSd例如L1_Tv_128x47的 butthurt 范围为 0–14、等级范围为 1–3、权重为 3assets/dolphin/external/manifest.txt —— 30 个扩展动画等级从 1 到 3 梯度分布权重多为 3L1_Showtime、L1_Doom为 4例如L1_Kaiju_128x64的 butthurt 范围为 0–10、等级 1–3、权重 3。固件端解析见 animation_storage.canimation_storage_load_single_manifest_info()以严格模式flipper_format_set_strict_mode(file, true)按Name → Min butthurt → Max butthurt → Min level → Max level → Weight的固定顺序读取任何键缺失都会导致加载失败批量枚举则使用animation_storage_fill_animation_list()L81-L135逐条读取外部清单并追加内部硬编码动画。构建期脚本 dolphin.py 中的DolphinManifest.load()还会对每项做合法性断言名称非空、butthurt 与 level 的下限不小于 0 且上限不小于下限、权重不小于 0。meta.txt动画绘制描述meta.txt同样是 Flipper Format File文件头固定为Filetype: Flipper Animation Version: 1动画主参数键含义与约束Width/Height动画尺寸像素分别≤ 128 / ≤ 64Passive frames被动待机状态的位图帧数Active frames主动活跃状态的位图帧数可以为 0表示无主动状态Frames order帧播放顺序前 N 个为被动帧、后 M 个为主动帧顺序中的每个数字都对应一张必须存在的frame_X.bm位图同一个数字可以重复引用同一张帧Active cycles主动帧的重复轮数决定完整主动周期。例如主动帧为 6、7 且Active cycles为 3则完整主动周期播放6 7 6 7 6 7被动 主动的完整播放过程称为总周期total periodFrame rate每秒播放的帧数Duration单次动画的总播放秒数Active cooldown被动模式结束后、进入下一次主动模式前需经过的秒数气泡Bubble参数Bubble slots声明气泡序列的数量。主动模式下会完整播放一个或多个气泡序列同一序列内的气泡必须共处同一个 slot序列内气泡的先后顺序由文件中的出现次序决定。当帧索引越过某气泡的EndFrame时切换到序列中的下一个气泡两个气泡之间也可以存在无气泡的空闲帧。键含义Slot用于把多个气泡归入同一序列的编号X/Y气泡左上角坐标Text气泡文本换行用\nAlignH气泡角点的水平对齐方式Left/Center/RightAlignV气泡角点的垂直对齐方式Top/Center/BottomStartFrame/EndFrame气泡在整个总周期内的显示帧索引范围帧索引理解一个完整的推导例子原文档给出了最关键的推导示例。假设配置为Passive frames: 6 Active frames: 2 Frames order: 0 1 2 3 4 5 6 7 Active cycles: 4则实际播放序列与帧索引展开为passive(6) active (2 * 4) Real frames order: 0 1 2 3 4 5 6 7 6 7 6 7 6 7 Frames indexes: 0 1 2 3 4 5 6 7 8 9 10 11 12 13要点有二总周期帧数 被动帧数 主动帧数 × 主动周期数此处为 6 2 × 4 14气泡的StartFrame/EndFrame引用的是上表中展开后的「Frames indexes」列而非Frames order中位图的原始编号。固件端 animation_storage.c 会校验Frames order的条目数必须恰好等于Passive frames Active frames随后逐项转存为uint8_t帧序。从仓库实例看 meta.txt 的真实面貌纯被动动画示例无主动状态、无气泡assets/dolphin/blocking/L0_NewMail_128x51/meta.txt 配置为Passive frames: 6、Active frames: 0、Active cycles: 0、Duration: 0、Active cooldown: 0、Bubble slots: 0帧序0 1 2 3 2 1形成来回循环适合作为系统通知动画。带气泡的待机动画示例assets/dolphin/external/L1_Kaiju_128x64/meta.txt 包含 16 张被动帧与 60 张主动帧、Frame rate: 2、Duration: 3600、Active cooldown: 7并定义了一个 slot 内 4 条按序出现的气泡Sup、What just、happened?、Idk各自拥有不同的坐标、对齐方式与帧区间。多 slot 示例assets/dolphin/internal/L1_Tv_128x47/meta.txt 声明Bubble slots: 2两条气泡分别挂在 slot 0 与 slot 1播放帧区间一致但文本不同展示了两条独立序列并行调度的典型写法。固件与构建脚本中的校验逻辑固件端加载animation_storage.canimation_storage_load_animation()L427-L507以严格模式按固定顺序解析 meta 主参数任何字段缺失即整体加载失败帧加载animation_storage_load_frames()L262-L346要求Frames order中最大帧号必须小于「被动 主动帧数」且小于 256uint8_t上限并校验每个frame_X.bm的文件大小不超过ROUND_UP_TO(width, 8) * height 1气泡加载animation_storage_load_bubbles()L348-L425要求Bubble slots ≤ 20、气泡文本不超过 100 字符且各气泡的Slot必须从 0 开始严格递增实际出现的 slot 数必须与Bubble slots声明一致AlignH/AlignV仅接受Left/Right/Center与Top/Bottom/Center五类枚举值L231-L247。构建期校验dolphin.py脚本在打包前执行一组与固件端互补的合法性断言任何一项不满足都会直接中断构建0 Width ≤ 128、0 Height ≤ 128、Passive frames 0有主动帧Active frames 0时强制要求Active cooldown 0且Active cycles 0无主动帧时两者必须为 0Frame rate 0、Duration ≥ 0Frames order条目数必须等于Passive frames Active frames每个气泡要求0 ≤ X 128、0 ≤ Y 128、文本非空、AlignH/AlignV取值合法、StartFrame与EndFrame都小于总周期帧数且EndFrame ≥ StartFrame。此外脚本会对未使用全部帧Frames order中的去重帧数小于最大帧号 1的情况输出警告帮助作者发现素材冗余。整个打包流程由 assets/SConscript 驱动DolphinSymBuilder将 internal / blocking 动画渲染为assets_dolphin_internal.[h,c]与assets_dolphin_blocking.[h,c]并汇入静态库DolphinExtBuilderL64-L77在基础固件构建时输出 SD 卡资源目录。小结Dolphin 动画资产是一个高度结构化的文本驱动系统manifest.txt负责注册与随机调度butthurt、level、weight 三重约束meta.txt负责描述绘制行为帧序、周期、速率与气泡调度frame_X.png构建后为.bm提供像素内容固件端 animation_storage.c 与构建端 dolphin.py 分别以严格模式完成运行时解析与构建期校验。理解这些字段与索引规则后你既可以解读任何一款内置动画的编排逻辑也可以对照 assets/dolphin/external 中现成的动画目录制作自己的扩展动画并放置到 SD 卡的dolphin目录下参与随机待机演出。【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表