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

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

編輯:關於C語言

這乃本節之精華所在,好比上帝的右手,阿拉丁的神燈無所不能、天下無敵!汗一個。。。好了,有了該法寶,那麼我們開始練練手吧,看看一個斜度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);
 }
}

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