Я пишу игру, и она будет использовать систему сущностей на основе компонентов.Первые два компонента, которые я реализую, это EntityRepresentation и EntityState.Представление содержит анимацию, и состояние решает, как сущность должна реагировать на игровые события (примеры EntityStates: стоя, прыжки, атаки, мертвые, падения).
EntityRepresnetation решает, какую анимацию рисовать на экране, в зависимости от EntityState объекта.Если объект находится в состоянии «прыжка», будет воспроизводиться соответствующая анимация.(См. Функцию EntityRepresentation :: changeAnimation ().)
Вот как примерно я написал класс ...
class EntityRepresentation
{
public:
void draw(float x, float y, long currentTime, DrawingContext& dc) {
// ...
}
void changeAnimation(const EntityState::Id& stateId) {
currentAnimation = animationMap_[stateId];
}
private:
map<EntityState::Id, const Animation*> animationMap_;
const Animation* currentAnimation_;
};
Есть кое-что, что мне действительно не нравится в моем нынешнем подходе...> :( Часть EntityState :: Id. В настоящее время EntityRepresentation сопоставляет каждую анимацию, которую она содержит, с определенным EntityState :: Id. Идентификатор уникален для каждого класса, производного от EntityState (уникального для класса, а не для экземпляра).Эти идентификаторы в основном являются строками, которые должны быть написаны вручную в конструкторе класса, что означает, что они очень подвержены конфликтам имен - тем более, что я планирую сделать игру скриптовой (Python).
* 1009Может ли кто-нибудь дать мне несколько советов о том, как я могу решить эту проблему, связанную с идентификаторами. Я видел много реализаций системы на основе компонентов в играх, в которых также используются идентификаторы, но они мне все еще не нравятся.Это просто меня теряет.
Может быть, вы можете предложить изменение дизайна, такое, что EntityRepresentation не нужно знатьw тип EntityState, все еще сохраняя инкапсуляцию.