Silverlight C# 遊戲開發:L4 模型組和簡單的動畫

前面我們已經完成了基本模型和自定義模型導入,你會發現每次都通過代碼來添加一堆模型確實很麻煩,在Balder中可以使用Geometry做模型組,將各種各樣的模型添加到其中,這次我們簡單的一起來研究一下模型組,加上一個小小的動畫,如果這篇你看明白了,那麼就可以使用這個引擎開發出一個簡單的遊戲,期待你的成果。

 

最先我們還是從新建一個控件開始,請建立一個控件打開其中的.cs文件,增加代碼變成下面的樣子,

  1. public Lesson04()  
  2. {  
  3. InitializeComponent();  
  4. //L1  
  5. Game game = new Game() { Width = 600Height = 400 };  
  6. game.Camera = new Camera();  
  7. game.Camera.Position = new Coordinate(100, 120, 150);  
  8. game.Camera.Target = new Coordinate(0, 0, 0);  
  9. game.Children.Add(new OmniLight() { Position = new Coordinate(0, 0, 0) });  
  10. //L3  
  11. Game_Axis axis_x = new Game_Axis(new Vertex(-300, 0, 0), new Vertex(300, 0, 0), Colors.Red);  
  12. Game_Axis axis_y = new Game_Axis(new Vertex(0, -300, 0), new Vertex(0, 300, 0), Colors.Blue);  
  13. Game_Axis axis_z = new Game_Axis(new Vertex(0, 0, -300), new Vertex(0, 0, 300), Colors.Green);  
  14. //L4  
  15. Balder.Objects.Geometries.Geometry group = new Balder.Objects.Geometries.Geometry() { Name="MeshGroup" };  
  16. group.InteractionEnabled = true;   
  17. group.Children.Add(axis_x);  
  18. group.Children.Add(axis_y);  
  19. group.Children.Add(axis_z);  
  20. //L2  
  21. Mesh Teapot = new Mesh();   
  22. Teapot.Position = new Coordinate(0, 0, 0);  
  23.  
  24. Teapot.AssetName = new Uri("/Balder_Studio;component/Res/teapot.ase", UriKind.Relative);  
  25. //L4  
  26. group.Children.Add(Teapot);  
  27. group.Children.Add(new Box() { Dimension = new Coordinate(10, 20, 30), Position = new Coordinate(100, 10, 0), Name = "MyBox" });  
  28. group.Children.Add(new Box() { Dimension = new Coordinate(10, 30, 10), Position = new Coordinate(10, 10, -100) });  
  29. game.Children.Add(group);  
  30.  
  31. LayoutRoot.Children.Add(game);   
  32. }  
  33.  
  34.    
  35.  
好了,運行一下看看,你會見到一個茶壺,一個簡單的座標(座標軸這個類在Lesson03中請查看相關信息),外加兩塊磚頭(Box)就如同文章開始的一樣,關於模型添加到group當中的那段代碼完全可以改造成下面的樣子,爲了簡單理解,就不做太多的變化了。
  1. public class MyGeometry : Balder.Objects.Geometries.Geometry  
  2. {  
  3. //you code  
  4. }  
上面的內容主要是介紹如何編組,其實它和一個Children集合沒什麼區別,如果你理解Silverlight的容器機制,那麼就很容易搞明白。

下面來寫一個動畫,我們需要一個計時器來模擬一個小型的循環,代碼如下:

 

  1.  
  2.  
  3. DispatcherTimer _dispatchertimer = new DispatcherTimer();  
  4. _dispatchertimer.Tick += new EventHandler(_dispatchertimer_Tick);  
  5. _dispatchertimer.Interval = TimeSpan.FromMilliseconds(30);  
  6.    
  7.  

如果你發現一些小錯誤,可能是需要using System.Windows.Threading,最後寫一段代碼在Lesson04類當中:

 

  1.  
  2.  
  3. //模型組  
  4. Balder.Objects.Geometries.Geometry _meshgroup = null;  
  5. Balder.Objects.Geometries.Box _box = null;  
  6. //旋轉角度計數  
  7. float angle = 0;  
  8. float speed = 2;  
  9. void _dispatchertimer_Tick(object sender, EventArgs e)  
  10. {  
  11. if (_meshgroup == null)  
  12. _meshgroup = this.FindName("MeshGroup") as Balder.Objects.Geometries.Geometry;  
  13. if(_box==null)  
  14. _box = this.FindName("MyBox") as Balder.Objects.Geometries.Box;  
  15. _meshgroup.World = Balder.Math.Matrix.CreateRotationY(angle++);  
  16. _box.Position.Y += speed;  
  17. if (_box.Position.Y >= 50 || _box.Position.Y <= 0)   
  18. speed = -speed;  
  19.  
  20. }  
  21.    
  22.  

這段代碼中,angle的角度在不停的增加,創建Y軸的旋轉後的世界座標系矩陣賦值給模型組,達到整個模型組在旋轉目的,而Box則遵循一個Y軸上下移動的邏輯,這是最簡單的方式,相信理解起來並不困難:),關於FindName方法一般用的不是很頻繁,主要是爲了避免前面和後面的代碼的閱讀誤解,使之有連貫性。

那麼最後我們運行一下看看效果吧:

 

如果你仍未看懂,可以下載代碼研究,3D方面的計算纔剛剛開始,而下一步,我們說說攝像機和燈光:)

源代碼下載地址:點擊這裏下載工程

工程中如果缺少Balder.dll請在這裏快速下載:SL4_Balder.rar

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章