首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 開發智慧型手機軟體:推箱子遊戲(六)Common/Pub.cs 共用常數與工具方法

     編輯:關於C語言

前言

本系列第六篇,介紹 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 步驟編碼與隱性轉換設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved