我需要在 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/