原理就這麼簡單,至於其中的數字是如何得到的,我們只需要預先定義好兩個參數WindowCenterX,WindowCenterY。它們其實就是游戲窗體尺寸的5折(如果有標題欄則需要減去標題欄的高度約20像素),以800*600的窗口模式游戲窗體為例,那麼它的WindowCenterX=800/2 =400,WindowCenterY=(600-20)/2=390,那麼1024*768呢?以此類推。理請了思路,接下來就讓我們來實現主位式地圖移動模式下的AllMove()方法,這裡我以主角位於左上這個區域為例:
private void AllMove() {
if (Spirit.X <= WindowCenterX && Spirit.Y <= WindowCenterY) {
//地圖左上
//所有精靈以主角為參照相對移動
for (int i = 0; i < CarrIEr.Children.Count; i++) {
if (CarrIEr.Children[i] is QXSpirit) {
//假如子控件為精靈類型,則獲取之
QXSpirit spirit = CarrIEr.Children[i] as QXSpirit;
//設置精靈在游戲窗口中的顯示位置
Canvas.SetLeft(spirit, spirit.X - spirit.CenterX);
Canvas.SetTop(spirit, spirit.Y - spirit.CenterY);
//畫家方法,使所有精靈之間的遮擋關系由近及遠
Canvas.SetZIndex(spirit, Convert.ToInt32(spirit.Y);
} else if (CarrIEr.Children[i] is Image) {
//假如是地圖/遮罩
Image Map = CarrIEr.Children[i] as Image;
Canvas.SetLeft(Map, 0);
Canvas.SetTop(Map, 0);
}
}
}
……
}
我們首先判斷主角是否在左上的區域(Spirit.X <= WindowCenterX && Spirit.Y <= WindowCenterY),如果是,那麼我們循環遍歷畫布中的所有子控件,假如某個控件是精靈類型(QXSpirit),那麼我們捕獲它。由於此時主角處於的是地圖左上區域,按我們前面的分析,它在此區域內的顯示位置就是它的坐標減去中心點值(CenterX,CenterY),因為精靈坐標是定位到腳底的,而窗口顯示它的位置時是定位到精靈圖片左上角點的。那麼其他方向以次類推(源碼中有這裡就不再列羅列)。