本系列第六篇,介紹 Common/Pub.cs,集中管理專案常數、路徑、編碼、版本資訊、異常訊息格式化等共用工具。
namespace Skyiv.Ben.PushBox.Common
{
static class Pub
{
// 遊戲參數常數
public const int OverY = 4;
public const int DefaultMaxLevelSize = 32;
public const int DefaultStepDelay = 100;
public const int DefaultReplayDelay = 300;
public const int MaxDelay = 1000;
// 路徑與檔案
public readonly static string ConfigFileName = Path.Combine(BaseDirectory, "PushBox.cfg");
public readonly static Encoding Encode = Encoding.GetEncoding("GB2312"); // CF 6.0 不支援 GB18030
static string BaseDirectory => Path.GetDirectoryName(CodeBases);
static Assembly Assembly => Assembly.GetExecutingAssembly();
static AssemblyName AssemblyName => Assembly.GetName();
public static Version Version => AssemblyName.Version;
public static string TextDirectory => Path.Combine(BaseDirectory, "text");
public static string DataDirectory => Path.Combine(BaseDirectory, "data");
public static string StepsDirectory => Path.Combine(BaseDirectory, "steps");
public const string TextExtName = ".bxa";
public const string DataExtName = ".bxb";
public const string StepsExtName = ".bxs";
// 組件完整路徑 (處理 file:// 協定)
public static string CodeBases
{
get
{
string codeBase = AssemblyName.CodeBase;
const string uri = "file:///";
if (codeBase.StartsWith(uri)) codeBase = codeBase.Substring(uri.Length);
return codeBase;
}
}
// 尺寸轉字串 "WxH"
public static string ToString(Size size) => $"{size.Width}x{size.Height}";
// 步驟陣列轉字串 (反轉順序)
public static string ToString(Step[] steps)
{
var sb = new StringBuilder();
foreach (var s in steps) sb.Append((char)s);
char[] arr = sb.ToString().ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
// 版本資訊含建置日期
public static string GetVersionBuildString(Version ver)
{
double days = ver.Build + 2.0 * ver.Revision / (TimeSpan.TicksPerDay / TimeSpan.TicksPerSecond);
var dt = new DateTime(2000, 1, 1).AddDays(days);
return $"{ver.ToString(2)} (Build: {dt:yyyy-MM-dd HH:mm:ss})";
}
// 異常訊息含內部異常
public static string GetMessage(Exception ex, bool isDebug)
{
var sb = new StringBuilder();
for (var e = ex; e != null; e = e.InnerException)
{
sb.Append(isDebug ? e.ToString() : e.Message);
sb.Append(Fcl.NewLine);
}
return sb.ToString();
}
}
}
| 功能 | 實作細節 |
|---|---|
| 編碼統一 | Encode = GB2312,全專案檔案讀寫、序列化一致,避免 CF 不支援 GB18030 問題。 |
| 路徑集中 | BaseDirectory 衍生出 Text/Data/Steps 目錄,部署遷移只需改一處。 |
| 版本建置日期 | 利用 Version.Build/Revision 編碼日期 (Microsoft 標準算法),無需外部資源。 |
| 異常訊息鏈 | GetMessage 遞迴遍歷 InnerException,支援除錯/使用者模式雙輸出。 |
| 步驟序列化 | Step 隱性轉換為 char,陣列反轉後成字串,極致緊湊。 |
OverY:螢幕 Y 方向允許超出像素 (彈性佈局)。DefaultMaxLevelSize:關卡編輯器預設最大寬高。DefaultStepDelay/ReplayDelay:動畫與回放預設延遲 (ms)。MaxDelay:使用者可調整延遲上限。Pub.cs 體現「集中配置、型別安全、跨平台相容」原則,是專案維護性的關鍵。下一篇將介紹 Step.cs 步驟編碼與隱性轉換設計。