程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(二十二)(1)

C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(二十二)(1)

編輯:關於C語言

C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(二十二)重構 – 讓代碼插上翅膀自由飛翔

上一節,我將游戲地圖模式進行了一次重大的變動,這在實際開發中意味著項目大規模重置,雖然表面上顯得游刃有余,僅僅一個AllMove()方法的改變即實現了完美轉型,這全得歸功於前20節所搭建起的相對高度可擴展平台。但是,隨著開發不斷深入,我慢慢的感到些許的不安,因為代碼上的日益松散與結構的漸漸稀疏如同Windows系統的磁盤碎片與日俱增,未來維護時的煩瑣與痛心疾首已歷歷在目。代碼向我發出了求救信號,用什麼來拯救你-我的代碼?是時候亮劍了 –- 我的第一次親密重構。

下面我將分幾點對上一節中的代碼進行重構:

一、統一化代碼格式,讓代碼可讀性發揮到極至:

我以上一節中創建地圖地表層的代碼為例:

private void InitMapSurface() {
 MapSurface.Width = 1750;
 MapSurface.Height = 1440;
 MapSurface.Source = BitmapFrame.Create((new Uri(@"Map\0\0.jpg", UriKind.Relative)));
 CarrIEr.Children.Add(MapSurface);
 Canvas.SetLeft(MapSurface, -320);
 Canvas.SetTop(MapSurface, -200);
 MapSurface.SetValue(Canvas.ZIndexProperty, -1);
}

大家先看InitMap()方法中的前3行代碼,它們均以MapSurface打頭進行賦值書寫;接著看倒數2、3行,卻又是以Canvas.Set…()模式來設置MapSurface的屬性;更可怕的是最後一行,明明可以寫成Canvas.SetZIndex(…)的形式,好歹也與它前面兩行湊合湊合,可是這個作者趕著寫項目,五花八門的寫法都出來了。盡管,這達到實現功能的要求;可是僅僅不上十行的代碼可讀性已達到了“神出鬼沒”的地步,你是否曾想過如此類似的代碼一旦多起來,除了你,還有誰能進行維護?上帝知道。

其實這段代碼改造起來是很簡單的,不外呼統一書寫格式,從而提高代碼的可讀性。下面且看我是如何操作的:

1、分析,Canvas.SetLeft、Canvas.SetTop與Canvas.ZindexProperty這3個東西設置的是地表層圖片左上角距離游戲窗口的X距離、Y距離以及它在游戲窗口中的深度(層次)。並且,它們的賦值范圍均為整數(正、負、0皆可)。

2、思考,WPF與Silverlight同屬於不同形式的應用,一個桌面,一個浏覽器;但是它們卻可以使用相同的xaml進行表現層設計,是MS刻意拉近兩者的距離?這無從考證,未來可以回答我們,但是從兩著的共性讓我不禁聯想起了網頁。

3、比較,網頁對象的Style(CSS樣式表)屬性中有3個屬性與上面的3個屬性名稱與作用驚人的相似:left、top、z-index,只是它們必須在position:absolute模式下使用,但這又切中了我們下懷,Canvas畫布的內部布局同樣是采用基於點的絕對定位,兩者看來仿若一物。

-
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved