我还阅读了有关运动的其他两个主题: 基于时间的运动与基于帧频的运动?, 什么时候应该使用固定或可变时间步长?
但是我认为我对框架独立运动缺乏基本的了解,因为我不了解这些线程在说什么。
我跟着lazyfoo的SDL教程一起学习了框架无关的课程。http://lazyfoo.net/SDL_tutorials/lesson32/index.php
我不确定代码的运动部分在说什么,但是我想是这样的(如果我错了,请纠正我):为了使帧独立运动,我们需要找出一个物体有多远(例如精灵)在特定时间范围内移动,例如1秒。如果点以每秒200像素的速度移动,那么我需要通过将200 pps乘以1/1000秒来计算该点在该秒内移动了多少。
那正确吗?本课说:
“速度(以每秒像素数为单位*自上一帧以来的时间,以秒为单位。因此,如果程序以每秒200帧的速度运行:200 pps * 1/200秒= 1像素”)
但是...我以为我们将200 pps乘以1/1000秒。每秒帧数是什么业务?
如果有人可以给我一些关于框架独立运动如何工作的详细解释,我将不胜感激。
谢谢。
加成:
SDL_Rect posRect;
posRect.x = 0;
posRect.y = 0;
float y, yVel;
y = 0;
yVel = 0;
Uint32 startTicks = SDL_GetTicks();
bool quit = false;
SDL_Event gEvent;
while ( quit == false )
{
while ( SDL_PollEvent( &gEvent ) )
{
if ( gEvent.type == SDL_QUIT )
quit = true;
}
if ( y <= 580 )
{
yVel += DOT_VEL;
y += (yVel * (SDL_GetTicks() - startTicks)/1000.f);
posRect.y = (int)y;
}
startTicks = SDL_GetTicks();
SDL_BlitSurface( bg, NULL, screen, NULL );
SDL_BlitSurface( dot, NULL, screen, &posRect );
SDL_Flip( screen );
}
该代码将点向下移动到屏幕上。我想到目前为止,我一切都正确。它在屏幕上向下移动,但是有些奇怪的事情发生了,我无法解释。当该点大于该y值时,应将其停留在y = 580处。但是,每次我运行该程序时,该点都会在不同的位置结束,这意味着要多于580,所以该点位于屏幕的一半或一半以上(点是20像素,尺寸800x600)。如果我单击并按住程序的标题栏,然后再松开,则点将从屏幕上消失。每次如何变化?至于标题栏问题,我认为这是因为当我按住标题栏时,计时器仍在运行,并且经过的时间变长了,导致点在下一帧中移动的距离更大。那正确吗?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
然后做:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }