使用 C# 開發智慧手機軟體:推箱子(六)

weixin_34262482發表於2007-08-20
     這是“使用 C# 開發智慧手機軟體:推箱子”系列文章的第六篇。在這篇文章中,介紹 Common/Pub.cs 源程式檔案。

  1 using System;
  2 using System.Drawing;
  3 using System.Text;
  4 using System.IO;
  5 using System.Reflection;
  6 
  7 namespace Skyiv.Ben.PushBox.Common
  8 {
  9   /// <summary>
 10   /// 公共的欄位和方法
 11   /// </summary>
 12   static class Pub
 13   {
 14     public const int OverY = 4// 允許在螢幕(Y)方向超過的畫素數
 15     public const int DefaultMaxLevelSize = 32// 預設的最大關尺寸(寬度和高度)
 16     public const int DefaultStepDelay = 100;   // 預設移動時間間隔(毫秒)
 17     public const int DefaultReplayDelay = 300// 預設回放時間間隔(毫秒)
 18     public const int MaxDelay = 1000;          // 允許的最大時間間隔(毫秒)
 19     public readonly static string ConfigFileName = Path.Combine(baseDirectory, "PushBox.cfg"); // 配置檔案全路徑名
 20     public readonly static Encoding Encode = Encoding.GetEncoding("GB2312"); // Windows Mobile 6.0 不支援 GB18030
 21     static string baseDirectory { get { return Path.GetDirectoryName(Pub.CodeBases); } } // 本程式所在的目錄
 22 
 23     static Assembly Assembly { get { return Assembly.GetExecutingAssembly(); } }
 24     static AssemblyName AssemblyName { get { return Pub.Assembly.GetName(); } }
 25     public static Version Version { get { return Pub.AssemblyName.Version; } } // 本程式的版本
 26     public static string TextDirectory { get { return Path.Combine(baseDirectory, "text"); } }
 27     public static string DataDirectory { get { return Path.Combine(baseDirectory, "data"); } }
 28     public static string StepsDirectory { get { return Path.Combine(baseDirectory, "steps"); } }
 29     public const string TextExtName = ".bxa"// 文字副檔名
 30     public const string DataExtName = ".bxb"// 資料副檔名
 31     public const string StepsExtName = ".bxs"// 通關步驟副檔名
 32 
 33     /// <summary>
 34     /// 本程式的全路徑名
 35     /// </summary>
 36     public static string CodeBases
 37     {
 38       get
 39       {
 40         string codeBase = Pub.AssemblyName.CodeBase;
 41         string uri = "file:///";
 42         if (codeBase.StartsWith(uri)) codeBase = codeBase.Substring(uri.Length);
 43         return codeBase;
 44       }
 45     }
 46 
 47     /// <summary>
 48     /// 給出指定尺寸的顯示字串,格式為: 寬x高
 49     /// </summary>
 50     /// <param name="size">指定的尺寸</param>
 51     /// <returns>指定尺寸的顯示字串</returns>
 52     public static string ToString(Size size)
 53     {
 54       return size.Width + "x" + size.Height;
 55     }
 56 
 57     /// <summary>
 58     /// 將走法步驟轉換為字串
 59     /// </summary>
 60     /// <param name="steps">走法步驟</param>
 61     /// <returns>轉換後的字串</returns>
 62     public static string ToString(Step[] steps)
 63     {
 64       StringBuilder sb = new StringBuilder();
 65       foreach (Step step in steps) sb.Append((char)step);
 66       char[] array = sb.ToString().ToCharArray();
 67       Array.Reverse(array);
 68       return new string(array);
 69     }
 70 
 71     /// <summary>
 72     /// 給出指定版本的資訊,格式為: x.x (build: yyyy-MM-dd)
 73     /// </summary>
 74     /// <param name="version">指定的版本</param>
 75     /// <returns>指定版本的資訊</returns>
 76     public static string GetVersionBuildString(Version version)
 77     {
 78       double days = version.Build + 2 * version.Revision / ((double)TimeSpan.TicksPerDay / TimeSpan.TicksPerSecond);
 79       return string.Format("{0} (Build: {1})", version.ToString(2), (new DateTime(200011)).AddDays(days).ToString("yyyy-MM-dd HH:mm:ss"));
 80     }
 81 
 82     /// <summary>
 83     /// 給出指定異常的資訊,包含其內含異常的資訊
 84     /// </summary>
 85     /// <param name="ex">指定的異常</param>
 86     /// <param name="isDebug">是否給出詳細資訊</param>
 87     /// <returns>指定異常的資訊</returns>
 88     public static string GetMessage(Exception ex, bool isDebug)
 89     {
 90       StringBuilder sb = new StringBuilder();
 91       for (Exception e = ex; e != null; e = e.InnerException)
 92       {
 93         sb.Append(isDebug ? e.ToString() : e.Message);
 94         sb.Append(Fcl.NewLine);
 95       }
 96       return sb.ToString();
 97     }
 98   }
 99 }
100 


    靜態類 Pub 定義了一些全域性的常量、只讀欄位、只讀屬性和一些靜態方法,介紹如下:

    baseDirectory 只讀屬性返回本程式(PushBox.exe)所在的絕對路徑。
    ConfigFileName 只讀欄位返回配置檔案(PushBox.cfg)的全路徑名。
    TextDirectory 只讀屬性返回文字檔案(*.bxa)所在目錄(text)的絕對路徑。
    DataDirectory 只讀屬性返回資料檔案(*.bxb)所在目錄(data)的絕對路徑。
    StepsDirectory 只讀屬性返回通關步驟檔案(*.bxs)所在目錄(steps)的絕對路徑。
 
    注意,Windows CE 作業系統不具有當前目錄功能,Directory.GetCurrentDirectory 方法在 .NET Compact Framework 中可用,但是當前並不支援,呼叫該方法會丟擲一個 NotSupportedException 異常。在 Windows CE 下程式設計,所有的檔名都是從智慧手機的根目錄算起的,所以在 Pub 靜態類給出了以上全路徑名。
    我提供下載的 zip 檔案中包括以下內容:
    PushBox.exe   推箱子程式
    PushBox.cfg   配置檔案
    data/*.bxb    資料檔案
    steps/*.bxs   通關步驟

    其實只有 PushBox.exe 就完全可以玩推箱子游戲了,只不過所有的關卡都要自己設計。執行時如下所示:

    然後,點選“選單 -> 資料 -> 配置”:


    再點選“選單 -> 資料 -> 轉換”:



    程式就會自動生成所需的配置檔案和資料檔案,畫面就正常了:



    然後就可以點選“選單 -> 資料 -> 設計”,隨心所欲地設計關卡了。

    GetVersionBuildString 方法給出指定版本的資訊,格式為: x.x (build: yyyy-MM-dd),例如本程式目前的版本是 2.1 (Build: 2007-08-19 15:09:44)。這是在 Properties/AssemblyInfo.cs 源程式檔案中指定了以下版本資訊:
    [assembly: AssemblyVersion("2.1.*")]
    即:指定主版本為 2,次版本為 1,並接受預設的內部版本號和修訂號。預設的內部版本號從2000年1月1日起每日增加,預設修訂號據 MSDN 文件上說是隨機的,但我發現至少目前來說,是從午夜起的秒數除以二。


上一篇:使用 C# 開發智慧手機軟體:推箱子(五)
下一篇:使用 C# 開發智慧手機軟體:推箱子(七)
返回目錄

相關文章