面對 9 大區域的移動邏輯維護噩夢,我們引入介面 QXObject 統一規範所有遊戲物件 (精靈、地圖、遮罩、怪物、NPC) 的座標與尺寸屬性,配合 for 迴圈替代 foreach 避免集合修改異常,最終僅替換 AllMove() 方法即完成從「牽引式」到「主位式」地圖模式的完美轉型。
使用者控件已繼承 UserControl,無法再繼承基類。解決之道:介面多重實作。
interface QXObject
{
int CenterX { get; set; }
int CenterY { get; set; }
double X { get; set; }
double Y { get; set; }
// ... 其他共通屬性
}
public partial class QXSpirit : UserControl, QXObject { ... }
public partial class QXMap : UserControl, QXObject { ... }
for (int i = 0; i < Carrier.Children.Count; i++)
{
if (Carrier.Children[i] is QXObject obj)
{
Canvas.SetLeft(obj, obj.X - obj.CenterX);
Canvas.SetTop(obj, obj.Y - obj.CenterY);
Canvas.SetZIndex(obj, Convert.ToInt32(obj.Y));
}
}
替換第 20 節的 AllMove() 後,其餘代碼零修改,地圖、遮罩、障礙物同步無縫切換至主位式模式:主角永居螢幕中心,地圖反向移動產生視覺前進感。
下一節將進行首次大規模重構,從設計昇華到藝術,敬請期待。