Balder 3D開發系列之--與Sprite初次相遇

1、關於Balder的一些東西

 

Balder 是一款開源的3D圖形引擎,它支持Silverlight, Windows Phone 7, Xna and OpenGL。html

它的下載地址以下:vim

http://balder.codeplex.com/releases/view/53579 在進行此次與Sprite的接觸以前,你必須得先下載它(假設你沒下載過:) )app

爲何要使用它呢?由於目前silverlight4中還不支持3D,因此咱們暫且就先用它吧,再說它確實很優秀,不使用就浪費了,不使用就對不起做者。ide

再上一個Balder開發的3D地圖:http://maps.esri.com/sldemos/terrainmap/default.html動畫

固然,在不久的未來,silverlight 5將會有本身的3D的API,那時候silverlight開發人員就又多了一種選擇,多麼幸福啊,好了,廢話很少說了,等等...差點忘了,最後在這裏推薦一個寫Balder的優秀博客:nowpaperspa

 

2、關於Sprite類

 

它位於Balder.Objects.Flat 命名空間下。code

繼承層次結構:component

System.Object
   System.Windows.DependencyObject
      System.Windows.UIElement
         System.Windows.FrameworkElement
            System.Windows.Controls.Control
               System.Windows.Controls.ItemsControl
                  Balder.Node
                     Balder.HierarchicalNode
                        Balder.RenderableNode
                           Balder.Objects.Flat.Sprite
從這裏,咱們能夠看出,它最接近 與ItemControl。htm

再看看它的定義是如何的:blog

namespace  Balder.Objects.Flat
{
    
public   class  Sprite : RenderableNode, IAsset
    {
        
public   static  DependencyProperty < Sprite, Uri >  AssetNameProperty;

        
public  Sprite();
        
public  Sprite(IContentManager contentManager, ISpriteContext spriteContext);

        
public  Uri AssetName {  get set ; }
        
public  Image CurrentFrame {  get ; }

        
public  IAssetPart[] GetAssetParts();
        
public   override   void  Prepare(Viewport viewport);
        
public   override   void  Render(Viewport viewport, DetailLevel detailLevel);
        
public   void  SetAssetParts(IEnumerable < IAssetPart >  assetParts);
    }
}

Sprite最一般的用法是使用它來加載圖片並顯示出來,而後經過動畫,形變等對它進行操做。正如其意思,精靈,若是你看過深藍的文章,你很容易理解它,而通常在2D遊戲中,一個sprite主要由:圖像,一個vector,和其它先關信息組成,而在balder中的這個sprite與之相似 ,不一樣的是它是一個定義在3維座標系下的sprite,所以由(x,y,z)來肯定它在三維空間中的位置。至於它的其它屬性和方法,在之後具體用到了再說,今天主要來使用AssetName屬性來完成一個小實例。

 

3、一個小例子,來了解sprite的最基本建立方法

 

首先,將下載來的balder相關dll文件添加引用到程序集,如何操做和關於balder的基本結構請參考:http://www.cnblogs.com/nowpaper/archive/2010/11/05/1869705.html 這裏寫得很詳細,我就再也不多囉嗦了。

完成以上步驟後,就開始動手了。

打開MainPage.xaml文件,在開頭添加以下:

 

而後就開始構造咱們的一個sprite例子了:

  < Execution:Game  Width ="640"  Height ="480" >
            
< Execution:Game.Camera >
                
< View:Camera  x:Name ="Camera"   Position ="0,50,-120"  Target ="0,0,0" />
            
</ Execution:Game.Camera >

            
< Lighting:OmniLight  Position ="-100,100,0" />
            
< Geometries:Box  Dimension ="20,20,20"  InteractionEnabled ="True" />
            
< Flat:Sprite   Position ="-50,0,0"   AssetName ="/SpriteTest1;component/Assets/sprite.jpg" />
            
< Flat:Sprite   Position ="50,0,0"   AssetName ="/SpriteTest1;component/Assets/sprite.jpg" />
            
< Flat:Sprite   Position ="0,0,50"   AssetName ="/SpriteTest1;component/Assets/sprite.jpg" />
        
</ Execution:Game >

 

 

其中Game是一個場景類,咱們在這個場景中放入了下面幾個東西:Light(燈光)Camera(攝像機) 一個Box(立方體的箱子)  三個sprite(精靈)。其實也沒多少東西,由於每一個東西都是由很類似的屬性來組成的,例如,Position,這個是一個(x,y,z)的座標很好理解吧?其它不同的就box那邊有個InteractionEnabled="True",使用這個可使得box能用鼠標轉動。在sprite那邊不同的就是一個AssetName屬性,其實它就是一個Uri,可是它實現了一個類型轉換,從Uri到Image的轉換,這樣,你在這裏只要輸入圖片的uri就能獲得相應的圖片。因此,你還得事先導入一張圖片到項目中。

最後,咱們在實現一些動畫效果,這裏咱們經過對Camera的位置變化來實現動畫,能想像?你拿這攝像機拍外面的風景,只要攝像機動了,那你拍攝的某樣物品或者什麼也就動了,其實它們有沒有動呢?它們固然在動,由於地球在動(哈哈哈~)。

好了,看加入什麼東西吧

 

< Grid.Triggers >
 
< EventTrigger  RoutedEvent ="Grid.Loaded" >
 
< BeginStoryboard >
 
< Storyboard  AutoReverse ="true"  RepeatBehavior ="Forever" >
 
< DoubleAnimation  Storyboard.TargetName ="Camera"  Storyboard.TargetProperty ="(Camera.Position).(X)"  From ="-100"  To ="100"  Duration ="00:00:05" >
 
< DoubleAnimation.EasingFunction >
 
< ElasticEase />
 
</ DoubleAnimation.EasingFunction >
 
</ DoubleAnimation >
 
</ Storyboard >
 
</ BeginStoryboard >
</ EventTrigger >
 
</ Grid.Triggers >

 

 

 

最後看看效果如何:

Get Microsoft Silverlight

 

 

:)~~~~~~~

相關文章
相關標籤/搜索