H_G_G_I
دوشنبه 24 مهر 1391, 22:43 عصر
سلام
من میخوام انجینم (البته انجینی در کار نیست فرض بگیرید) تو هر صحنه بینهایت ابجکت (کلاس GameObject) داشته باشه و هر کدوم از این ابجکت ها رفتار هایی داشته باشن که بازی ساز مینویسه !
یعنی میاد یه کلاس جدید میسازه و از کلاس Behavior من ارث میبره ! بعد می تونه این رفتار رو به هر ابجکتی نصبت بده ! مثل خیلی از موتور ها نمونش یونیتی .
الان مشکلم اینه که می خوام با دادن کلاس و یا نام کلاس که همون رفتار ما هست اگه ابجکت اون رو داشت برشگردونه اگه نداشت هم 0 بده !
میخوام به بهترین شکل باشه خطای زمان اجرا و .. نده سریع هم باشه !
-
-
اینم نمونه ! تابع GameObject::behavior_get رو درست کنید !:چشمک:
class Behavior
{
public:
bool m_enable;
GameObject* mp_obj;
virtual void onAttach();
virtual void onUpdate();
virtual void onDestroy();
}
class GameObject
{
public:
int m_x, m_y;
GameObject(int _x, int _y);
Behavior* m_behaviors[8];
Behavior* behavior_add(Behavior* b);
Behavior* behavior_get(/*type or string*/ b);
}
GameObject::GameObject(int _x, int _y)
{
m_behaviors[0] = m_behaviors[1]
= m_behaviors[2] = m_behaviors[3]
= m_behaviors[4] = m_behaviors[5]
= m_behaviors[6] = m_behaviors[7] = NULL;
m_x = _x;
m_y = _y;
}
Behavior* GameObject::behavior_add(Behavior* b)
{
for(int i = 0; i < 8; i++)
if(m_behaviors[i] == NULL)
{
m_behaviors[i].m_enable = true;
m_behaviors[i].mp_obj = this;
return m_behaviors[i];
}
return NULL;
}
Behavior* GameObject::behavior_get(/*type or string*/ b)
{
//???????????????????????????????????????
for(int i = 0; i < 8; i++)
if(m_behaviors[i] != NULL)
if(/*m_behaviors[i] TYPEIS b*/)
return m_behaviors[i];
return NULL;
//????????????????????????????????????????
}
class Scene
{
std::list<GameObject> m_objects;
GameObject* object_add(int _x, int _y);
}
GameObject* Scene::object_add(int _x, int _y)
{
m_objects.push_back(new GameObject(_x, _y));
return m_objects[m_objects.size()-1];
}
class MyBehavoir1 : Behavior
{
float m_speed;
};
class MyBehavoir2 : Behavior
{
int m_health;
};
int main(int argc, char** argv)
{
Scene scn;
GameObject* obj1 = scn.object_add(100, 100);
obj1->behavior_add(new MyBehavoir1);
obj1->behavior_add(new MyBehavoir2);
MyBehavoir1* l_behav1 = obj1->behavior_get( /* MyBehavoir1 OR "MyBehavoir1" */);
l_behav1->m_speed = 12;
MyBehavoir2* l_behav2 = obj1->behavior_get( /* MyBehavoir2 OR "MyBehavoir2" */);
l_behav2->m_health = 100;
}
-
هم اکنون نیازمنده کد های شما هستیم !:لبخند::لبخند:
من میخوام انجینم (البته انجینی در کار نیست فرض بگیرید) تو هر صحنه بینهایت ابجکت (کلاس GameObject) داشته باشه و هر کدوم از این ابجکت ها رفتار هایی داشته باشن که بازی ساز مینویسه !
یعنی میاد یه کلاس جدید میسازه و از کلاس Behavior من ارث میبره ! بعد می تونه این رفتار رو به هر ابجکتی نصبت بده ! مثل خیلی از موتور ها نمونش یونیتی .
الان مشکلم اینه که می خوام با دادن کلاس و یا نام کلاس که همون رفتار ما هست اگه ابجکت اون رو داشت برشگردونه اگه نداشت هم 0 بده !
میخوام به بهترین شکل باشه خطای زمان اجرا و .. نده سریع هم باشه !
-
-
اینم نمونه ! تابع GameObject::behavior_get رو درست کنید !:چشمک:
class Behavior
{
public:
bool m_enable;
GameObject* mp_obj;
virtual void onAttach();
virtual void onUpdate();
virtual void onDestroy();
}
class GameObject
{
public:
int m_x, m_y;
GameObject(int _x, int _y);
Behavior* m_behaviors[8];
Behavior* behavior_add(Behavior* b);
Behavior* behavior_get(/*type or string*/ b);
}
GameObject::GameObject(int _x, int _y)
{
m_behaviors[0] = m_behaviors[1]
= m_behaviors[2] = m_behaviors[3]
= m_behaviors[4] = m_behaviors[5]
= m_behaviors[6] = m_behaviors[7] = NULL;
m_x = _x;
m_y = _y;
}
Behavior* GameObject::behavior_add(Behavior* b)
{
for(int i = 0; i < 8; i++)
if(m_behaviors[i] == NULL)
{
m_behaviors[i].m_enable = true;
m_behaviors[i].mp_obj = this;
return m_behaviors[i];
}
return NULL;
}
Behavior* GameObject::behavior_get(/*type or string*/ b)
{
//???????????????????????????????????????
for(int i = 0; i < 8; i++)
if(m_behaviors[i] != NULL)
if(/*m_behaviors[i] TYPEIS b*/)
return m_behaviors[i];
return NULL;
//????????????????????????????????????????
}
class Scene
{
std::list<GameObject> m_objects;
GameObject* object_add(int _x, int _y);
}
GameObject* Scene::object_add(int _x, int _y)
{
m_objects.push_back(new GameObject(_x, _y));
return m_objects[m_objects.size()-1];
}
class MyBehavoir1 : Behavior
{
float m_speed;
};
class MyBehavoir2 : Behavior
{
int m_health;
};
int main(int argc, char** argv)
{
Scene scn;
GameObject* obj1 = scn.object_add(100, 100);
obj1->behavior_add(new MyBehavoir1);
obj1->behavior_add(new MyBehavoir2);
MyBehavoir1* l_behav1 = obj1->behavior_get( /* MyBehavoir1 OR "MyBehavoir1" */);
l_behav1->m_speed = 12;
MyBehavoir2* l_behav2 = obj1->behavior_get( /* MyBehavoir2 OR "MyBehavoir2" */);
l_behav2->m_health = 100;
}
-
هم اکنون نیازمنده کد های شما هستیم !:لبخند::لبخند: