728x90
가상함수를 더 스마트하게 사용하는 방법. shared_ptr 을 이용한 간단한 게임모드 변경을 예로
예제를 작성하였습니다. 실제 최근 개발한 개인 프로젝트에서도 사용한 방법이지요
게임모드 외에도 엑터 관리나 상속을 통해서 만드는 모든 구조에 대해서 응용이 가능합니다
예제
#include "stdafx.h" #include <boost/shared_ptr.hpp> #include <boost/timer.hpp> #include <vector> #include <iostream> class CGameMode { public: virtual void Run() = NULL; }; class CLogo : public CGameMode { public: void Run() { std::cout << "로고 입니다" << std::endl; } }; class CTitle : public CGameMode { public: void Run() { std::cout << "타이틀 입니다" << std::endl; } }; class CGameBase : public CGameMode { public: void Run() { std::cout << "예제 게임 입니다" << std::endl; } }; class CGame : public CGameBase { public: void Run() { std::cout << "본 게임 입니다" << std::endl; } }; int _tmain(int argc, _TCHAR* argv[]) { std::vector< boost::shared_ptr<CGameMode> > GameMode; // 어떤 모드건 상관없이 다 받아줄 배열 // 로고 모드를 넣어봅시다 { boost::shared_ptr<CGameMode> pTemp(new CLogo()); GameMode.push_back(pTemp); } // 타이틀 모드를 넣어봅시다 { boost::shared_ptr<CGameMode> pTemp(new CTitle()); GameMode.push_back(pTemp); } // 예제 게임을 베이스로 상속받아 만든 본 게임 모드를 넣어봅시다 { boost::shared_ptr<CGameMode> pTemp(new CGame()); GameMode.push_back(pTemp); } boost::timer ModeChangeTimer; // 정의와 함께 타이머는 시작되었습니다 while(true) { if(GameMode.size()) { if(ModeChangeTimer.elapsed() > 3.f) // 3초마다 모드를 바꿔봅시다 { std::cout << ModeChangeTimer.elapsed() << " 모드 실행 & 체인지" << std::endl; GameMode.begin()->get()->Run(); GameMode.erase(GameMode.begin()); // 실행된 모드는 삭제 ModeChangeTimer.restart(); // 타이머 초기화 } } } return 0; }
결과
728x90
'프로그래밍 > boost' 카테고리의 다른 글
boost::function / boost::tuple 의 활용 (0) | 2012.11.07 |
---|---|
boost::tuple / tuples / tuples::tuple (0) | 2012.11.06 |
boost::random (0) | 2012.10.24 |
boost::asio 비동기 서버/클라 step 2 (4) | 2012.09.25 |
boost::asio 비동기 TCP 서버 / 클라 예제 (1) | 2012.09.03 |
댓글