게임엔진 제 4 강프레임리스너와 OIS 입력시스템 이대현교수 한국산업기술대학교게임공학과
학습내용 프레임리스너의개념 프레임리스너를이용한엔터티의이동 OIS 입력시스템을이용한키보드입력의처리
게임루프 Initialization Game Logic Drawing N Exit? Y Finish
실제게임루프
오우거엔진의메인렌더링루프 Root::startRendering() 함수에서이루어짐. 메인루프수행내용 프레임리스너 (Frame Listener) 들의 framestarted() 함수호출 현재의장면으로부터한프레임을렌더링 프레임리스너 (Frame Listener) 들의 frameended() 함수호출 루프의중단 framestarted() 또는 frameended() 에서하나라도 false 리턴.
Ogre::FrameListener 클래스 프레임리스너 (frame listener) 장면이화면에렌더링되기직전에, 그리고렌더링된직후에호출되는함수를지니고있는객체 한프레임의렌더링전후에처리해야할일을프레임리스너를통해서구현할수있다. 프레임리스너객체를생성한후, 반드시프레임리스너로등록을시켜야비로소렌더링전후에호출이된다. 여러개의프레임리스너객체가존재할수있다.
실습 FishMove 물고기움직이기
FishMove.cpp (1) class MainListener : public FrameListener 실습 public: ~MainListener(void) } bool framestarted(const FrameEvent &evt) fishnode1->translate(-0.05f, 0.0f, 0.0f); fishnode2->translate(-0.08f, 0.0f, 0.0f); return true; } bool frameended(const FrameEvent &evt) return true; } };
FishMove.cpp (2) class App ESCListener* mesclistener; MainListener* mmainlistener; public: void go(void) mesclistener = new ESCListener(mKeyboard); mroot->addframelistener(mesclistener); 실습 } }; mmainlistener = new MainListener(mRoot); mroot->addframelistener(mmainlistener);
실행화면
물고기를움직이는프레임리스너의구현 class MainListener : public FrameListener FrameListener 클래스로부터상속. Root* mroot; RenderWindow* mwindow; public: MainListener(Root* root) mroot = root; mwindow = mroot->getautocreatedwindow(); 후략 }
FrameListener 멤버함수 Public Member Functions virtual bool framestarted (const FrameEvent &evt) Called when a frame is about to begin rendering. virtual bool frameended (const FrameEvent &evt) Called just after a frame has been rendered. virtual ~FrameListener () struct FrameEvent Real timesincelastevent; Real timesincelastframe; };
물고기를움직이는프레임리스너의구현 bool framestarted(const FrameEvent &evt) fishnode1->translate(-0.05f, 0.0f, 0.0f); fishnode2->translate(-0.08f, 0.0f, 0.0f); return true; } 물고기노드를이동. bool frameended(const FrameEvent &evt) return true; }
ESC 처리프레임리스너의구현 class ESCListener : public FrameListener OIS::Keyboard *mkeyboard; public: ESCListener(OIS::Keyboard *keyboard) : mkeyboard(keyboard) } bool framestarted(const FrameEvent &evt) mkeyboard->capture(); return!mkeyboard->iskeydown(ois::kc_escape); } };
프레임리스너의생성및등록 class App void go(void) mesclistener = new ESCListener(mKeyboard); mroot->addframelistener(mesclistener); 프레임리스너를생성. mmainlistener = new MainListener(mRoot); mroot->addframelistener(mmainlistener); mroot->startrendering(); }; 프레임리스너를등록. 렌더링루프에서프레임리스너를계속호출하게됨.
실습 FishKeyMove 좌우키이로물고기움직이기
FishKeyMove.cpp class MainListener : public FrameListener 실습 bool framestarted(const FrameEvent &evt) fishnode2->translate(-0.08f, 0.0f, 0.0f); mkeyboard->capture(); if (mkeyboard->iskeydown(ois::kc_left)) fishnode1->translate(-0.2f, 0, 0); else if (mkeyboard->iskeydown(ois::kc_right)) fishnode1->translate(0.2f, 0, 0); return!mkeyboard->iskeydown(ois::kc_escape); } };
실행화면 좌우키이로앞의물고기를좌우이동할수있음.
OIS InputManager 의생성및키보드입력장치등록 class MainListener : public FrameListener MainListener(Root* root) size_t hwnd = 0; mwindow->getcustomattribute("window", &hwnd); 윈도우핸들러획득 InputManager 생성 minputmanager = OIS::InputManager::createInputSystem(hWnd); mkeyboard = static_cast<ois::keyboard*> (minputmanager->createinputobject(ois::oiskeyboard, false)); } }; 키보드입력장치의생성 무버퍼입력
키입력캡쳐및코드확인 bool framestarted(const FrameEvent &evt) mkeyboard->capture(); if (mkeyboard->iskeydown(ois::kc_left)) fishnode1->translate(-0.2f, 0, 0); else if (mkeyboard->iskeydown(ois::kc_right)) fishnode1->translate(0.2f, 0, 0); return!mkeyboard->iskeydown(ois::kc_escape); }
실습과제 #2 물고기떼를추적하는카메라구현 50 마리의물고기떼가 +x 방향에서 x 방향으로이동.( 속도는각기제각각, 랜덤값 ) 숫자키이 1, 2, 3, 4 에따라, 각자다른방향에서보는카메라의설정. 방향은임의로정함. ex) 상, 하, 좌, 우