首页 > 解决方案 > 如何为重力添加计时器?

问题描述

private void KeyIsDown(object sender, KeyEventArgs e)
    {
        if(e.Key == Key.Space)
        {
            flappyBird.RenderTransform = new RotateTransform(-20, flappyBird.Width / 2, flappyBird.Height / 2); 

            gravity = -8;
            


        }
        if(e.Key == Key.R && gameOver == true)
        {
            StartGame();

        }
    }

我是 c# 的新手,并且希望在按下空格键后将重力(-8)设置为 x 秒,然后将重力恢复为正常(8),无论按键保持多长时间。我遵循了一个旧的 Flappy Bird 教程,但想改进代码。

任何帮助表示赞赏!

标签: c#timer

解决方案


-20 degrees此代码每次闪烁并返回到第一个状态。如果在旋转时按下空格键,则在该过程完成之前它不会响应。

我还评论了要测试的部分代码。

bool isTimerRun = false;
double gravity = 0;
bool down = true;
private void KeyIsDown(object sender, KeyEventArgs e)
{
   if (e.Key == Key.Space)
   {
      if(!isTimerRun)
      {
          System.Timers.Timer timer = new System.Timers.Timer();
          timer.Interval = 40;
          timer.Elapsed += Timer_Elapsed;
          timer.Start();
          isTimerRun = true;
      }
   }
   //if (e.Key == Key.R && gameOver == true)
   //{
   //    StartGame();
   //}
}
       
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
   if(down)
   {
       gravity--;
       Dispatcher.Invoke(() =>
       {
           flappyBird.RenderTransform = new RotateTransform(gravity, flappyBird.Width / 2, flappyBird.Height / 2);
       });
       if (gravity < -20)
       {
           down = false;
           gravity++;
       }
  }
  else
  {
      gravity++;
      Dispatcher.Invoke(() =>
      {
         flappyBird.RenderTransform = new RotateTransform(gravity, flappyBird.Width / 2, flappyBird.Height / 2);
      });
      if (gravity > 0)
      {
         down = true;
         gravity--;

         var timer = sender as System.Timers.Timer;
         timer.Stop();
         isTimerRun = false;
      }
   }
}

推荐阅读