Как организовать рисование объектов? При изучении C++ и OpenGL столкнулся с некоторыми трудностями.
Подскажите, пожалуйста, как с точки зрения архитектуры более правильно организовать взаимодействие классов при рисовании объектов на экране?
Допустим, я хочу отобразить несколько игровых объектов, для каждого из которых имеется отдельный класс: Player, Enemy и т.п. Имеются классы ResourceManager, Sprite, Renderer.
Пока рассматриваю два варианта:
1) В каждом классе, который может быть отрисован, добавить метод draw() и использовать как-то так:playerSprite->draw();
enemySprite->draw();
2) Реализовать в классе Renderer методы для рисования объектов и использовать так:renderer->drawSprite(playerSprite, coors, orientation);
В обоих случаях есть трудности с управлением ресурсами. Хотелось бы сделать загрузку спрайтов и управление всем отображением в классах игровых объектов. Но тогда придётся в каждый из них при создании передавать указатель на менеджер ресурсов, а при втором варианте ещё и на Renderer.Player* player = new Player(resMgr, renderer);
Как мне кажется, это не очень правильное решение.
Есть вариант сделать классы ResourceManager и Renderer Singleton'ами и использовать их в любом нужном месте, тогда проблем не будет, но я читал много аргументов против такого метода.
Как организовать всё это правильно, чтобы можно было легко расширять и дорабатывать в дальнейшем?

21 Авг 2019 в 07:01
182 +1
0
Ответы
1

Для более правильной организации взаимодействия классов при рисовании объектов на экране, можно использовать шаблон проектирования MVC (Model-View-Controller) или MVVM (Model-View-ViewModel).

В вашем случае, можно выделить следующие классы:

Model - объекты игры (Player, Enemy и т.п.), которые содержат в себе логику игровых объектов.View - классы, отвечающие за отображение объектов на экране (Sprite, Renderer).Controller/ViewModel - классы, управляющие взаимодействием между Model и View (ResourceManager).

В такой архитектуре, в классе Player, Enemy и других объектов игры можно добавить методы отрисовки объектов, которые будут вызывать методы отображения в классе Renderer или Sprite. Это позволит отделить логику игры от отображения объектов.

Класс ResourceManager может быть ответственным за загрузку и управление ресурсами (текстурами, звуками и т.п.), а класс Renderer - за отображение объектов на экране.

Чтобы избежать передачи указателей на классы ResourceManager и Renderer при создании каждого объекта игры, можно использовать Singleton паттерн для этих классов. Однако, следует помнить о возможных проблемах с тестированием и расширяемостью такого подхода.

Таким образом, рекомендуется использовать MVC или MVVM архитектуру для организации взаимодействия классов при рисовании объектов на экране и избежать передачи указателей при создании объектов игры путем использования Singleton паттерна для классов ResourceManager и Renderer.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 706 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир