Entity 01 - ¼Ó¼º ¹Ý¿µ

À̹ø Àå¿¡¼­´Â ¿£ÅÍƼ ½Ã½ºÅÛ È¤Àº °ÔÀÓ ¿ÀºêÁ§Æ® ÄÄÆ÷³ÍÆ® ½Ã½ºÅÛ¿¡ ´ëÇؼ­ ¾Ë¾Æº»´Ù.  °ÔÀÓ °´Ã¼¸¦ °ü¸®ÇÒ ¶§  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/