Очень понравилась компонентная структура. Когда автор мне про неё впервые рассказал, я так возбудился, что тут же побежал прикручивать её к своему проекту :) Подход действительно работает очень хорошо и заставляет посмотреть свежим взглядом на заезженную парадигму ООП и её место в народном хозяйстве :)
Не к одному компоненту, а к одному объекту. Я сомневаюсь, что буду это делать в ближайшее время, не стоит такой задачи. Мне от архитектуры нужна была гибкость в добавлении новых объектов, а выносить это все в конфиги — дело десятое.
Оно лично мне ничего особо не принесет в плане удобства — разве что внутреннюю гармонию, мол «вот сейчас все как надо»)
Ну просто это уже наведение лоска, не добавляющее по сути ничего нового.
У меня слишком много других проектов (в основном, хардварных), чтобы достигать гармонии путем выноса списка компонентов в конфиг)
Хотел записать видео настоящего матча с друзьями, когда трое играют оно повеселее)
Но сейчас только один друг в пределах досягаемости, так что записал трехминутный демо-матч. Приложил к статье.
Я с XNA никогда не работал (а выглядит эта хна, кстати, весьма тяжеловесной...), а с OpenGL в свое время развлекался. К тому же, я упомянул, что сначала решил писать на C++, и цппшная версия была на ОпенГЛ, разумеется — поэтому когда я перешел на шарп, было проще повторить то, что я реализовал на С++, нежели начинать внедрять новую технологи.
Спасибо большое за статью, хотелось бы поподробнее узнать про реализацию отрисовки. Как вы добились легкой подмены рендера (например, рендер directX, openGL, GDI и т.д.)
Архитектура прекрасно описана, еще раз спасибо за статью и ждем новых.
Я опишу это подробнее после. Если коротко — все, что связано именно с отрисовкой вынесено в Graphics.dll. Внешней системе важен только интерфейс IGraphicSystem. У него есть метод AddToFrame(IGraphicsObject);
Соответственно, для опенГЛ, допустим, реализуется OGLGraphicSystem:IGraphicSystem, и всего несколько классов объектов — OGLSprite:IGraphicsObject, OGLMap:IGraphicsObject, OGLText:IGraphicsObject — это все, что юзает игра.
Соответственно, если нужно написать другой рендерер, просто реализуется наследник интерфейса IGraphicSystem, допустим Direct3dGraphicSystem вместе с D3DMap, D3DSprite, D3DText.
Спрайт, допустим, можно заменить 3Д моделькой — внешней системе, в принципе, все равно — она просто берет графический объект, выставляет ему координаты и кидает на рендер.
Goblin Wars II.NET – история создания сетевой игры на C# с нуля