Silverlight C# 游戏开发:L4 模型组和简单的动画

2016-08-20 11:08:00来源:http://nowpaper.blog.51cto.com/3893223/712312作者:nowpaper人点击


前面我们已经完成了基本模型和自定义模型导入,你会发现每次都通过代码来添加一堆模型确实很麻烦,在Balder中可以使用Geometry做模型组,将各种各样的模型添加到其中,这次我们简单的一起来研究一下模型组,加上一个小小的动画,如果这篇你看明白了,那么就可以使用这个引擎开发出一个简单的游戏,期待你的成果。




最先我们还是从新建一个控件开始,请建立一个控件打开其中的.cs文件,增加代码变成下面的样子,


publicLesson04() { InitializeComponent(); //L1 Gamegame=newGame(){Width=600,Height=400}; game.Camera=newCamera(); game.Camera.Position=newCoordinate(100,120,150); game.Camera.Target=newCoordinate(0,0,0); game.Children.Add(newOmniLight(){Position=newCoordinate(0,0,0)}); //L3 Game_Axisaxis_x=newGame_Axis(newVertex(-300,0,0),newVertex(300,0,0),Colors.Red); Game_Axisaxis_y=newGame_Axis(newVertex(0,-300,0),newVertex(0,300,0),Colors.Blue); Game_Axisaxis_z=newGame_Axis(newVertex(0,0,-300),newVertex(0,0,300),Colors.Green); //L4 Balder.Objects.Geometries.Geometrygroup=newBalder.Objects.Geometries.Geometry(){Name="MeshGroup"}; group.InteractionEnabled=true; group.Children.Add(axis_x); group.Children.Add(axis_y); group.Children.Add(axis_z); //L2 MeshTeapot=newMesh(); Teapot.Position=newCoordinate(0,0,0); Teapot.AssetName=newUri("/Balder_Studio;component/Res/teapot.ase",UriKind.Relative); //L4 group.Children.Add(Teapot); group.Children.Add(newBox(){Dimension=newCoordinate(10,20,30),Position=newCoordinate(100,10,0),Name="MyBox"}); group.Children.Add(newBox(){Dimension=newCoordinate(10,30,10),Position=newCoordinate(10,10,-100)}); game.Children.Add(group); LayoutRoot.Children.Add(game); }
好了,运行一下看看,你会见到一个茶壶,一个简单的坐标(坐标轴这个类在Lesson03中请查看相关信息),外加两块砖头(Box)就如同文章开始的一样,关于模型添加到group当中的那段代码完全可以改造成下面的样子,为了简单理解,就不做太多的变化了。
publicclassMyGeometry:Balder.Objects.Geometries.Geometry { //youcode }
上面的内容主要是介绍如何编组,其实它和一个Children集合没什么区别,如果你理解Silverlight的容器机制,那么就很容易搞明白。

下面来写一个动画,我们需要一个计时器来模拟一个小型的循环,代码如下:



DispatcherTimer_dispatchertimer=newDispatcherTimer(); _dispatchertimer.Tick+=newEventHandler(_dispatchertimer_Tick); _dispatchertimer.Interval=TimeSpan.FromMilliseconds(30);

如果你发现一些小错误,可能是需要using System.Windows.Threading,最后写一段代码在Lesson04类当中:



//模型组 Balder.Objects.Geometries.Geometry_meshgroup=null; Balder.Objects.Geometries.Box_box=null; //旋转角度计数 floatangle=0; floatspeed=2; void_dispatchertimer_Tick(objectsender,EventArgse) { if(_meshgroup==null) _meshgroup=this.FindName("MeshGroup")asBalder.Objects.Geometries.Geometry; if(_box==null) _box=this.FindName("MyBox")asBalder.Objects.Geometries.Box; _meshgroup.World=Balder.Math.Matrix.CreateRotationY(angle++); _box.Position.Y+=speed; if(_box.Position.Y>=50||_box.Position.Y<=0) speed=-speed; }

这段代码中,angle的角度在不停的增加,创建Y轴的旋转后的世界坐标系矩阵赋值给模型组,达到整个模型组在旋转目的,而Box则遵循一个Y轴上下移动的逻辑,这是最简单的方式,相信理解起来并不困难:),关于FindName方法一般用的不是很频繁,主要是为了避免前面和后面的代码的阅读误解,使之有连贯性。


那么最后我们运行一下看看效果吧:



如果你仍未看懂,可以下载代码研究,3D方面的计算才刚刚开始,而下一步,我们说说摄像机和灯光:)


源代码下载地址:点击这里下载工程


工程中如果缺少Balder.dll请在这里快速下载:SL4_Balder.rar


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台