여기에 움직임에 대한 두 개의 다른 스레드를 읽었습니다. 시간 기반 움직임 대 프레임 속도 기반 움직임? , 언제 고정 또는 가변 시간 단계를 사용해야합니까?
그러나 나는 그 스레드 중 하나가 무엇을 말하고 있는지 이해하지 못하기 때문에 프레임 독립적 인 움직임에 대한 기본 이해가 부족하다고 생각합니다.
나는 lazyfoo의 SDL 튜토리얼을 따르고 프레임 독립적 인 수업을 받았습니다. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
코드의 움직임 부분이 무엇을 말하려고하는지 잘 모르겠지만 이것이 맞다고 생각합니다 (잘못되면 수정하십시오) : 프레임 독립적 인 움직임을 얻으려면 객체가 얼마나 멀리 있는지 알아야합니다 ( 예를 들어 스프라이트)는 특정 시간 프레임 내에서 이동합니다 (예 : 1 초). 점이 초당 200 픽셀로 이동하면 200 pps에 1/1000 초를 곱하여 해당 초 내에 얼마나 많이 이동하는지 계산해야합니다.
맞습니까? 수업 내용 :
"마지막 프레임 이후 초 당 픽셀 단위의 속도 * 시간입니다. 따라서 프로그램이 초당 200 프레임으로 실행되는 경우 : 200 pps * 1/200 초 = 1 픽셀"
하지만 ... 200pps에 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; }