Здравствуйте.
Я относительно недавно полез в разработку игр. В частности столкнулся с проблемой - чистым ооп не удавалось решить некоторые задачи, или как минимум они выглядили ужасно. Вероятно это из-за моего скудного опыта применения патернов...
В общем, пытаясь найти какие-то вменяемые решения, я наткнулся на сию статью. Почитал, заинтересовался. Гуглил дальше, нашел вот эту серию статей, о компонентно ориентированом подходе. В следствии понимаие углубилось. И многое из непонятного раньше становилось более менее понятным. Однако, неизведанного тоже появилось немало.
Ближе к делу. Сейчас меня мучает один вопрос. Например, мы пишем шутер. Ясно дело у игрока есть оружие. Напрашивается компонент Weapon. Однако оружие может меняться. При чем в зависимости от типа оружие меняется и алгоритм его работы (если так можно выразиться). Как тут быть? Наследовать Weapon? Да вроде не то. Громадный switch-case в ShootingSystem, для перебора все-возможных типов оружия? Тоже не то. Возможно моя ошибка в том, что я считаю Weapon компонентом?
Собсно это основной (возможно, весьма делетантский) вопрос. Как быть в таких случаях?
З.Ы.: Любые сcылки по сабжу на статьи и книги приветсвтвутся (в т.ч. англоязыные, однако русскоязычные более предпочтительны). Особенно хотелось бы какую-нибудь книженцию прочитать.
lowercase
> Как тут быть? Наследовать Weapon?
сделай оружку набором компонентов же : )
в зависимости от текущего набора оно будет стрелять одиночными, очередями или непрерывно, хошь лазер, хошь огнемёт
lowercase
> Любые сылки по сабжу
Любые?
Тогда рекомендую изучить строение Unity3d. Там именно компонентный принцип.
Sh.Tac.
> сделай оружку набором компонентов же
То есть оружие - это сущность? И получается, что сущность (игрок) в качестве компонент может иметь другие сущности (оружие), которые, в свою очередь, состоят из другого набора компонет? :)
bazhenovc
Спасибо. Мимогугля замечал, но не вникал. Посмотрю :)
seaman
> Любые?
Виноват :) Имел ввиду ссылки больше теоретического характера. Юнити, скорее всего, для меня, будет излишним сейчас. Впрочем, надосуге можно почитать. Благодарю!
lowercase
> сущность (игрок) в качестве компонент может иметь другие сущности (оружие)
это вообще ООП : )
да-да, там кроме наследования есть агрегирование
компонент определяет некое поведение, которое желательно уметь навешивать сбоку, не громоздя развесистые иерархии
так что в данном случае оружие может не быть компонентом, но само вполне состоять из них
З.Ы. вернее даже оружие точно не может, вот стрельба может
З.З.Ы. наверное нужен какой-то пример, скажем есть персонаж управляемый игроком, он умеет стрелять, а есть непись которая сидит и торгует оружием, но стрелять не умеет
так вот если надо чтобы непись стала мобом/ботом, просто навешиваем ей компонент стрельбы, можно прям на ходу, типа сидел торговец, по нему пальнули, он разозлился, и начал палить в ответ
если бы такая возможность присутствовала изначально, то могли бы быть трудноуловимые ошибки, типа того, что непись вместо того чтобы торговать, стреляет по банкам, а так нет компонента, - нет проблем
lowercase
Все просто: создаешь WeaponComponent и Weapon. Компонента хранит текущее выбранное оружие.
lowercase
> Юнити, скорее всего, для меня, будет излишним сейчас
Именно оно и будет НЕ лишним
entity component system / data oriented design это интересный и работающий подход в кач-ве альтернативы ООП, вот ссылочки, в гугле можно найти больше.
(unity3d это не совсем ecs, это частный случай со своим подходом)
очень базовое и поверхносное введение
"Создание World of Tanks Blitz на базе собственного движка DAVA"
http://habrahabr.ru/company/wargaming/blog/245321/
тоже самое, очень базово
Wargaming.net: Архитектура современных 3D движков
https://www.youtube.com/watch?v=1zLqgQ_-F84&list=PLBmERAe8ffe… JpGhyG8dJeCtf
слайды
http://www.slideshare.net/flashgamm/wargamingnet-3d?ref=http://bl… ecture-video/
(*wargaming в своих докладах перепутал data driven и data oriented. Стоит читать как data oriented.)
фундаментальная теория
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-… pment-part-1/
http://t-machine.org/index.php/2007/11/11/entity-systems-are-the-… pment-part-2/
http://t-machine.org/index.php/2007/12/22/entity-systems-are-the-… pment-part-3/
http://t-machine.org/index.php/2008/03/13/entity-systems-are-the-… -mmos-part-4/
http://t-machine.org/index.php/2009/10/26/entity-systems-are-the-… -mmos-part-5/
http://t-machine.org/index.php/2014/03/08/data-structures-for-ent… guous-memory/
фундаментальный доклад по DOD
https://www.youtube.com/watch?v=16ZF9XqkfRY
отличное видео с последнего cppcon
CppCon 2014: Mike Acton "Data-Oriented Design and C++"
https://www.youtube.com/watch?v=rX0ItVEVjHc
еще отличная теория по ecs подходу на примере флеш фреймворка ash
http://www.richardlord.net/blog/what-is-an-entity-framework
http://www.richardlord.net/blog/why-use-an-entity-framework
Вики по ecs
http://entity-systems.wikidot.com/
фундаментальный труд/книга по dod
http://www.dataorienteddesign.com/dodmain/
академичный небольшой ecs фреймворк
http://gamadu.com/artemis/ (есть порты на другие языки, есть примеры маленьких игр)
попытка сделать бомбермен на ecs подходе
http://www.gamedev.net/page/resources/_/technical/game-programmin… -system-r3159
попытка переосмыслить более крутым чуваком
http://t-machine.org/index.php/2013/05/30/designing-bomberman-wit… h-components/
отличный доклад от супер студии (батлфилд 4) по Dod
http://dice.se/wp-content/uploads/Introduction_to_Data-Oriented_Design.pdf
от них же
http://dice.se/publications/culling-the-battlefield-data-oriented… -in-practice/
еще базовое введение в дод
http://gamedevelopment.tutsplus.com/articles/what-is-data-oriente… gn--cms-21052
просто компиляция ссылок
http://www.asawicki.info/news_1422_data-oriented_design_-_links_a… thoughts.html
https://dataorientedprogramming.wordpress.com/
Ps-spectre
> работающий подход в кач-ве альтернативы ООП
Это НЕ альтернатива ООП
Ps-spectre
Большое спасибо! Будет чем заняться на выходные ))
innuendo, ну разумеется что полностью ооп никто не отменял. Просто для разных задач подходят разные подходы. Даже для разных слоев. (игровая логика, физика, рендер, управление состояним, сеть и т.д.). Хотя всегда можно упороться и молотком гвозди забивать.
lowercase, пожалуйста.)
кстати, еще просто забавная ссылка
https://handmadehero.org/
чувак по хардкору пилит на чистом Си (немного с примесью плюсов) юзая emacs с нуля игруленку. Прикольные стримы.
На ютубе запись.
https://www.youtube.com/user/handmadeheroarchive/videos
Ps-spectre
> ну разумеется что полностью ооп никто не отменял. Просто для разных задач
> подходят разные подходы. Даже для разных слоев
На чистом ООП прекрасно реализуется ECS
Ps-spectre
причем тут data-oriented? Да, одинаковые компоненты можно хранить в одном контейнере и эффективно все сразу обрабатывать. На этом что-либо общее с data-oriented заканчивается.
PANDA
> причем тут data-oriented?
Плюсую. data driven из области оптимизации, а pdf от DICE/Sony описалово того, какое гуано получился PPC на предпослелних конзолях :)
Тема в архиве.