본문 바로가기
프로그래밍/boost

boost::shared_ptr 과 Virtual Function 과 boost::timer

by neive 2012. 10. 25.
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

댓글