기초 튜토리얼 7-2

Ogre3D 삽질란/Basic Tutorial 7 2008. 12. 4. 17:23

오우거에 통합시키기

CEGUI 초기화

지난 튜토리얼에서 CEGUI 구동시키는 법을 간략하게나마 배웠으므로 첫부분에 대한 내용은 넘어가도록 하겠습니다. createScene함수를 찾아서 다음 코드를 추가하세요 :

       mRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);

       mSystem = new CEGUI::System(mRenderer);

CEGUI 초기화 되었습니다. 이제 사용할 스킨을 선택해야 합니다. GEGUI 높은 수준의 커스터마이징을 지원합니다. 프로그램의 스킨을 바꿔주면서 look and feel 설정할 있도록 지원해 줍니다. 스킨에 대한 내용은 다루지 않을 계획입니다. 많은 사용법을 배우고 싶다면 CEGUI 홈페이지를 방문하세요. 다음 코드는 스킨을 선택합니다 :

CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme");

오우거설치시 기본값으로는 아무런 스킨도 설치되지 않습니다. 하지만 CEGUI CEGUI 공식홈페이지를 통해서 설치하면 몇가지 선택가능한 스킨이 포함됩니다(직접 만들 있습니다). 다음작업은 기본 마우스커서와 기본 폰트를 설정 하는 입니다 :

 

mSystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");

       mSystem->setDefaultFont((CEGUI::utf8*)"BlueHighway-12");

튜토리얼 시리즈들에서는 GUI 라이브러리를 쓸일이 없더라도 모두 CEGUI 커서를 사용합니다. 다른 GUI 라이브러리를 사용해서 마우스커서를 그리거나 오우거만 이용해서 바로 그릴수 있습니다(후자 경우 복잡한 선택사항이 수도 있습니다). 만약 마우스커서 하나 때문에 CEGUI 써야 하고 메모리 사용량과 개발중인 게임의 용량이 커질까봐 걱정된다면 앞서 설명한 선택사항들을 CEGUI 바꾸는걸 고려해 있습니다.

마지막에서 작성된 코드는 마우스커서를 설정했습니다. 그러나 나중에 있을 튜토리얼들과는 다르게 MouseCursor::setImage함수를 써서 직접적으로 마우스 커서를 설정하지 않았습니다. 튜토리얼에서는 CEGUI 윈도우의 종류(보이진 않습니다) 항상 화면상에 상주할 것이기 때문입니다. 결과적으로 디폴트 커서로 설정한 이미지로 마우스 커서가 만들어 것입니다. 만약 마우스커서를 직접 설정하고 디폴트값은 설정하지 않는다면 CEGUI 윈도우를 시간 통과하면서 보이지 않는 마우스커서가 것입니다( 튜토리얼에서는 절대 보이지 않게 겁니다). 반면에 아무런 CEGUI 윈도우를 출력하지 않는다면 디폴트 마우스 커서는 아무런 효과가 없습니다. 추후 이런 상황을 보게 것입니다. 이런 상황에서는 MouseCursor::setImage 함수를 써서 화면에 어플리케이션용 커서를 출력할 있습니다. 예제 입니다 :

CEGUI::MouseCursor::getSingleton().setImage(CEGUI::System::getSingleton().getDefaultMouseCursor());

 

이벤트 넣기

CEGUI 입력기능이 전혀 없습니다. 마우스의 움직임이나 키보드의 입력을 읽어내지 못합니다. 대신에 사용자로 하여금 입력과 마우스 이벤트를 시스템에 입력시키는 것에 의존합니다. 이제 이벤트를 다룰 차례입니다. CEGUI 쓰려면 버퍼방식 입력을 사용해야 합니다. 그래야만 이벤트가 발생하는 즉시 입력할 있습니다. KeyPressed 함수를 찾아서 다음 코드를 추가하세요 :

       CEGUI::System *sys = CEGUI::System::getSingletonPtr();

       sys->injectKeyDown(arg.key);

       sys->injectChar(arg.text);

시스템 객체를 얻은 이후 2가지 일들이 있습니다. 첫번째는 키가 눌려졌다는 이벤트를 CEGUI 입력하는것이고 두번째는 실제로 눌려진 키를 입력하는 입니다. Non-English 키보드일 경우 key down 이벤트 자체만으로는 항상 올바른 결과값을 가져다 주지 않으므로 눌려진 실제 키값을 입력시키는건 필수적 입니다. injectChar 유니코드를 고려해서 디자인 되었습니다.

이제는 키가 떨어졌을때의 상황처리를 해야 합니다. keyReleased함수를 찾아서 다음 코드를 추가하세요 :

CEGUI::System::getSingleton().injectKeyUp(arg.key);

키가 떨어졌을때는 키값을 입력해 필요가 없습니다. 키가 떨어졌다는 이벤트만 필요할 입니다.

 

마우스 이벤트 넣기&변환

키보드로 입력받는 작업은 모두 끝냈습니다. 이제 마우스 입력차례 입니다. 여기서 작은 문제점이 있습니다. 키가 눌려지고 떨어질때 CEGUI 입력시 변환작업은 없었습니다. OIS CEGUI 키보드에 대해서 같은 코드를 사용합니다. 하지만 마우스의 경우는 경우가 다릅니다. CEGUI 마우스버튼이 눌려졌다는 이벤트를 입력하기 전에 OIS 버튼ID로부터 CEGUI 버튼ID 변환시켜주는 함수를 작성해야 합니다. 다음 코드를 소스코드의 거의 최상단, TutorialListener클래스이전 부분에 추가하세요 :

CEGUI::MouseButton convertButton(OIS::MouseButtonID buttonID)

{

    switch (buttonID)

    {

    case OIS::MB_Left:

        return CEGUI::LeftButton;

 

    case OIS::MB_Right:

        return CEGUI::RightButton;

 

    case OIS::MB_Middle:

        return CEGUI::MiddleButton;

 

    default:

        return CEGUI::LeftButton;

    }

}

이제 마우스 이벤트를 입력시킬 준비가 되었습니다. mousePressed함수에 다음 코드를 추가하세요 :

CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id));

설명이 필요 없는 코드입니다. 입력받은 버튼ID 변환시켜서 CEGUI 전달합니다. MouseReleased함수에 다음 코드를 추가하세요 :

CEGUI::System::getSingleton().injectMouseButtonUp(convertButton(id));

마지막으로 마우스가 움직였을때 CEGUI 입력하기 입니다. CEGUI::System객체는 injectMouseMove함수를 가지고 있는데 마우스의 상대적 움직임거리를 입력받습니다. OIS::mouseMoved핸들러가 그에 연관된 움직임거리 state.X.rel state.Y.rel변수들을 제공합니다. MouseMoved함수에 다음 코드를 추가하세요 :

CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);

완성입니다. 이제 CEGUI 마우스와 키보드 입력에대한 모든 설정을 끝마쳤습니다.

: