c#控制台应用程序-在x时间段(重复帧)内值未更改时如何执行函数

c#控制台应用程序-在x时间段(重复帧)内值未更改时如何执行函数,c#,console,repeat,C#,Console,Repeat,我的主要问题是,我正在为一个游戏编写一个动作模拟程序, 我想做的是,检查角色是否被卡住,其位置是否没有改变 所以我的想法是这样的: 如果Me.Location3D与X时间量相同->Me.SetLocation(Location3D.X=Location3D.X+1,Location3D.Y=Location3D.Y+1) 如果有人知道如何检查经过的时间,那就太好了 遗憾的是,我还没有在stackoverflow上找到这样一个具体的东西,只是说,因为这个主题听起来很一般 问候语如果你在玩游戏,你应

我的主要问题是,我正在为一个游戏编写一个动作模拟程序, 我想做的是,检查角色是否被卡住,其位置是否没有改变

所以我的想法是这样的:

如果
Me.Location3D
X
时间量相同->
Me.SetLocation(Location3D.X=Location3D.X+1,Location3D.Y=Location3D.Y+1)

如果有人知道如何检查经过的时间,那就太好了

遗憾的是,我还没有在stackoverflow上找到这样一个具体的东西,只是说,因为这个主题听起来很一般


问候语

如果你在玩游戏,你应该使用一个主循环。 解决方案非常简单

每次进入此方法时,请检查操作之间经过的时间

您应该阅读此链接:

可变步长游戏循环

可变步长游戏在连续循环中调用其更新和绘制方法,而不考虑TargetReleasedTime。将Game.IsFixedTimeStep设置为false会导致游戏使用可变步长游戏循环

动画和计时

对于需要精确计时的操作(如动画),游戏使用的游戏循环类型(固定步长或可变步长)非常重要

使用固定的步长允许游戏逻辑使用targeteReleasedTime作为其基本时间单位,并假设将在该时间间隔调用更新。使用可变步长要求游戏逻辑和动画代码基于ElapsedGameTime,以确保游戏顺利进行。由于在绘制上一帧后立即调用Update方法,因此调用Update之间的时间可能会有所不同。如果不考虑通话间隔时间,游戏似乎会加速或减慢。Update方法的gameTime参数中提供了调用Update方法之间经过的时间。您可以通过调用ResetElapsedTime来重置经过的时间


当使用可变步长游戏循环时,您应该以游戏单位每毫秒(ms)表示速率,例如精灵移动的距离。然后,可以将精灵在任何给定更新中移动的量计算为精灵速度乘以经过的时间。使用这种方法来计算精灵移动的距离,可以确保在游戏或计算机的速度变化时,精灵将始终如一地移动

我通常会用这样一个简短的回答来评论,但我的口碑不够好。 我的解决方案是用一个变量跟踪它,并在需要时重置,在角色移动的情况下

    Double elapsedTimeInMS = 0;
    private void YourTimer(object sender, EventArgs e)
    {
        //Every 10 ms
        elapsedTimeInMS += 10;
    }

    private void btnClick(object sender, EventArgs e)
    {
        //In your case the character moves
        MessageBox.Show(elapsedTimeInMS + "");
        elapsedTimeInMS = 0;
    }
编辑后

您需要在计时器中执行检查,以查看所用时间是否过快。

“我的主要问题是,我正在为游戏编写运动模拟程序。”:)除此之外,目前还不清楚实际问题是什么:显然,您应该能够存储位置并与当前位置进行比较,以查看它是否在一段时间内没有更改。。。我们不太可能根据您提供的示例在您的程序中“检查经过的时间”…我可以比较它们,这不是问题,我的问题是检查经过的时间,既然我没有内置函数,现在就更不清楚了——如果你的代码中甚至没有这样的方法,那么如何帮助你使用它呢?一些关于按照pix的答案中的建议创建游戏/模拟框架的阅读可能是实现一个.MessageBox.Show(elapsedTimeInMS+“”)的良好起点;如果不公开timeroption,这很难看。@pix这是一个例子,它只是关于跟踪时间。他必须亲自实施。编辑:点击按钮(和消息框)是为了让我检查它是否有效,与他的代码/我的答案无关。
    Double elapsedTimeInMS = 0;
    private void YourTimer(object sender, EventArgs e)
    {
        //Every 10 ms
        elapsedTimeInMS += 10;
    }

    private void btnClick(object sender, EventArgs e)
    {
        //In your case the character moves
        MessageBox.Show(elapsedTimeInMS + "");
        elapsedTimeInMS = 0;
    }