중급 튜토리얼 2-1
Ogre3D 삽질란/Intermediate Tutorial 2 2008. 12. 10. 18:33
중급 튜토리얼 2 (번역 : n_Sys)
중급 튜토리얼 2: RaySceneQuery, Mouse 조작법 기본
이 튜토리얼 진행에 있어서 문제가 생긴다면 Help 포럼에 문의하세요.
목차 |
소개
이번 튜토리얼에서는 기초적인 장면 에디터를 만들예정입니다. 진행하면서 다음 내용들을 다룹니다 :
1. RaySceneQuery를 이용하여 지형밖으로 카메라가 이탈하는 것을 방지하는법
2. the MouseListener와 MouseMotionListener 인터페이스의 사용법
3. 마우스를 이용해서 지형의 x, y좌표를 선택하는법
이 튜토리얼에 대한 코드는 여기서 찾을 수 있습니다. 이 내용을 스스로 천천히 진행하면서 완성되어지는 결과물을 직접 확인하세요.
사전 요구사항
이 튜토리얼은 여러분이 Ogre project를 어떻게 설정하고 컴파일 하는지에 대해서 이미 알고있다고 가정합니다. 오우거의 기본적인 객체들(장면노드, 엔티티, 기타등등)도 알고 있어야 합니다. 튜토리얼에서 쓰이는 STL 반복자에 대한 지식도 필요합니다. (오우거에서 STL 사용이 잦습니다. STL에 대해서 익숙치 않다면 짬을내서 배워두시는게 좋을겁니다.)
시작하기
데모를 만들기위해서 새로운 프로젝트를 생성합니다. "MouseQuery.cpp" 이름의 파일을 추가하고 다음 내용을 추가하세요 :
#include <CEGUI/CEGUISystem.h>
#include <CEGUI/CEGUISchemeManager.h>
#include <OgreCEGUIRenderer.h>
#include "ExampleApplication.h"
class MouseQueryListener : public ExampleFrameListener, public OIS::MouseListener
{
public:
MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer)
: ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer)
{
} // MouseQueryListener
~MouseQueryListener()
{
}
bool frameStarted(const FrameEvent &evt)
{
return ExampleFrameListener::frameStarted(evt);
}
/* MouseListener callbacks. */
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;
}
protected:
RaySceneQuery *mRaySceneQuery; // The ray scene query pointer
bool mLMouseDown, mRMouseDown; // True if the mouse buttons are down
int mCount; // The number of robots on the screen
SceneManager *mSceneMgr; // A pointer to the scene manager
SceneNode *mCurrentObject; // The newly created object
CEGUI::Renderer *mGUIRenderer; // CEGUI renderer
};
class MouseQueryApplication : public ExampleApplication
{
protected:
CEGUI::OgreCEGUIRenderer *mGUIRenderer;
CEGUI::System *mGUISystem; // cegui system
public:
MouseQueryApplication()
{
}
~MouseQueryApplication()
{
}
protected:
void chooseSceneManager(void)
{
// Use the terrain scene manager.
mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
}
void createScene(void)
{
}
void createFrameListener(void)
{
mFrameListener = new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
};
#if OGRE_PLATFORM == PLATFORM_WIN32 || 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
MouseQueryApplication app;
try {
app.go();
} catch(Exception& e) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox(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;
}
컴파일이 제대로 되는지 확인하세요.