2009-06-30 82 views
6

當試圖在Silverlight中設置基於時間/框架的對象的動畫時(與使用DoubleAnimation或Storyboard等不適用於快速節奏遊戲的對比)相比,例如,將飛船沿特定方向移動框架,運動是跳動,並不真正平穩。屏幕甚至似乎撕裂。Silverlight動畫不光滑

CompositionTarget和DistpatcherTimer似乎沒有區別。 我用下面的辦法(在僞代碼):

Register Handler to Tick-Event of a DispatcherTimer 
In each Tick: 
Compute the elapsed time from the last frame in milliseconds 
Object.X += movementSpeed * ellapsedMilliseconds 

這將導致在一個平穩的運動,對不對?但事實並非如此。 這裏是一個例子(控件:WASD和鼠標):Silverlight Game。 儘管我所描述的效果在這個示例中並不太流行,但我可以向你保證,即使在畫布上移動單個矩形也會產生跳動動畫。

有人有一個想法如何最小化這一點。有沒有其他的方法可以解決這個問題使用Storyboards/DoubleAnimations框架基於動畫exept?

編輯:這裏一個快速和骯髒的方法,動畫的矩形與最小碼(控制:A和d)Animation Sample

的Xaml:

<Grid x:Name="LayoutRoot" Background="Black"> 
    <Canvas Width="1000" Height="400" Background="Blue"> 
     <Rectangle x:Name="rect" Width="48" Height="48" 
        Fill="White" 
        Canvas.Top="200" 
        Canvas.Left="0"/> 
    </Canvas> 
</Grid> 

C#:

private bool isLeft = false; 
    private bool isRight = false; 
    private DispatcherTimer timer = new DispatcherTimer(); 
    private double lastUpdate; 

    public Page() 
    { 
     InitializeComponent(); 

     timer.Interval = TimeSpan.FromMilliseconds(1); 
     timer.Tick += OnTick; 

     lastUpdate = Environment.TickCount; 
     timer.Start(); 
    } 

    private void OnTick(object sender, EventArgs e) 
    { 
     double diff = Environment.TickCount - lastUpdate; 

     double x = Canvas.GetLeft(rect); 

     if (isRight) 
      x += 1 * diff; 
     else if (isLeft) 
      x -= 1 * diff; 

     Canvas.SetLeft(rect, x); 

     lastUpdate = Environment.TickCount; 
    } 

    private void UserControl_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.D) 
      isRight = true; 

     if (e.Key == Key.A) 
      isLeft = true; 
    } 

    private void UserControl_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.D) 
      isRight = false; 

     if (e.Key == Key.A) 
      isLeft = false; 
    } 

由於! Andrej

+1

+1我試圖在Silverlight 3中創建遊戲來休息,因爲口吃,撕裂和閃爍......想知道他們是否在4中解決了這個問題,或者它是否仍然像Powerpoint一樣無用,以實現流暢的動畫?我的超過20歲的Amiga與AMOS在這個部門是一個更好的表演者和更容易的開發平臺;) – 2010-06-03 10:16:22

回答

3

每1毫秒更新一次位置是過度殺傷,因爲silverlight將不會更新快速的屏幕。當你修改對象的位置(或任何其他ui更新)時,silverlight會將幀緩衝區標記爲髒,然後它將最終重新繪製屏幕,​​但不會比MaxFrameRate更頻繁地重繪屏幕。

要設置MaxFrameRate剛:

Application.Current.Host.Settings.MaxFrameRate = 60; 

這將限制你的應用程序,以每秒60幀這應該是綽綽有餘。