前幾章已建立基礎精靈控件,但角色僅支援單一方向與單一動作。實戰遊戲中,角色需要八個方向(北、東北、東、東南、南、西南、西、西北,對應時鐘 0~7 點)與五大基礎動作(待機、跑步、攻擊、施法、特殊動作)。本章著重於美術素材標準化與圖集自動合成,為後續精靈控件的多方向多動作播放鋪路。
| 方向代號 | 朝向 | 角度參考 |
|---|---|---|
| 0 | 北 | 12 點鐘方向 |
| 1 | 東北 | 1~2 點鐘 |
| 2 | 東 | 3 點鐘 |
| 3 | 東南 | 4~5 點鐘 |
| 4 | 南 | 6 點鐘 |
| 5 | 西南 | 7~8 點鐘 |
| 6 | 西 | 9 點鐘 |
| 7 | 西北 | 10~11 點鐘 |
五大動作幀數配置(以《破天一劍》素材為例):
總計:(5+8+7+6+8) × 8 = 34 × 8 = 272 張單獨幀圖片。
3D 渲染輸出或提取的素材,單幀尺寸往往不一。必須透過 Photoshop「動作」批次處理,將所有幀統一為固定畫布大小(本例 150×150 像素),並確保角色在畫布中水平垂直置中,腳部位置一致。這是後續播放不抖動、碰撞判定準確的基礎。
將同一動作的連續幀疊加預覽,檢查角色輪廓是否重合。若有位移,需在 Photoshop 中逐幀微調,直到播放流暢無「殘影」或「跳動」。此步驟極度依賴美工細節,直接決定遊戲視覺品質。
將 272 張分散小圖合併為單一大圖(圖集 Atlas),運行時僅需載入一張圖片,再以 CroppedBitmap 截取所需幀,大幅減少 I/O 與記憶體碎片。
5100 × 1200 像素i (0~7) → 方向 0~7j (0~33) → 依序為 待機 0~4、跑步 5~12、攻擊 13~19、施法 20~25、特殊 26~33
public static class Super
{
/// <summary>
/// 將 N 幀圖片合成一張 8 方向角色各動作分布圖
/// </summary>
/// <param name="SourcePath">源文件目錄(含尾斜線)</param>
/// <param name="SavaToPath">輸出圖集路徑</param>
/// <param name="imgNum">總幀數(必須為 8 的倍數)</param>
/// <param name="imgWidth">單幀寬度</param>
/// <param name="imgHeight">單幀高度</param>
public static void ComposeImage(string SourcePath, string SavaToPath, int imgNum, int imgWidth, int imgHeight)
{
using (FileStream fs = new FileStream(SavaToPath, FileMode.Create))
{
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
int count = 1;
int framesPerDir = imgNum / 8; // 34
for (int dir = 0; dir < 8; dir++)
{
for (int frame = 0; frame < framesPerDir; frame++)
{
// 假設檔名格式:1-1.png, 2-1.png ... 若為 1.png, 2.png 請將 "-1.png" 改為 ".png"
string fileName = SourcePath + count + "-1.png";
BitmapImage src = new BitmapImage(new Uri(fileName, UriKind.Absolute));
dc.DrawImage(src, new Rect(frame * imgWidth, dir * imgHeight, imgWidth, imgHeight));
count++;
}
}
}
RenderTargetBitmap rtb = new RenderTargetBitmap(
framesPerDir * imgWidth, 8 * imgHeight, 96, 96, PixelFormats.Pbgra32);
rtb.Render(dv);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
encoder.Save(fs);
}
}
}
// 素材目錄 E:\Body\ 下有 1-1.png ~ 272-1.png
Super.ComposeImage(@"E:\Body\", "Body0.png", 272, 150, 150);
合成完成後,以圖片檢視器開啟 Body0.png,應可見:
此規律化排列讓後續「根據方向與動作類型計算幀座標」變成簡單的數學運算:
X = frameIndex * frameWidth、Y = directionIndex * frameHeight。
| 平台 | 建議單動作最大幀數 | 備註 |
|---|---|---|
| Silverlight (Web) | ≤ 5 幀 | 下載頻寬與解碼效能考量 |
| WPF (Client) | 10~16 幀甚至更高 | 本地解碼,記憶體較寬裕 |