C# 给移动的精灵计时
我需要在OpenGL游戏中每像素移动一个路径(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
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。