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 |
댓글