Как организовать рисование объектов? При изучении 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'ами и использовать их в любом нужном месте, тогда проблем не будет, но я читал много аргументов против такого метода. Как организовать всё это правильно, чтобы можно было легко расширять и дорабатывать в дальнейшем?
Для более правильной организации взаимодействия классов при рисовании объектов на экране, можно использовать шаблон проектирования 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.
Для более правильной организации взаимодействия классов при рисовании объектов на экране, можно использовать шаблон проектирования 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.