c# - 如何为重力添加计时器?
问题描述
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 教程,但想改进代码。
任何帮助表示赞赏!
解决方案
-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;
}
}
}
推荐阅读
- r - 我如何在 R 中删除 \
- javascript - 无法在 Chrome devtools 中的 async/await 上放置断点
- c# - c#中的MySql过程调用不返回任何行
- javascript - javascript 映射到 Firestore -> 错误:参数“数据”的值不是有效的 Firestore 文档。输入不是普通的 JavaScript obj
- c - Makefile:未定义对 acos 的引用
- reactjs - 如何在反应应用程序中的 INavLink 中呈现自定义图标(不是 Office UI Fabric 图标)
- javascript - 将 => () => 转换为 ES5
- flutter - 如何处理本地状态与供应商的关系?
- r - curly curly 整洁的评估编程,具有多个输入和跨列的自定义函数
- sql - 全连接 - 两个表具有相同的属性和主键但不同的值。当我进行完全连接时,输出会是什么?