Modularized class
In previous post, I show the design of composite class.
It looks almost nice but it' a bother to write/use accessor functions to each component.
The third idea here I introduce is something I call 'modularized class'.
class Object
{
public:
virtual ~Object() {} // make Object polymorphic.
};
// component classes deriving Object 'virtual'ly.
class Input : public virtual Object
{
...
};
class AIParam : public virtual Object
{
...
};
class Position : public virtual Object
{
...
};
class Health : public virtual Object
{
int health;
public:
void apply_damage(int damage) {
// when this object inherits TimeStatus, calcurate damage by the status
TimeStatus* s = dynamic_cast<TimeStatus*>(this);
if( s ) {
// do some culcuration.
}
health -= damage;
};
};
class TimeStatus : public virtual Object
{
...
};
template <typename... Modules>
class ModularObject : public Modules...
{
};
// Player, Enemy, Obstacle class inherits each component class.
// template class ModularObject is used for utility.
typedef ModularObject<Input, Position, TimeStatus, Health> Player;
typedef ModularObject<AIParam, Position, TimeStatus, Health> Enemy;
typedef ModularObject<Position,Health> Obstacle;
// use like this. (using template)
template <typename T>
void attack(int damage, T* obj)
{
// when obj does not inherit Health, this gets compile error.
obj->apply_damage(damage);
}
// or use dynamic_cast
void attack(int damage, Object* obj)
{
// when obj does not inherit Health, nothing happens.
Health* h = dynamic_cast<Health*>(obj);
if( h ) {
h->apply_damage(damage);
}
}
This approach uses multiple inheritance. and virtual inheritance which solves 'diamond problem'.
It's easy to add/remove features, and can access components directory.
I think this is the best solution for organizing class for game object.
No comments:
Post a Comment