C# 给移动的精灵计时

C# 给移动的精灵计时,c#,opengl,timing,stopwatch,C#,Opengl,Timing,Stopwatch,我需要在OpenGL游戏中每像素移动一个路径(Listtrack)上的精灵,所以我需要实现一种控制计时的方法。我读到了不同的方法:使用OnRenderUpdate(但是我不能让任何东西比1/fps快),使用不同的线程来控制时间,或者使用秒表(而不是计时器)。我正在尝试最后一个: private void Sprite_Move(Sprite sprite, List<Point> path) { track.Clear(); for (int i = 1; i < pa

我需要在OpenGL游戏中每像素移动一个路径(
List
track)上的精灵,所以我需要实现一种控制计时的方法。我读到了不同的方法:使用
OnRenderUpdate
(但是我不能让任何东西比1/fps快),使用不同的线程来控制时间,或者使用
秒表(而不是
计时器
)。我正在尝试最后一个:

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();
    }
  }
}
private void-Sprite\u移动(Sprite-Sprite,列表路径){
track.Clear();
for(int i=1;i=30)){
如果(i

我看不到我的精灵在动。在最后一次迭代之前,一切都被阻止,然后我在轨迹的最后一个像素上看到我的精灵…传送

那么,
秒表.Reset()
也会停止计时器。 看见 因此,在第一次迭代之后,timer.IsRunning将为false

相反,您可以在循环中使用
timer.StartNew()

关于动画计时: 我想秒表暂时还可以。 使用秒表或单独的线程可以独立于渲染速度。 虽然这不应该是一个问题,而你坚持二维精灵的动画

来自我的一个老项目:

    m_LastPoll.Stop();
    System.Diagnostics.Debug.Print("{0}:\t{1}", this.VendorID, m_LastPoll.ElapsedMilliseconds);
    m_LastPoll.Reset();
    m_LastPoll.Start();

这确实有效。

您可以使用某种全局时间值,而不是依靠计时器在特定的时间间隔内正确地计时——这取决于您的框架或秒表,并查看其经过的时间

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

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

(一定要注意溢出,即如果
>=N,不要再做任何事情。)

OnRenderUpdate
是你应该使用的。如果我强制我的游戏以30 fps的速度运行,我的移动速度不能超过1/fps。sprite.X=sprite.X+1;每1/30秒跑一次,效果很好,但我看不到我的精灵在移动。就在我的循环结束工作的最后位置…哼。。。奇怪。开始新的工作。您也可以在重置后使用“timer.Start();”。它可以工作,但我看不到我的精灵移动。在循环完成之前,一切都被阻塞,然后我的精灵“传送”到最后一个像素。我编辑了这个问题。所以它以前有效,但现在无效了?如果是这样,我就不知所措了。您可以尝试将秒表与上述答案结合使用。这意味着您可以使用OnRenderUpdate根据上述公式和秒表给出的时间更新帧索引。我只熟悉DX,没有OpenGL的经验,sry。