summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-21 13:15:39 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-21 13:15:39 +0800
commit0b9753543bd726818c61d76384d56a30b862e1ac (patch)
tree06b21006dc540b5d9995caf394bb4c8084b9294e /scripts
parent76a6850bb88546fc21f5f78a53fbda04e77c8b52 (diff)
downloadliving-village-0b9753543bd726818c61d76384d56a30b862e1ac.tar.gz
feat(desktop): 村民与主角四帧行走动画
人物图集 5 变体 x 4 向 x 4 帧(2560x48,全部经 make-jiangnan-art.py 原创,四种腿步:站立/左跨/站立微跳/右跨镜像);animationFrame 按 tick/4 mod 4 确定性取帧(16 tick 一循环,禁实时时钟);快照式回归断言四帧循环与逐帧图集列映射,主角同规则。
Diffstat (limited to 'scripts')
-rw-r--r--scripts/make-jiangnan-art.py16
1 files changed, 11 insertions, 5 deletions
diff --git a/scripts/make-jiangnan-art.py b/scripts/make-jiangnan-art.py
index cdae4e9..c484d91 100644
--- a/scripts/make-jiangnan-art.py
+++ b/scripts/make-jiangnan-art.py
@@ -3,7 +3,7 @@
Generates three RGBA PNGs into src/LivingVillage.Desktop/Assets:
jiangnan-world.png 672x32 (21 ground/prop tiles, 32px each)
- jiangnan-characters.png 1280x48 (5 variants x 4 directions x 2 frames, 32x48 cells)
+ jiangnan-characters.png 2560x48 (5 variants x 4 directions x 4 frames, 32x48 cells)
jiangnan-interior.png 392x96 (variable-size bottom-aligned interior cells)
Cell geometry is mirrored in VillageArt.fs; keep both in sync.
@@ -445,6 +445,7 @@ DIRECTIONS = ["north", "south", "west", "east"]
def draw_character_cell(c, ox, variant, direction, frame):
+ # frame: 0 neutral stand, 1 left stride, 2 neutral stand (higher torso bob), 3 right stride
robe = variant["robe"]
light = variant["light"]
dark = variant["dark"]
@@ -456,15 +457,20 @@ def draw_character_cell(c, ox, variant, direction, frame):
c.rect(ox + 8, 44, 16, 1, (23, 31, 34, 110))
c.rect(ox + 10, 45, 12, 1, (23, 31, 34, 90))
- if frame == 0:
+ if frame in (0, 2):
c.rect(ox + 10, 36, 4, 7, dark)
c.rect(ox + 9, 42, 6, 3, SHOE)
c.rect(ox + 18, 36, 4, 5, dark)
c.rect(ox + 18, 39, 6, 3, SHOE)
+ elif frame == 1:
+ c.rect(ox + 9, 36, 5, 7, dark)
+ c.rect(ox + 9, 42, 6, 3, SHOE)
+ c.rect(ox + 18, 36, 3, 5, dark)
+ c.rect(ox + 18, 39, 6, 3, SHOE)
else:
c.rect(ox + 18, 36, 4, 7, dark)
c.rect(ox + 18, 42, 6, 3, SHOE)
- c.rect(ox + 10, 36, 4, 5, dark)
+ c.rect(ox + 12, 36, 3, 5, dark)
c.rect(ox + 10, 39, 6, 3, SHOE)
c.rect(ox + 7, 22, 18, 14, robe)
@@ -531,7 +537,7 @@ def draw_character_cell(c, ox, variant, direction, frame):
def build_character_atlas():
- c = Canvas(1280, 48)
+ c = Canvas(2560, 48)
cell = 0
for variant in VARIANTS:
for direction in DIRECTIONS:
@@ -674,7 +680,7 @@ def main():
ASSET_DIR.mkdir(parents=True, exist_ok=True)
targets = [
("jiangnan-world.png", build_world_atlas(), 672, 32),
- ("jiangnan-characters.png", build_character_atlas(), 1280, 48),
+ ("jiangnan-characters.png", build_character_atlas(), 2560, 48),
("jiangnan-interior.png", build_interior_atlas(), 392, 96),
]
for name, canvas, w, h in targets: