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

1.6 백그라운드 처리 없이 이미지 움직이기


이미지를 화면에 표시할 때에는 포어그라운드에서 직접 처리하지 않고 프레임버퍼에서 직접 처리하게 된다면 모니터의 재생빈도(보통 60Hz)와 타이밍이 맞질 않아 잘못된 이미지가 표시된다. 이는 이미지가 깜빡이거나 잔상을 남기거나 하는 오류를 보이게 된다. 때문에 백그라운드에서 미리 처리하여 정상적인 이미지가 완성되었을 때 표시하는 단계를 거쳐야 한다. 단, 이번 섹션에서는 백그라운드 처리가 없는 상태에서는 어떻게 보이는지 확인한다.


#include <DxLib.h>


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

        ChangeWindowMode( TRUE ); // 윈도우 모드

        DxLib_Init(); // DX라이브러리 초기화


        int x = 50;

        int Handle; // 이미지 핸들값 저장을 위한 변수 선언

        Handle = LoadGraph( "image/character_01.png" ); // 이미지 로드


        while( 1 ){

                if( ProcessMessage() != 0 ){ // 메시지 처리

                        break;// 윈도우의 x버턴 클릭시 종료

                }

                DrawGraph( x, 100, Handle, TRUE ); //이미지 표시

                x = x + 2; // x(횡좌표)를 2씩 늘림

                Sleep(7); // 한번 루프때마다 7ms씩 슬립

        }

        

        DxLib_End(); // DX라이브러리 종료

        return 0;


실행결과



위 스크린샷처럼 이전에 표시된 프레임을 삭제하지 않고 새로 덧 씌웠기때문에 잔상이 보이게 된다. 디스플레이에 표시된 내용을 지우는 함수는 ClearDrawScreen 함수가 있다. 이 함수역시 단순히 호출하는 것 만으로 작동하기 때문에 특별한 설명은 필요 없다. 루프 시작시에 ProcessMessage함수와 ClearDrawScreen함수가 필요하다고 알고 있으면 되겠다.


#include <DxLib.h>


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

        ChangeWindowMode( TRUE ); 

        DxLib_Init(); 


        int x = 50;

        int Handle;     

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


        while( 1 ){

                if( ProcessMessage() != 0 ){ 

                        break;

                }

                ClearDrawScreen(); // 이미지를 지운다

                DrawGraph( x, 100, Handle, TRUE );

                x = x + 2;

                Sleep(7);

        }

        

        DxLib_End();

        return 0;


실행결과




위 실행결과와 같이 부드럽게 움직이지 못하고 어딘가 부자연 스러운 움직임을 볼 수 있다.

Posted by 캡슐리어