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