À̹ø Àå¿¡¼´Â ¿£ÅÍƼ ½Ã½ºÅÛ È¤Àº °ÔÀÓ ¿ÀºêÁ§Æ® ÄÄÆ÷³ÍÆ® ½Ã½ºÅÛ¿¡ ´ëÇؼ ¾Ë¾Æº»´Ù. °ÔÀÓ °´Ã¼¸¦ °ü¸®ÇÒ ¶§ C++ »ó¼ÓÀ» »ç¿ëÇϸé óÀ½¿¡´Â Æí¸®ÇÏÁö¸¸ °¥¼ö·Ï º¹Àâµµ´Â Áõ°¡ÇÑ´Ù. ¿£ÅÍƼ ½Ã½ºÅÛÀº »ó¼Ó´ë½Å ±¸¼º¿ä¼ÒµéÀ» ÇÕ¼ºÇؼ ¸¸µç´Ù.
·¹°í ºí·Ïó·³ ÇÊ¿äÇÑ ±â´ÉÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù.
<¿£ÅÍƼ ½Ã½ºÅÛ¿¡ ÇÊ¿äÇÑ ±â´ÉÀ» Ãß°¡Çϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ÁøÇà ÇÒ °ÍÀÌ´Ù.>
1Àå ¼Ó¼º ¹Ý¿µ( GPG 5±ÇÀÇ ÅÛÇø´À» ÀÌ¿ëÇÑ C++ ¹Ý¿µ ±â´É ±¸ÇöÀ» Âü°íÇÑ´Ù.)
2Àå °´Ã¼°¡ µÇ´Â Entity Ŭ·¡½º ÇÊ¿ä
3Àå Entity¿¡ Ãß°¡µÇ´Â ÄÄÆ÷³ÍÆ® ÇÊ¿ä
4Àå Entity ȤÀº ÄÄÆ÷³ÍÆ®³¢¸® Åë½ÅÇϱâ À§ÇÑ ¸Þ½ÃÁö ½Ã½ºÅÛ
|
À̹øÀå¿¡¼´Â ¼Ó¼ºÀ» ¹Ý¿µÇØ º»´Ù.
1. ¼Ó¼º ŸÀÔ : Ŭ·¡½º ÅÛÇø´°ú Á¤ÀûÀÎ ¸â¹ö º¯¼ö¸¦ ÅëÇÑ °íÀ¯¼Ó¼º ¸¸µé±â
PropertyTypeÀº ¼Ó¼º °´Ã¼(MyProperty)¿¡¼ ¹ÝȯÇÒ ¼Ó¼º ŸÀÔÀ¸·Î µ¥ÀÌÅÍ ÇüÀ» ³ªÅ¸³½´Ù. GetTypeID()´Â ePropertyTypeÀÇ ¿°ÅÇü °ªÀ» ¹ÝȯÇÏ°í GetYpeName()Àº ¹®ÀÚ¿·Î "bool"À̳ª "DWORD"¸¦ ¹ÝȯÇÑ´Ù.
//PropertyType.h ¼Ò½º ÀϺκÐ
enum ePropertyType
{
ept_bool,
ept_DWORD,
ept_int,
ept_float,
ept_string,
ept_ptr,
eptMAX_PROPERTY_TYPES
};
template <class T> class PropertyType
{
public :
// Returns type ID associated with the templatized type.
static ePropertyType GetTypeID()
{
return ms_typeID;
}
static char* GetTypeName()
{
return ms_typeName;
}
private:
static ePropertyType ms_typeID;
static char* ms_typeName;
};
template<class T> ePropertyType PropertyType<T>::ms_typeID = ept_ptr;
template<class T> char* PropertyType<T>::ms_typeName = "ptr";
template<> ePropertyType PropertyType<bool>::ms_typeID = ept_bool;
template<> char* PropertyType<bool>::ms_typeName = "bool";
template<> ePropertyType PropertyType<DWORD>::ms_typeID = ept_DWORD;
template<> char* PropertyType<DWORD>::ms_typeName = "DWORD";
template<> ePropertyType PropertyType<int>::ms_typeID = ept_int;
template<> char* PropertyType<int>::ms_typeName = "int";
template<> ePropertyType PropertyType<float>::ms_typeID = ept_float;
template<> char* PropertyType<float>::ms_typeName = "float";
template<> ePropertyType PropertyType<char*>::ms_typeID = ept_string;
template<> char* PropertyType<char*>::ms_typeName = "string";
|
Ŭ·¡½º ÅÛÇø´ÀÇ Æ¯¼öÈ¿Í Á¤ÀûÀÎ ¸â¹ö º¯¼ö¸¦ ÅëÇØ ÄÄÆÄÀϽà °íÀ¯ÀÇ ¼Ó¼º°ªÀ» ¸¸µé¼ö ÀÖ´Ù. PropertyTypeÀ» »ç¿ëÇϸé MyProperty¿¡ Ãß°¡ÀûÀÎ ePropertyType °ªÀ» ÀÔ·ÂÇÒ ¼ö°í¸¦ ´ú¾î ÁØ´Ù. (MyProperty´Â µÚ¿¡ ³ª¿Â´Ù.) MyProperty »ý¼º½Ã »ç¿ëÇÏ´Â ÅÛÇø´ ÇüÀ» PrpertyType¿¡ Àü´ÞÇϸé, PropertyTypeÀº ÀÚµ¿À¸·Î ePropertyType°ú ŸÀÔ³×ÀÓÀ» »ý¼ºÇÏ°Ô µÈ´Ù.
Á¤ÀûÀÎ ¸â¹ö ÇÔ¼öÀÇ »ç¿ëÀº ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
PropertyType<int>::GetTypeID() PropertyType<bool>::GetTypeName()
2 ¼Ó¼º °´Ã¼: MyProperty
¼Ó¼º °´Ã¼´Â µ¥ÀÌÅÍ °ª°ú µ¥ÀÌÅÍ ¼Ó¼º¿¡ °ü·ÃµÈ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. °¢ °´Ã¼¿¡ Ãß°¡µÇ´Â ¼Ó¼ºÀÇ ´ÜÀ§°¡ µÉ °ÍÀÌ´Ù. IProperty´Â ¼Ó¼º°´Ã¼ÀÇ Ãß»ó Ŭ·¡½º·Î µ¥ÀÌÅÍ À̸§°ú ŸÀÔ, ŸÀÔÀÇ ¹®ÀÚ¿¿¡ °ü·ÃµÈ ÀÎÅÍÆäÀ̽º¸¦ ³ëÃâ ½ÃŲ´Ù. ÀÎÅÍÆäÀ̽º¸¦ µÎ°í ÇÏÀ§ °´Ã¼ MyProperty¸¦ ÅÛÇø´ Ŭ·¡½º·Î ¸¸µé¾î ÄÁÅ×À̳ʿ¡ ´ãÀ»¼ö ÀÖµµ·Ï ÇÑ´Ù.
MyProperty´Â ¼Ó¼º°´Ã¼ÀÇ ±¸Çö Ŭ·¡½º·Î ½ÇÁ¦ µ¥ÀÌÅ͸¦ °¡Áö°í ÀÖ´Ù.
#include <string>
#include "PropertyType.h"
//ÀÎÅÍÆäÀ̽º´Â ÅÛÇø´À» »ç¿ëÇÏÁö ¾ÊÀ½À¸·Î½á Property¸¦ ÄÁÅ×À̳ʿ¡ ´ãÀ»¼ö ÀÖ´Ù.
class IProperty
{
public:
IProperty( const std::string& name ) : m_name( name )
{
}
virtual ~IProperty()
{
}
const std::string& GetName()
{
return m_name;
}
virtual char* GetTypeName() const = 0;
virtual ePropertyType GetType() const = 0;
virtual void* GetData() = 0;
protected:
std::string m_name;
};
template<typename T>
class MyProperty : public IProperty
{
public:
MyProperty( const std::string& name ) : IProperty( name )
{
}
virtual ~MyProperty()
{
}
ePropertyType GetType() const
{
return PropertyType<T>::GetTypeID();
}
char* GetTypeName() const
{
return PropertyType<T>::GetTypeName();
}
virtual void* GetData()
{
return &m_data;
}
T& GetValue()
{
return m_data;
}
protected:
T m_data;
};
|
»ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.
//MyProperty Å×½ºÆ®
MyProperty<float>* pValue = new MyProperty<float>("Health");
pValue->GetValue() = 3.03f;
std::cout << pValue->GetName() << "=" << pValue->GetValue() << std::endl;
const char* szType = pValue->GetTypeName(); //float Çü
½ÇÇà °á°ú : Health=3.03
|
3 Ŭ·¡½º¿¡ ¼Ó¼º Àû¿ë : Á¦¾î Ŭ·¡½º MyPropertySystem
¼Ó¼º °´Ã¼ÀÎ MyProperty¸¦ °ü¸®Çϰųª Á¦¾îÇϱâ À§ÇÑ Å¬·¡½º°¡ ÇÊ¿äÇÏ´Ù. ¼Ó¼ºÀ» ¸®½ºÆ®·Î ÀúÀåÇÑ´Ù.
typedef std::list< IProperty* > PropertyList; PropertyList m_properties;
¼Ó¼ºÀ» Àб⸸ ÇÑ´Ù IProperty* GetProperty( const std::string& name );
4 ¼Ó¼ºÀÇ Ãß°¡ ¹× Àбâ : name¿¡ ÇØ´çÇÏ´Â ¼Ó¼ºÀÌ ¾øÀ¸¸é TŸÀÔÀÇ MyEntity ¼Ó¼ºÀ» ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. MyProperty<T>* GetProperty( const std::string& name ) T& GetPropertyValue( const std::string& name );
MyPropertySystemÀ» »ó¼ÓÇÏ¿© ¼Ó¼º ±â´ÉÀ» Ãß°¡ÇÑ´Ù.
class CPlayer : public MyPropertySystem
{
public:
CPlayer()
{
GetPropertyValue<int>("Damage") = 100; //Damage¶ó´Â ¼Ó¼ºÀ» Ãß°¡ÇÑ´Ù.
}
};
|
»ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.
//Ŭ·¡½º¿¡ MyProperty Àû¿ëÇÑ »ç¿ë¹ý
CPlayer player;
IProperty* prop = player.GetProperty("Damage");
int nDamage = player.GetPropertyValue<int>("Damage");
std::cout << "CPlayer " << prop->GetName() << " " << prop->GetTypeName() << " " << nDamage << std::endl;
½ÇÇà °á°ú : CPlayer Damage int 100
|
MyPropertySystemÀ» »ó¼ÓÇÑ CPlayer °´Ã¼¿¡¼ player.GetPropertyValue<int>("Damage")¿Í °°ÀÌ µ¥¹ÌÁö ¼Ó¼ºÀ» Ãß°¡ ÇÒ ¼ö ÀÖ´Ù.
¼Ò½º: property_test.zip
Âü°í)
GPG 5±Ç 1.3 ±¸¼º¿ä¼Ò ±â¹Ý °´Ã¼ °ü¸® GPG 5±Ç 1.4 ÅÛÇø´À» ÀÌ¿ëÇÑ C++ ¹Ý¿µ ±â´É ±¸Çö GPG 2±Ç 1.7 ¹ü¿ë C++ ¸â¹ö Á¢±ÙÀ» À§ÇÑ ¼Ó¼º Ŭ·¡½º http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?p=208760&sid=e4e2ec7a742b91a25248b5a724146a40 http://www.ogre3d.org/forums/viewtopic.php?f=1&t=53302 http://svn2.xp-dev.com/svn/Trefall-ComponentSystem/Source/ Fowler - Noll - Vo (FNV) Çؽ¬ : http://isthe.com/chongo/tech/comp/fnv/
|