zoukankan      html  css  js  c++  java
  • 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(100120150);
        game.Camera.Target 
    = new Coordinate(000);
        game.Children.Add(
    new OmniLight() { Position = new Coordinate(000) });
        
    //L3
        Game_Axis axis_x = new Game_Axis(new Vertex(-30000), new Vertex(30000), Colors.Red);
        Game_Axis axis_y 
    = new Game_Axis(new Vertex(0-3000), new Vertex(03000), Colors.Blue);
        Game_Axis axis_z 
    = new Game_Axis(new Vertex(00-300), new Vertex(00300), 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(000);
                           
        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(102030), Position = new Coordinate(100100), Name = "MyBox" });
        group.Children.Add(
    new Box() { Dimension = new Coordinate(103010), Position = new Coordinate(1010-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游戏开发博客:深蓝色右手

  • 相关阅读:
    数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)
    Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)
    Java实现第十一届蓝桥杯C/C++ 大学 B 组大赛软件类 省赛真题(希望能和各位大佬能一起讨论算法题:讨论群:99979568)
    Java实现第十一届蓝桥杯 省赛真题(希望能和各位大佬能一起讨论算法题:讨论群:99979568)
    Java引用类型之软引用(2)
    Java引用类型之软引用(1)
    Java引用类型
    对象的创建
    类的初始化
    初始化itable
  • 原文地址:https://www.cnblogs.com/nowpaper/p/1878242.html
Copyright © 2011-2022 走看看