#pragma once
#include "include.h"
const int MaxItemName = 100;
const int ItemDataIndexMax = 10;
const int MashIndexMax = 10;
enum ITEMTYPE
{
ITEMTYPE_ATT,
ITEMTYPE_DEF,
ITEMTYPE_ACC,
};
typedef struct Iteminfo
{
char szItemName[MaxItemName];
int iItemRenderIndex;
int iItemType;
int iItemOption;
Iteminfo() {}
Iteminfo(const char* _szItemName, const int& _iItemRenderIndex, const int& _ItemType, const int& _iItemOption)
: iItemRenderIndex(_iItemRenderIndex)
, iItemType(_ItemType)
, iItemOption(_iItemOption)
{
strcpy_s(szItemName, _szItemName);
}
}ITEMINFO, *PITEMINFO;
class Item3DMash
{
private:
int MashIndex;
public:
const int& GetMashIndex(void) {return MashIndex; }
public:
void MashRender()
{ cout << MashIndex << "번 인덱스 매쉬 랜더" << endl; }
public:
Item3DMash(const int _MashIndex) : MashIndex(_MashIndex) { cout << "매쉬 생성 완료" << endl; }
~Item3DMash() {}
};
Item3DMash* FindItemMashFile(const int& iKey)
{
Item3DMash* pMash;
if(iKey >= MashIndexMax)
{
return NULL;
}
pMash = new Item3DMash(iKey);
return pMash;
}
class CFlyItemMash
{
private:
map<int, Item3DMash*> m_ProtoMash;
public:
Item3DMash* FindMash(const int& iKey)
{
map<int, Item3DMash*>::iterator ItemMashIter = m_ProtoMash.find(iKey);
if(ItemMashIter == m_ProtoMash.end())
{
return NULL;
}
return ItemMashIter->second;
}
bool MashInsert(Item3DMash* _pMash)
{
if(!_pMash)
{
cout << "매쉬 데이터 정보 오류." << endl;
return false;
}
map<int, Item3DMash*>::iterator ItemMashIter = m_ProtoMash.find(_pMash->GetMashIndex());
if(ItemMashIter != m_ProtoMash.end())
{
cout << "이미 로딩한 매쉬입니다." << endl;
return false;
}
m_ProtoMash.insert(map<int, Item3DMash*>::value_type(_pMash->GetMashIndex(), _pMash));
return true;
}
Item3DMash* GetMash(const int& iKey)
{
Item3DMash* pMash = FindMash(iKey);
if(!pMash)
{
pMash = FindItemMashFile(iKey);
if(MashInsert(pMash))
{ return pMash; }
else
{ return NULL; }
}
return pMash;
}
private:
static CFlyItemMash* m_Inst;
public:
static CFlyItemMash* GetInst()
{
if(m_Inst == NULL)
{ m_Inst = new CFlyItemMash(); }
return m_Inst;
}
void DestroyInst() { SAFE_DELETE(m_Inst); }
private:
CFlyItemMash(void) {}
public:
~CFlyItemMash(void) {SAFE_DELETE_MAP(m_ProtoMash);}
};
CFlyItemMash* CFlyItemMash::m_Inst = NULL;
PITEMINFO FindItemDataFile(const int& iKey)
{
PITEMINFO pInfo = NULL;
if(iKey >= ItemDataIndexMax)
{
cout << iKey << "키의 아이템정보 파일이 존재하지 않습니다." << endl;
return NULL;
}
char szName[MaxItemName];
sprintf_s(szName, "%dITEM", rand() % 10);
pInfo = new Iteminfo(szName, rand() % 10, rand() % 10, rand() % 100);
return pInfo;
}
class CFlyItemDataBase
{
private:
map<int, PITEMINFO> m_ProtoSkillData;
public:
ITEMINFO* FindItemInfo(const int& iKey)
{
map<int, PITEMINFO>::iterator ItemInfoIter = m_ProtoSkillData.find(iKey);
if(ItemInfoIter == m_ProtoSkillData.end())
{
return NULL;
}
return ItemInfoIter->second;
}
bool SkillDataInsert(PITEMINFO _Iteminfo)
{
if(!_Iteminfo)
{
cout << "아이템 데이터 정보 오류." << endl;
return false;
}
map<int, PITEMINFO>::iterator ItemInfoIter = m_ProtoSkillData.find(_Iteminfo->iItemRenderIndex);
if(ItemInfoIter != m_ProtoSkillData.end())
{
cout << "입력하려는 아이템 정보가 이미 존재합니다." << endl;
return false;
}
m_ProtoSkillData.insert(map<int, PITEMINFO>::value_type(_Iteminfo->iItemRenderIndex, _Iteminfo));
return true;
}
const PITEMINFO GetSkillInfo(const int& iKey)
{
PITEMINFO pInfo = FindItemInfo(iKey);
if(!pInfo)
{
pInfo = FindItemDataFile(iKey);
if(SkillDataInsert(pInfo))
{ return pInfo; }
else
{ return NULL; }
}
return pInfo;
}
private:
static CFlyItemDataBase* m_Inst;
public:
static CFlyItemDataBase* GetInst()
{
if(m_Inst == NULL)
{ m_Inst = new CFlyItemDataBase(); }
return m_Inst;
}
void DestroyInst() { SAFE_DELETE(m_Inst); }
private:
CFlyItemDataBase(void) {}
public:
virtual ~CFlyItemDataBase(void) {}
};
CFlyItemDataBase* CFlyItemDataBase::m_Inst = NULL;
class CItemBase
{
public:
virtual void SkillInfoSetting(const ITEMTYPE& iType, const int& iKey) = 0;
virtual void SKillInfoRender() = 0;
virtual void ItemMashRender() = 0;
public:
CItemBase() {}
virtual ~CItemBase() {}
};
class CItem
: public CItemBase
{
protected:
Item3DMash* m_pItemMash;
PITEMINFO m_pItemInfo;
public:
virtual void SkillInfoSetting(const ITEMTYPE& iType, const int& iKey)
{
m_pItemMash = CFlyItemMash::GetInst()->GetMash(iKey);
m_pItemInfo = CFlyItemDataBase::GetInst()->GetSkillInfo(iKey);
}
virtual void SKillInfoRender()
{
cout << "**** 아이템 정보 ****" << endl;
}
virtual void ItemMashRender()
{ cout << "**** 아이템 매쉬랜더 ****" << endl; }
public:
void SetItemInfo(const PITEMINFO& _pItemInfo)
{
m_pItemInfo = _pItemInfo;
}
void SetMash(Item3DMash* _pItemMash)
{
m_pItemMash = _pItemMash;
}
public:
CItem() : m_pItemMash(NULL), m_pItemInfo(NULL) {}
virtual ~CItem() {}
};
class CAttItem
: public CItem
{
public:
virtual void SkillInfoSetting(const ITEMTYPE& iType, const int& iKey)
{
CItem::SkillInfoSetting(iType, iKey);
}
virtual void SKillInfoRender()
{
CItem::SKillInfoRender();
if(m_pItemInfo)
{
cout << "무기 정보" << endl;
cout << "이름" << m_pItemInfo->szItemName << " " ;
cout << "타입" << m_pItemInfo->iItemType << " " ;
cout << "수치" << m_pItemInfo->iItemOption << endl;
}
}
virtual void ItemMashRender()
{
CItem::ItemMashRender();
cout << "무기 랜더 위치 설정" << endl;
if(m_pItemMash)
m_pItemMash->MashRender();
cout << endl;
}
public:
CAttItem() {}
virtual ~CAttItem() {}
};
class CDefItem
: public CItem
{
public:
virtual void SkillInfoSetting(const ITEMTYPE& iType, const int& iKey)
{
CItem::SkillInfoSetting(iType, iKey);
}
virtual void SKillInfoRender()
{
CItem::SKillInfoRender();
if(m_pItemInfo)
{
cout << "방어구 정보" << endl;
cout << "이름" << m_pItemInfo->szItemName << " " ;
cout << "타입" << m_pItemInfo->iItemType << " " ;
cout << "수치" << m_pItemInfo->iItemOption << endl;
}
}
virtual void ItemMashRender()
{
CItem::ItemMashRender();
cout << "방어구 랜더 위치 설정" << endl;
if(m_pItemMash)
m_pItemMash->MashRender();
cout << endl;
}
public:
CDefItem() {}
virtual ~CDefItem() {}
};
class CAccItem
: public CItem
{
public:
virtual void SkillInfoSetting(const ITEMTYPE& iType, const int& iKey)
{
CItem::SkillInfoSetting(iType, iKey);
}
virtual void SKillInfoRender()
{
CItem::SKillInfoRender();
if(m_pItemInfo)
{
cout << "방어구 정보" << endl;
cout << "이름" << m_pItemInfo->szItemName << " " ;
cout << "타입" << m_pItemInfo->iItemType << " " ;
cout << "수치" << m_pItemInfo->iItemOption << endl;
}
}
virtual void ItemMashRender()
{
CItem::ItemMashRender();
cout << "방어구 랜더 위치 설정" << endl;
if(m_pItemMash)
m_pItemMash->MashRender();
cout << endl;
}
public:
CAccItem() {}
virtual ~CAccItem() {}
};
class CItemProxy
: public CItemBase
{
private:
CItemBase* m_Item;
public:
virtual void SkillInfoSetting(const ITEMTYPE& iType, const int& iKey)
{
if(m_Item == NULL)
{
switch(iType)
{
case ITEMTYPE_ATT :
m_Item = new CAttItem();
break;
case ITEMTYPE_DEF :
m_Item = new CDefItem();
break;
case ITEMTYPE_ACC :
m_Item = new CAccItem();
break;
}
}
m_Item->SkillInfoSetting(iType, iKey);
}
virtual void SKillInfoRender()
{
m_Item->SKillInfoRender();
}
virtual void ItemMashRender()
{
m_Item->ItemMashRender();
}
public:
CItemProxy() : m_Item(NULL) {}
virtual ~CItemProxy(void) {}
};
// Proxy.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
#include "Proxy.h"
int _tmain(int argc, _TCHAR* argv[])
{
CItemProxy* pProxyAtt = new CItemProxy;
pProxyAtt->SkillInfoSetting(ITEMTYPE_ATT, 2);
pProxyAtt->SKillInfoRender();
pProxyAtt->ItemMashRender();
CItemProxy* pProxyDef = new CItemProxy;
pProxyDef->SkillInfoSetting(ITEMTYPE_DEF, 8);
pProxyDef->SKillInfoRender();
pProxyDef->ItemMashRender();
CItemProxy* pProxyAcc = new CItemProxy;
pProxyAcc->SkillInfoSetting(ITEMTYPE_ACC, 10);
pProxyAcc->SKillInfoRender();
pProxyAcc->ItemMashRender();
SAFE_DELETE(pProxyAtt);
SAFE_DELETE(pProxyDef);
SAFE_DELETE(pProxyAcc);
return 0;
} |