DX라이브러리2014. 12. 22. 13:55

1.7 백그라운드처리를 통한 이미지 움직이기


백그라운드처리는 다음과 같은 단계로 진행된다.


- 이미지를 백그라운드에서 처리하도록 함수를 먼저 호출한다.

- 루프 마지막에 백그라운드를 포어그라운드로 반영시켜주는 함수를 호출한다.


백그라운드 처리를 위한 함수는 SetDrawScreen( DX_SCREEN_BACK ); 이며 이 문장을 추가 함으로써 이미지를 백그라운드에서 포어그라운드로 처리해주는 단계를 자동적으로 처리 해준다. 이후 루프의 마지막에 이미지를 포어그라운드에 반영해주는 ScreenFlip함수를 호출하면 된다. 이 역시 단순히 호출만 하면 되는 작업이라 자세한 설명은 생략한다.


#include <DxLib.h>


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

ChangeWindowMode( TRUE );

DxLib_Init();

SetDrawScreen( DX_SCREEN_BACK ); //이미지 백그라운드 처리 설정


        int x = 0;

        int Handle;

        Handle = LoadGraph( "image/character_01.png" );


        while( 1 ){

                if( ProcessMessage() != 0 ){

                        break;

                }

                ClearDrawScreen();

                DrawGraph( x, 100, Handle, TRUE );

                x = x + 2;

                ScreenFlip(); //백그라운드 화면을 포어그라운드 화면에 반영

}

DxLib_End();

return 0;


실행결과




이와 같은 결과를 볼 수 있게 된다. 코딩시에는 반드시 백그라운드 처리를 염두해두고 작업하도록 한다.


지금까지의 내용을 정리하면


while(1){

메세지 처리;

화면의 이미지를 삭제;

이미지를 화면에 그릴 수 있도록 준비;

백그라운드에 그려놓은 내용을 포어그라운드에 반영;

}


와 같은 순으로 정리가 가능하다. 또한 이번 섹션에서의 예제에서는 sleep문이 포함되어있지 않다. 본래대로라면 엄청난 속도로 처리가 되면서 이미지가 움직여야 하지만 ScreenFlip함수는 모니터의 재생빈도에 맞추어 이미지처리를 하게되며 60Hz로 동작하는 모니터에서는 1/60초의 대기 시간을 갖게된다. 때문에 빠른속도로 이동하지 않고 적당한 속도로 이동하는 이미지를 확인 할 수 잇다. 


즉, 위 예제에서는 한번의 루프에 x좌표가 2씩 증가하고 60Hz의 속도로 연산하게되면 1초에 x좌표는 120증가 하는 것을 알 수 있다. 이와같이 1초에 몇 프레임의 처리가 가능한가 하는 "프레임 레이트"를 통하여 이동속도를 유추하는게 가능하다. 일반적인 PC의 재생빈도는 60Hz이며 보통 게임을 제작할 때에도 60FPS라는 전제하에 제작하게 된다.

Posted by 캡슐리어