Недавно я сделал простую игру Space Invadors, используя «систему сущностей». Это шаблон, который очень хорошо разделяет атрибуты и поведение. Мне потребовалось несколько итераций, чтобы полностью понять это, но как только вы разработали несколько компонентов, стало чрезвычайно просто создавать новые объекты, используя ваши существующие компоненты.
Вы должны прочитать это:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Это часто обновляется чрезвычайно знающим парнем. Это также единственное обсуждение системы сущностей с конкретными примерами кода.
Мои итерации проходили следующим образом:
Первая итерация имела объект "EntitySystem", который был, как описывает Адам; однако у моих компонентов все еще были методы - у моего компонента «рендеринг» был метод paint (), а у моего компонента позиции был метод move () и т. д. Когда я начал выделять сущности, я понял, что мне нужно начать передавать сообщение между компоненты и порядок выполнения обновлений компонентов .... слишком грязно.
Итак, я вернулся и перечитал блог T-machines. В потоках комментариев содержится много информации, и в них он действительно подчеркивает, что компоненты не имеют поведения - поведение обеспечивается системами сущностей. Таким образом, вам не нужно передавать сообщения между компонентами и заказывать обновления компонентов, потому что порядок определяется глобальным порядком выполнения системы. Хорошо. Может быть, это слишком абстрактно.
Во всяком случае для итерации №2 это то, что я почерпнул из блога:
EntityManager - выступает в качестве компонента «баз данных», которые могут быть запрошены для лиц, которые содержат определенные типы компонентов. Это может даже быть поддержано базой данных в памяти для быстрого доступа ... см. T-machine часть 5 для получения дополнительной информации.
EntitySystem - каждая система по сути является просто методом, который работает с набором объектов. Каждая система будет использовать компоненты x, y и z объекта, чтобы выполнить свою работу. Поэтому вы должны запросить у менеджера сущности с компонентами x, y и z, а затем передать этот результат в систему.
Entity - просто идентификатор, как долго. Сущность - это то, что группирует набор экземпляров компонентов вместе в «сущность».
Компонент - набор полей .... без поведения! когда вы начинаете добавлять поведение, оно начинает становиться грязным ... даже в простой игре Space Invadors.
Редактировать : кстати, 'dt' - это время дельты с момента последнего вызова основного цикла
Итак, мой основной цикл Invadors такой:
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
Поначалу это выглядит немного странно, но невероятно гибко. Это также очень легко оптимизировать; для разных типов компонентов вы можете иметь разные хранилища данных, чтобы ускорить поиск. Для класса 'form' вы можете получить его с помощью дерева quadtree для ускорения доступа для обнаружения столкновений.
Я, как вы; Я опытный разработчик, но не имел опыта написания игр. Я потратил некоторое время на изучение шаблонов разработки, и это привлекло мое внимание. Это ни в коем случае не единственный способ сделать что-то, но я нашел это очень интуитивным и надежным. Я считаю, что закономерность официально обсуждалась в книге 6 серии «Драгоценности при программировании игр» - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . Я сам не читал ни одной книги, но слышал, что они являются фактическим справочником по программированию игр.