如何在c#中使用WPF做快速流畅的动画

本文关键字:动画 WPF | 更新日期: 2023-09-27 18:04:38

我目前正在编写一款Pong游戏。我已经完成了大部分游戏,但我遇到了一个恼人的问题。我使用的dispatcherTimer优先级设置为发送,时间跨度设置为1毫秒。我用dx=9和dy=9使矩形动画化以使球移动得足够快。由于大像素的跳跃,球看起来在屏幕上跳跃,而不是平滑的旅行。根据数学计算,在每一毫秒的周期内,这个球的运动速度应该比现在快得多。我需要更频繁地更新球,并移动它更少…

有什么更好的方法可以做到这一点吗?下面是我的代码片段…
pongballTimer = new DispatcherTimer(DispatcherPriority.Send);
pongballTimer.Tick += new EventHandler(pongballTimer_Tick);
pongballTimer.Interval = new TimeSpan(0, 0, 0, 0, _balldt);
private void pongballTimer_Tick(object sender, EventArgs e)
{
   double pongtop = Canvas.GetTop(PongBall);
   double pongleft = Canvas.GetLeft(PongBall);
   double paddletop = Canvas.GetTop( RightPaddle );
   double paddleleft = Canvas.GetLeft( RightPaddle );
   if (pongleft + PongBall.Width > paddleleft)
   {
      if (((pongtop < paddletop + RightPaddle.Height) && (pongtop > paddletop)) ||
         ((pongtop + PongBall.Height < paddletop + RightPaddle.Height) &&
         (pongtop + PongBall.Height > paddletop)))
      { 
         _dx *= -1;
         SetBalldy(pongtop, PongBall.Height, paddletop, RightPaddle.Height);
         _rightpoint++;
         lblRightPoint.Content = _rightpoint.ToString();
         meHitSound.Play();
      }
      else // The ball went past the paddle without a collision
      {
         RespawnPongBall(true); 
         _leftpoint++;
         lblLeftPoint.Content = _leftpoint.ToString();
         meMissSound.Play();
         if (_leftpoint >= _losepoint)
               LoseHappened("You Lost!!");
               return; 
      }
   }
   if (pongleft < 0)
   {
      meHitSound.Play();
      _dx *= -1;
   }
   if (pongtop <= _linepady ||
         pongtop + PongBall.Height >= PongCanvas.Height - _linepady)
   {
      meDeflectSound.Play();
      _dy *= -1;
   }
   Canvas.SetTop(PongBall, pongtop + _dy);
   Canvas.SetLeft(PongBall, pongleft + _dx);
}

如何在c#中使用WPF做快速流畅的动画

可以使用WPF内置的动画技术,而不是在计时器回调中进行移动。

开始阅读属性动画技术概述,也许要特别注意最后一节逐帧动画:绕过动画和定时系统

然后您可以继续学习如何:使用compostiontarget在每帧间隔上渲染