루미앗

때론 게임에선 이미지를 띄울 때 사용자로 부터 입력 값을 받아야 할 때가 있습니다. SDL의 이벤트 핸들링 시스템을 이용하면 이런 것도 가능합니다.


            //Main loop flag
            bool quit = false;

            //Event handler
            SDL_Event e;

코드는 SDL이 초기화 되고, (이전 튜토리얼에서 쓰인) 미디어가 불러와진 다음, 사용자가 종료 했는지에 대한 여부를 추적하고 종료 플래그를 선언합니다. 우리는 이 부분부터 응용 프로그램을 시작했기 때문에, 확실하게 false로 초기화 되었습니다.


또한 SDL_Event 공용체를 선언해야 합니다. SDL 이벤트는 키를 누르거나, 마우스의 움직임, 게임패드의 동작 혹은 그 외 등등, 같은 것들입니다. 이번엔 프로그램을 종료시키는 종료 이벤트를 배워 봅시다.


            //While application is running
            while( !quit )
            {


이전 튜토리얼에서, 우리는 프로그램을 닫으려면 몇 초 동안 기다려야 했었습니다. 이번엔 사용자가 끄기 전까지 만든 프로그램은 대기하도록 해보겠습니다.


사용자가 종료를 원하지 않는 상태라면 우리는 프로그램을 계속 루프해야 합니다. 프로그램이 활성화 되어있는 동안 계속 실행되는 루프를 메인 루프, 가끔은 게임 루프라고 불립니다. 이건 어떤 게임이든 핵심적인 요소지요.


                //Handle events on queue
                while( SDL_PollEvent( &e ) != 0 )
                {
                    //User requests quit
                    if( e.type == SDL_QUIT )
                    {
                        quit = true;
                    }
                }


메인 루프의 상단에는 이벤트 루프가 있습니다. 이건 전부 빌 때까지 이벤트 큐를 계속 처리합니다.


여러분이 키를 누르거나, 마우스를 이동하거나, 터치스크린을 터치한다면, 이벤트 큐에 이벤트를 넣어줍니다.


이벤트 큐는 이벤트를 순서대로 저장하고 이를 처리하기 위한 대기 시간이 발생합니다. 무슨 이벤트가 발생했는지 알고싶을 때, SDL_PollEvent를 호출하여 가장 최근에 발생한 이벤트를 얻어 폴링합니다. SDL_PollEvent는 이벤트 큐에서 가장 최근의 이벤트를 가지고 있으며 이벤트를 SDL_Event에 넣고 함수로 전달합니다.


SDL_PollEvent는 큐가 빌 때까지 계속 반복됩니다. 큐가 비어있다면, SDL_PollEvent는 0을 반환합니다. 그래서 결국 이 코드 쪼가리는 이벤트 큐가 빌 때까지 이벤트를 계속 폴링해줍니다. 만약 이벤트 큐에 SDL_QUIT 이벤트가 있다면(which is the event when the user Xs out the window[각주:1]), 우리가 응용 프로그램을 종료 할 수 있도록 true로 플래그를 설정하고 프로그램을 종료합니다.


                //Apply the image
                SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );
            
                //Update the surface
                SDL_UpdateWindowSurface( gWindow );
            }


프레임에 대한 이벤트 처리를 완료한 다음, 화면에 그리며 (이전 강좌에서 이야기했던 것과 같이) 업데이트 합니다. 종료 플래그가 true로 설정되어있는 경우, 응용 프로그램은 루프가 끝나면 종료됩니다. false로 되어있다면 윈도우의 x 버튼을 누르기 전까지 계속 동작합니다.

  1. 능력 부족으로 인한 번역 불가 [본문으로]

Comment +0