1) 구조적 이슈 : 게임엔진에서 깔끔하게 코드를 작성할 수 있을까?
2) Storage 이슈 : 많은 데이터를 어떻게 효과적으로 관리할 수 있을까?
3) Behavioral 이슈 : 100가지 몬스터가 있을 때 다 따로 코딩하면 비효율적!
→ Singleton 사용!
class Singleton {
public:
static Singleton* Instance(); //한 번만 호출된다
protected:
Singleton();
static Singleton* m_pInstance;
...
};
---------------------------
Singleton* Singleton::m_pInstance = NULL;
Singleton* Singleton::Instance() {
if(m_pInstance==NULL) m_pInstance = newSingleton;
return m_pInstance;
}
class Product;
class Texture: public Product;
class Mesh: public Product;
class Item: public Product;
class AbstractFactory {
public:
Product* Create(int id);
}
Product* AbstractFactory::Create(int id) {
// 원하는 오브젝트를 생성한다
switch (id) {
case TEXTURE: return new Texture; break;
case MESH: return new Mesh; break;
case ITEM: return new Item; break;
}
return NULL;
}
class Factory {
public:
// 이 안에서 AbstractFactory::Create(TEXTURE) 를 호출한다
Texture* CreateTexture();
Mesh* CreateMesh();
Item* CreateItem();
};
class Soldier: public AbstractFlyweight
{
public:
//각 솔져마다 다른 값의 Extrinsic Parameter를 가진다
void methods(ExtrinsicParameters* );
protected:
//전략(전진, 후퇴) 등의 공통된 행동은 공유한다
IntricsicParameters m_params;
};
class SoldierInstance
{
public:
void methods();
protected:
ExtrinsicParameters m_info;
};
class FlyweightFactory
{
public:
AbstractFlyweight* GetFlyweight(int type);
static FlyweightFactory* Instance();
protected:
AbstractFlyweight* m_aFlyweight;
AbstractFlyweight* Create(int type); // Factory로 특정 타입을 만들어낸다
...
};
AbstractFlyweight* FlyweightFactory::GetFlyweight(int type)
{
//타입 오브젝트가 존재하지 않는다면 만들어주는 부분
if (m_aFlyweight[type] not exists) m_aFlyweight[type] = Create(type);
return m_aFlyweight[type];
}
void SoldierInstance::methods()
{
FlyweightFactory* ff = FlyweightFactory::Instance();
Soldier* soldier = ff->GetFlyweight(SOLDIER);
soldier->method(m_info)
}
1) Linked List
2) Regular Grid
하나의 그리드 안에 너무 많은 오브젝트가 생긴다면?
→ 필요에 따라서 그리드 안에 그리드를 또 넣어보자
3) QuadTree 구조
각각 상속받아서 구현한다
→ 점점 알고리즘이 복잡해진다
전체를 관리하기 어렵다
기본적 물리 속성은 같고, 행동 특성만 다른 것이다
→ 코드 읽고 관리하는 데에 오히려 비효율적이다!
class Fighter
{
public:
//전략을 파라미터로 전달한다
Fighter(Strategy*);
void recalc_AI();
// 전략을 변경한다
void change_strategy(Strategy*);
private:
Strategy* m_pStrategy
}
void Fighter::recalc_AI()
{
m_pStrategy->recalc(...);
}
class Strategy {
public:
virtual void recalc(...);
}
//전략마다 새로운 클래스를 만든다
class FightStrategy: public Strategy;
class EscapeStrategy: public Strategy;
...