기초 튜토리얼 7-1
Ogre3D 삽질란/Basic Tutorial 7 2008. 12. 4. 17:24
기초 튜토리얼 7 (번역 : n_Sys)
입문자 튜토리얼 7: CEGUI and Ogre
이 튜토리얼 진행중 문제가 발생한다면 Help 포럼 에 문의하세요.
Contents |
미리 알아두어야 할 것
소개
이번 튜토리얼에서는 오우거에서 어떻게 CEGUI(내장형 GUI 시스템)를 쓸 수 있는지 살펴봅니다. 이 튜토리얼이 끝날때 쯤 여러분은 CEGUI의 기초적인 기능을 프로그램에 추가할 수 있게 될 것입니다. NOTE: 이 튜토리얼에서는 CEGUI의 모든 기능을 가르쳐 주지 않습니다. 단지 시작할 수 있게 도와줄 뿐입니다. CEGUI에 대한 질문이나 도움요청은 공식 CEGUI홈피(http://www.cegui.org.uk/wiki/index.php/Main_Page)를 이용해 주세요.
이 튜토리얼에 대한 코드는 여기(http://www.ogre3d.org/wiki/index.php/BasicTutorial7Source)서 찾을 수 있습니다. 코드를 천천히 입력하면서 나오는 결과물을 직접 눈으로 확인하세요.
시작하기
초기 코드
이 튜토리얼에서는 미리 작성된 코드로 부터 시작 할 것입니다. 지금까지 튜토리얼을 진행해 온 것 처럼 이러한 방식은 익숙하리라 생각합니다. 프로젝트를 생성하고 아래 소스코드를 입력하세요 :
#include "ExampleApplication.h"
#include <CEGUI/CEGUI.h>
#include <OIS/OIS.h>
#include <OgreCEGUIRenderer.h>
class TutorialListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
public:
TutorialListener(RenderWindow* win, Camera* cam)
: ExampleFrameListener(win, cam, true, true)
{
mContinue=true;
mMouse->setEventCallback(this);
mKeyboard->setEventCallback(this);
} // CEGUIDemoListener
bool frameStarted(const FrameEvent &evt)
{
mKeyboard->capture();
mMouse->capture();
return mContinue && !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
}
bool quit(const CEGUI::EventArgs &e)
{
mContinue = false;
return true;
}
// MouseListener
bool mouseMoved(const OIS::MouseEvent &arg)
{
return true;
}
bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
return true;
}
bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
return true;
}
// KeyListener
bool keyPressed(const OIS::KeyEvent &arg)
{
return true;
}
bool keyReleased(const OIS::KeyEvent &arg)
{
return true;
}
private:
bool mContinue;
};
class CEGUIDemoApplication : public ExampleApplication
{
public:
CEGUIDemoApplication()
: mSystem(0), mRenderer(0)
{
}
~CEGUIDemoApplication()
{
if (mSystem)
delete mSystem;
if (mRenderer)
delete mRenderer;
}
protected:
CEGUI::System *mSystem;
CEGUI::OgreCEGUIRenderer *mRenderer;
void createScene(void)
{
}
void createFrameListener(void)
{
mFrameListener= new TutorialListener(mWindow, mCamera);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
};
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
#else
int main(int argc, char **argv)
#endif
{
// Create application object
CEGUIDemoApplication app;
try {
app.go();
} catch(Exception& e) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!",
MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occurred: %s\n",
e.getFullDescription().c_str());
#endif
}
return 0;
}
코드 컴파일
지금 시점에서 컴파일하고 실행이 되는지 확인하세요. 검은화면밖에 보이지 않을 것 입니다(ESC키를 누르면 종료합니다). 컴파일시 Linker에러가 발생하면 CEGUIBase_d.lib 와 OgreGUIRenderer_d.lib 파일을 Linker에 추가하세요(디버그 모드의 경우임. 릴리즈 모드의 경우에는 _d 부분을 제거).
간략한 소개
CEGUI는 오우거와 같은 3D 어플리케이션(물론 순수 DirectX와 OpenGL도 완벽하게 지원합니다)에 내장될 수 있는 강력한 GUI 전용 라이브러리 입니다. 오우거가 순수 그래픽 라이브러리인 점에서 많이 닮아 있습니다(사운드나 물리연산같은 다른 기능들을 포함하지 않습니다). CEGUI는 GUI 라이브러리일 뿐 입니다. 무슨 의미냐면 자기 스스로 출력하는 기능도 없을 뿐더러 마우스나 키보드 이벤트를 인지하지도 못합니다. CEGUI가 출력되기 위해서는 Renderer가 제공되어야 합니다(오우거에서는 OgreGUIRenderer를 의미하며 SDK에 포함되어 있습니다). 그리고 마우스와 키보드이벤트를 인식시키려면 해당시스템에 임의적으로 삽입시켜야 합니다. 처음부터 무척 힘들게 느껴질지도 모르겠군요. 하지만 실제로는 정말 약간의 코드만 필요로 할 뿐입니다. 일단 통합되기만 하면 GUI 출력과 입력에 대해서 완벽한 제어를 제공합니다. CEGUI자체만으로는 절대 그렇게 하지 못할 것 입니다.
CEGUI를 다루게 되면 처음보는 희안한 코드들(다른 GUI시스템들을 접해봤다 하더라도)을 접할 것 입니다. 진행하면서 나오는 부분마다 차근차근 설명해 드리겠습니다.