c# - 为移动 Sprite 计时

标签 c# opengl timing stopwatch

我需要在 OpenGL 游戏中按像素在路径(List<Point> 轨迹)上移动 Sprite ,因此我需要实现一种控制时序的方法。我读到了不同的方法:使用 OnRenderUpdate (但我不能做出比 1/fps 更快的速度),使用不同的线程来控制时间或使用 StopWatch (而不是 Timer )。我正在尝试最后一个:

private void Sprite_Move(Sprite sprite, List<Point> path) {
  track.Clear();
  for (int i = 1; i < path.Count; i++) {
    //memorize all track pixel, so I can update pixel per pixel my sprite position
    Bresenham2(path[i-1], path[i]);
  }
  //moving flag
  sprite.moving = true;
  //start my StopWatch
  timer.Start();
  Loop(timer, sprite);

}

private void Loop(Stopwatch timer, Sprite sprite) {
  int i = 1;
  while (timer.IsRunning) {
    //moving each 0.03s?
    if ((sprite.moving) & (timer.Elapsed.Milliseconds >= 30)) {
      if (i < track.Count) {
        //change sprite position to the i-th track pixel
        Sprite_Position(skinny, track[i]);
        i++;
        timer = StopWatch.StartNew();
        Console.WriteLine("Tick");
      }
      //if I'm on the end of the track I can exit
      else timer.Stop();
    }
  }
}

我看不到我的 Sprite 在移动。一切都被阻止,直到最后一次迭代,然后我在轨道的最后一个像素上看到我的 Sprite ......传送!

最佳答案

您可以使用某种全局时间值,而不是依赖计时器以特定间隔正确计时 - 这取决于您的框架或秒表,并查看其耗时。

例如,如果您的动画中有 N 个步骤,并且动画总共需要 T 秒才能运行,您可以通过以下方式找到动画的正确步骤

int frame = (int)((CurrentTimeInSeconds / (float)T) * N)

(一定要注意溢出,即如果frame >= N,则不再执行任何操作。)

关于c# - 为移动 Sprite 计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11740637/

相关文章:

c++ - OpenGL 纹理的奇怪事件

C# 亚毫秒计时

.net - .net 的 mysql 查询计时器

c# - 使用静态类或已声明的类

opengl - 通过处理纸上的 2d 草图生成 3d 对象

c# - 使用 C# Express 版本的 Compact Framework 开发

matlab - 在批处理模式下使用 openGL 渲染器时所有文本都丢失

javascript - Sprite 表上的计时

c# - 在 Windows 通用应用程序中调整复选框大小

c# - 与 Contract.Requires<T> 相比抛出异常?