summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop/CharacterArt.fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/LivingVillage.Desktop/CharacterArt.fs')
-rw-r--r--src/LivingVillage.Desktop/CharacterArt.fs31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/LivingVillage.Desktop/CharacterArt.fs b/src/LivingVillage.Desktop/CharacterArt.fs
index 9d02baf..bfe86ad 100644
--- a/src/LivingVillage.Desktop/CharacterArt.fs
+++ b/src/LivingVillage.Desktop/CharacterArt.fs
@@ -5,8 +5,9 @@ open Microsoft.Xna.Framework.Graphics
/// P45 角色动画帧:全部原创手绘点阵,用像素代码内嵌生成图集,不依赖任何外部素材。
/// 布局与既有 `characterSourceRectangle` 完全一致:cell 32x48,
-/// cellIndex = (variant*4 + direction)*6 + frame,共 5 变体 x 4 向 x 6 帧。
-/// direction 顺序 North/South/West/East(0..3),frame 顺序 走1/走2/走3/走4/待机1/待机2(0..5)。
+/// cellIndex = (variant*4 + direction)*8 + frame,共 5 变体 x 4 向 x 8 帧。
+/// direction 顺序 North/South/West/East(0..3),
+/// frame 顺序 走1..走6/待机1/待机2(0..7);P72 将行走由 4 帧提升为 6 帧(含左右过渡步)。
module CharacterArt =
let sourceWidth = 16
@@ -16,8 +17,8 @@ module CharacterArt =
let cellHeight = sourceHeight * pixelScale
let variantCount = 5
let directionCount = 4
- let frameCount = 6
- let walkFrameCount = 4
+ let frameCount = 8
+ let walkFrameCount = 6
let idleFrameCount = 2
let atlasWidth = cellWidth * variantCount * directionCount * frameCount
@@ -102,6 +103,13 @@ module CharacterArt =
"....BBBBBBBB...."
"....RRRRRRRR...." ]
+ let private mirrorRow (row: string) : string =
+ System.String(row.ToCharArray() |> Array.rev)
+
+ /// P72 过渡步:走 5/6 为走 2/3 的左右镜像,形成「左-右」对称的六帧循环。
+ let private torsoWalk4 : string list = torsoWalk1 |> List.map mirrorRow
+ let private torsoWalk5 : string list = torsoWalk2 |> List.map mirrorRow
+
let private torsoIdle1 : string list =
[ "...SRRRRRRRRS..."
"...SRRRRRRRRS..."
@@ -123,7 +131,8 @@ module CharacterArt =
"....RRRRRRRR...."
"....RRRRRRRR...." ]
- /// 腿(6 行,行 18..23):四帧行走跨步姿态各不相同,待机两帧双脚并拢。
+ /// 腿(6 行,行 18..23):六帧行走跨步姿态各不相同,待机两帧双脚并拢。
+ /// 走 5/6 为走 2/3 的左右镜像(P72 过渡步),使左右跨步对称。
let private legsWalk0 : string list =
[ "....RRRRRRRR...."
"...RRRRRRRRRR..."
@@ -154,7 +163,10 @@ module CharacterArt =
".....RRRRRR....."
".....RRR.RR....."
".....RRR.FF....."
- ".....FFF........" ]
+ ".......FFFF....." ]
+
+ let private legsWalk4 : string list = legsWalk1 |> List.map mirrorRow
+ let private legsWalk5 : string list = legsWalk2 |> List.map mirrorRow
let private legsIdle : string list =
[ "....RRRRRRRR...."
@@ -165,13 +177,10 @@ module CharacterArt =
".....FFF.FF....." ]
let private torsoByFrame : string list list =
- [ torsoWalk0; torsoWalk1; torsoWalk2; torsoWalk3; torsoIdle1; torsoIdle2 ]
+ [ torsoWalk0; torsoWalk1; torsoWalk2; torsoWalk3; torsoWalk4; torsoWalk5; torsoIdle1; torsoIdle2 ]
let private legsByFrame : string list list =
- [ legsWalk0; legsWalk1; legsWalk2; legsWalk3; legsIdle; legsIdle ]
-
- let private mirrorRow (row: string) : string =
- System.String(row.ToCharArray() |> Array.rev)
+ [ legsWalk0; legsWalk1; legsWalk2; legsWalk3; legsWalk4; legsWalk5; legsIdle; legsIdle ]
let private headByDirection : string list list =
[ headNorth; headSouth; headWest; headWest |> List.map mirrorRow ]