這乃本節之精華所在,好比上帝的右手,阿拉丁的神燈無所不能、天下無敵!汗一個。。。好了,有了該法寶,那麼我們開始練練手吧,看看一個斜度60的地圖是如何構造的。
首先我將該公式用代碼來表示寫成兩個方法,方法名很明確,它們的作用是分別獲取某點在G坐標系和W坐標系中的坐標:
//將窗口坐標系中的坐標換算成游戲坐標系中的坐標(縮小操作)
private Point getGamePosition(double x, double y) {
return new Point(
(int)((y + (x / 1.732)) / GridSize),
(int)((y - (x / 1.732)) / GridSize)
);
}
//將游戲坐標系中的坐標換算成窗口坐標系中的坐標(放大操作)
private Point getWindowPosition(double x, double y) {
return new Point(
(x - y) * 0.886 * GridSize,
(x + y) * 0.5 * GridSize
);
}
這裡我進行了簡單的正弦與余弦的取值,即sin60=1.732,cos60=0.5,那麼(sin60)/2=1.732/2=0.886。一張地圖中是不可能存在兩個α值的,所以本例在定義好α=60度後,我直接取它的正弦與余弦值這將有效的提高運算效率。
接下來就是構建障礙物了,只有通過它我們才能非常直觀的看到這個斜度α地圖的構造:
//構建障礙物
for (int x = 10; x < 20; x++) {
for (int y = 1; y < 10; y++) {
Matrix[x, y] = 0;
rect = new Rectangle();
//構建菱形
TransformGroup transformGroup = new TransformGroup();
SkewTransform skewTransform = new SkewTransform(-10, -25);
RotateTransform rotateTransform = new RotateTransform(54);
transformGroup.Children.Add(skewTransform);
transformGroup.Children.Add(rotateTransform);
rect.RenderTransform = transformGroup;
rect.Fill = new SolidColorBrush(Colors.GreenYellow);
rect.Opacity = 0.3;
rect.Stroke = new SolidColorBrush(Colors.Gray);
rect.Width = GridSize;
rect.Height = GridSize+2;
CarrIEr.Children.Add(rect);
Point p = getWindowPosition(x, y);
Canvas.SetLeft(rect, p.X);
Canvas.SetTop(rect, p.Y);
}
}