尝试在Silverlight中基于时间/帧动画对象(与使用诸如DoubleAnimation或Storyboard不适用的快节奏游戏),例如每帧沿特定方向移动太空飞船时,移动会很不平滑。屏幕甚至似乎会撕裂。
CompositionTarget和DistpatcherTimer之间似乎没有区别。 我使用以下方法(伪代码):
这应该会产生平滑的动画效果,对吗?但事实并非如此。以下是一个示例(控件:WASD和鼠标):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游戏。虽然在这个示例中我所描述的效果不太普遍,但我可以向您保证,即使将单个矩形移动到画布上也会产生跳跃的动画。
有人有什么想法可以最小化这种情况吗?除了使用Storyboards/DoubleAnimations之外,是否还有其他基于帧的动画方法可以解决这个问题?
编辑:这里有一种快速而简单的方法,使用最少的代码来为矩形添加动画效果(控件:A和D)动画示例
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;
}
谢谢! 安德烈