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

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

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

public  Lesson04()
{
    InitializeComponent();
    
// L1
    Game game  =   new  Game() { Width  =   600 , Height  =   400  };
    game.Camera 
=   new  Camera();
    game.Camera.Position 
=   new  Coordinate( 100 120 150 );
    game.Camera.Target 
=   new  Coordinate( 0 0 0 );
    game.Children.Add(
new  OmniLight() { Position  =   new  Coordinate( 0 0 0 ) });
    
// L3
    Game_Axis axis_x  =   new  Game_Axis( new  Vertex( - 300 0 0 ),  new  Vertex( 300 0 0 ), Colors.Red);
    Game_Axis axis_y 
=   new  Game_Axis( new  Vertex( 0 - 300 0 ),  new  Vertex( 0 300 0 ), Colors.Blue);
    Game_Axis axis_z 
=   new  Game_Axis( new  Vertex( 0 0 - 300 ),  new  Vertex( 0 0 300 ), Colors.Green);
    
// L4
    Balder.Objects.Geometries.Geometry group  =   new  Balder.Objects.Geometries.Geometry() { Name = " MeshGroup "  };
    group.InteractionEnabled 
=   true
    group.Children.Add(axis_x);
    group.Children.Add(axis_y);
    group.Children.Add(axis_z);
    
// L2
    Mesh Teapot  =   new  Mesh();            
    Teapot.Position 
=   new  Coordinate( 0 0 0 );
                       
    Teapot.AssetName 
=   new  Uri( " /Balder_Studio;component/Res/teapot.ase " , UriKind.Relative);
    
// L4
    group.Children.Add(Teapot);
    group.Children.Add(
new  Box() { Dimension  =   new  Coordinate( 10 20 30 ), Position  =   new  Coordinate( 100 10 0 ), Name  =   " MyBox "  });
    group.Children.Add(
new  Box() { Dimension  =   new  Coordinate( 10 30 10 ), Position  =   new  Coordinate( 10 10 - 100 ) });
    game.Children.Add(group);

    LayoutRoot.Children.Add(game);            
}

 

好了,运行一下看看,你会见到一个茶壶,一个简单的坐标(坐标轴这个类在Lesson03中请查看相关信息),外加两块砖头(Box)就如同文章开始的一样,关于模型添加到group当中的那段代码完全可以改造成下面的样子,为了简单理解,就不做太多的变化了。

public   class  MyGeometry : Balder.Objects.Geometries.Geometry
{
   
// you code
}

上面的内容主要是介绍如何编组,其实它和一个Children集合没什么区别,如果你理解Silverlight的容器机制,那么就很容易搞明白。

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

 

DispatcherTimer _dispatchertimer  =   new  DispatcherTimer();
_dispatchertimer.Tick 
+=   new  EventHandler(_dispatchertimer_Tick);
_dispatchertimer.Interval 
=  TimeSpan.FromMilliseconds( 30 );

 

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

 

// 模型组
Balder.Objects.Geometries.Geometry _meshgroup  =   null ;
Balder.Objects.Geometries.Box _box 
=   null ;
// 旋转角度计数
float  angle  =   0 ;
float  speed  =   2 ;
void  _dispatchertimer_Tick( object  sender, EventArgs e)
{
    
if  (_meshgroup  ==   null )
        _meshgroup 
=   this .FindName( " MeshGroup " as  Balder.Objects.Geometries.Geometry;
    
if (_box == null )
        _box 
=   this .FindName( " MyBox " as  Balder.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方法一般用的不是很频繁,主要是为了避免前面和后面的代码的阅读误解,使之有连贯性。

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

获取 Microsoft Silverlight

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

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

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

推荐Silverlight游戏开发博客:深蓝色右手

posted on 2010-11-16 10:16 nowpaper 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/nowpaper/archive/2010/11/16/1878242.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值