From 328760853c15c44d1de915d6c88e0dfd7ddc5af6 Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Tue, 29 Sep 2026 10:38:53 +0800 Subject: p72: 角色行走四向动画帧提升(6 走 + 2 待机) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CharacterArt 运行时点阵图集从 4 走 + 2 待机扩为 6 走(新增左右低过渡步 4/5,由 1/2 镜像)+ 2 待机,格数 *8、图集 5120x48;VillageArt 帧循环 %6、characterSourceRectangle *8、characterAtlasWidth 5120。同步 P45/Prototype 帧断言、新增 P72 帧表完整性回归、脚本与素材重新生成、维护说明动画语义。白天正午村庄行走实跑证据落 docs/evidence/p72-*。Desktop 343/343、Kernel 120/120、digest 与 p70 一致。 --- docs/evidence/p72-analysis.txt | 30 +++++++++++++++++++++ docs/evidence/p72-walk-framefive.png | Bin 0 -> 116456 bytes docs/evidence/p72-walk-framefour.png | Bin 0 -> 117510 bytes docs/evidence/p72-walk-frameone.png | Bin 0 -> 116297 bytes docs/evidence/p72-walk-framesix.png | Bin 0 -> 74665 bytes docs/evidence/p72-walk-framethree.png | Bin 0 -> 114427 bytes ...273\264\346\212\244\350\257\264\346\230\216.md" | 14 +++++----- 7 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 docs/evidence/p72-analysis.txt create mode 100644 docs/evidence/p72-walk-framefive.png create mode 100644 docs/evidence/p72-walk-framefour.png create mode 100644 docs/evidence/p72-walk-frameone.png create mode 100644 docs/evidence/p72-walk-framesix.png create mode 100644 docs/evidence/p72-walk-framethree.png (limited to 'docs') diff --git a/docs/evidence/p72-analysis.txt b/docs/evidence/p72-analysis.txt new file mode 100644 index 0000000..67b1894 --- /dev/null +++ b/docs/evidence/p72-analysis.txt @@ -0,0 +1,30 @@ +P72(角色行走四向 8 帧:6 走 + 2 待机)证据分析 — 真实 Desktop xvfb 1280x720 正午 +钩子:LV_AUTOPLAY_SAMPLE=1 LV_AUTOPLAY_RECORD=1 LV_P72_LOG=1 LV_AUTOPLAY_START_HOUR=12 LV_LEGACY_MAP=1 +路径:world.Tick → rhythmFor → animationFrame((tick/4)%6) → characterSourceRectangle(*8 格) → drawCharacter + +recorded frames: 41 +distinct walk frames observed: ['FrameFive', 'FrameFour', 'FrameOne', 'FrameSix', 'FrameThree', 'FrameTwo'] +walk frame exemplars: FrameFive=p72-walk-0492.png(npc0), FrameFour=p72-walk-0264.png(npc0), FrameOne=p72-walk-0276.png(npc0), FrameSix=p72-walk-0132.png(npc0), FrameThree=p72-walk-0120.png(npc0), FrameTwo=p72-walk-0132.png(npc1) +npcs with observed displacement: 30 +npc0 distinct frames: ['FrameFive', 'FrameFour', 'FrameOne', 'FrameSix', 'FrameThree'] + +p72-walk-0276.png: size=1280x720 mean=87.2 std=34.8 dark_block=0 white_block=20 +p72-walk-0132.png: size=1280x720 mean=118.5 std=54.2 dark_block=0 white_block=52 +p72-walk-0120.png: size=1280x720 mean=87.1 std=34.5 dark_block=0 white_block=32 +p72-walk-0264.png: size=1280x720 mean=87.1 std=34.9 dark_block=0 white_block=32 +p72-walk-0492.png: size=1280x720 mean=87.3 std=34.9 dark_block=0 white_block=26 + +diff p72-walk-0276.png vs p72-walk-0132.png: differing_pixels=905924 +diff p72-walk-0276.png vs p72-walk-0120.png: differing_pixels=313725 +diff p72-walk-0276.png vs p72-walk-0264.png: differing_pixels=242017 +diff p72-walk-0276.png vs p72-walk-0492.png: differing_pixels=294080 +diff p72-walk-0132.png vs p72-walk-0120.png: differing_pixels=906006 +diff p72-walk-0132.png vs p72-walk-0264.png: differing_pixels=905936 +diff p72-walk-0132.png vs p72-walk-0492.png: differing_pixels=905931 +diff p72-walk-0120.png vs p72-walk-0264.png: differing_pixels=306092 +diff p72-walk-0120.png vs p72-walk-0492.png: differing_pixels=241732 +diff p72-walk-0264.png vs p72-walk-0492.png: differing_pixels=276242 + +verdict=PASS + all 6 walk frames exercised; npc0 moved through >=4 frames; + exemplar frames render 1280x720, no white/black blocks, and differ pairwise. diff --git a/docs/evidence/p72-walk-framefive.png b/docs/evidence/p72-walk-framefive.png new file mode 100644 index 0000000..5dc15be Binary files /dev/null and b/docs/evidence/p72-walk-framefive.png differ diff --git a/docs/evidence/p72-walk-framefour.png b/docs/evidence/p72-walk-framefour.png new file mode 100644 index 0000000..b321bb6 Binary files /dev/null and b/docs/evidence/p72-walk-framefour.png differ diff --git a/docs/evidence/p72-walk-frameone.png b/docs/evidence/p72-walk-frameone.png new file mode 100644 index 0000000..c3c1524 Binary files /dev/null and b/docs/evidence/p72-walk-frameone.png differ diff --git a/docs/evidence/p72-walk-framesix.png b/docs/evidence/p72-walk-framesix.png new file mode 100644 index 0000000..af5fa25 Binary files /dev/null and b/docs/evidence/p72-walk-framesix.png differ diff --git a/docs/evidence/p72-walk-framethree.png b/docs/evidence/p72-walk-framethree.png new file mode 100644 index 0000000..5c32d07 Binary files /dev/null and b/docs/evidence/p72-walk-framethree.png differ diff --git "a/docs/\347\273\264\346\212\244\350\257\264\346\230\216.md" "b/docs/\347\273\264\346\212\244\350\257\264\346\230\216.md" index ae0ae47..5fa87a4 100644 --- "a/docs/\347\273\264\346\212\244\350\257\264\346\230\216.md" +++ "b/docs/\347\273\264\346\212\244\350\257\264\346\230\216.md" @@ -50,16 +50,18 @@ final_digest 固定 953775FAEB2FDDE97289491AA260BD8D390C571E48A7A13AD2CB6FB7124F 村核矩形(24..38 × 16..34)由生成器不变式保证可通行; 默认可玩世界为 `MapGen.generateWithSize 256 192 42UL`(详见 §大世界(P21))。 -## 动画语义(P13,全部为 `tick → 帧` 纯函数) +## 动画语义(P13,全部为 `tick → 帧` 纯函数;P45/P72 扩充角色帧) -- 角色图集 `Assets/jiangnan-characters.png`:3840×48,每个 (变体,方向) 占 **6** 格 - (4 走路 + 2 待机呼吸),格宽 32 高 48。 - - `cellIndex = (variantIndex * 4 + directionIndex) * 6 + frameIndex`; +- 角色图集由 `CharacterArt.buildAtlas` **运行时生成**(内嵌原创点阵,非外部素材,P45 起取代 + 旧的 `Assets/jiangnan-characters.png`;旧 PNG 仅作历史资产保留,运行期不再采样): + 5120×48,每个 (变体,方向) 占 **8** 格(**6 走路 + 2 待机呼吸**),格宽 32 高 48。 + - `cellIndex = (variantIndex * 4 + directionIndex) * 8 + frameIndex`; 方向序 North/South/West/East = 0/1/2/3,变体序 Indigo/Ochre/Jade/Grey/StrawHat = 0..4。 - - frameIndex:Walk 0..3 = 0..3,IdleOne/IdleTwo = 4/5。 - - `animationFrame = (tick / 4) % 4`(16 tick 一循环);`idleFrame = (tick / 24) % 2`(48 tick 一循环)。 + - frameIndex:Walk 0..5 = 0..5(1/2 与 3 为左右迈步,4/5 为由 1/2 镜像出的过渡步),IdleOne/IdleTwo = 6/7。 + - `animationFrame = (tick / 4) % 6`(24 tick 一循环);`idleFrame = (tick / 24) % 2`(48 tick 一循环)。 - `characterFrame isMoving tick`:移动取走路帧,静止取呼吸帧。Avatar 用 `Game.fs` 的 `avatarMoving`(比较前后位置);NPC 用 `npcSpriteSpecAtTarget`(目标向量 ≥0.5px 视为移动)。 + 单人节奏仍由 `rhythmFor` 的 `WalkWindow/IdleWindow/PhaseOffset` 决定(农夫 4/24、货郎 3/20、书生 6/36)。 - 世界图集 `Assets/jiangnan-world.png`:800×32,25 格。水面 3 帧在 slot 1/13/21, 炊烟 3 帧在 slot 22/23/24。 - `waterFrameTickAt tick x y = (tick / 32 + x + 2y) % 3` → Water / WaterSpriteB / WaterSpriteC。 -- cgit v1.2.3