Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 29.04.2020
Сообщений: 1

ООП vs КОП

29.04.2020, 18:41. Показов 6603. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте
Делаю простой движок для 2d-игры. Сейчас структура игровых объектов примерно такая:
___________________________________entit y
_____________________________________|
_________________________________ drawable ______
________________ / _____________________________ \
______________ physical __________________________ effect
________/_________|____________ \ _______________ /__ \
____ ped _____projectile__________block__________ smoke_blood
___ /__ \ _____ /___ \ _________ /____\
_player_enemy__bullet _grenade pickup map

Но уже становится понятно, что это не совсем правильное решение (например, наследование physical от drawable - высосано из пальца, например, может быть ветер, который не видно, но при этом он влияет на персонажа). Также теряется гибкость (например, нельзя сделать персонажа, ходящего сквозь стены (без костылей)).
Прочитал пару статей по геймдеву и понял, что всё это дело лучше реализовать при помощи компонентно-ориентированного программирования. Действительно, на первый взгляд всё кажется простым - игровые объекты формируются из компонентов, которые не зависят друг от друга - плюсы очевидны: возможность независимого редактирования, легкость создания игровых объектов с самыми разными характеристиками и т.д.
Но мне не понятен один нюанс, собсна вопрос темы заключается в следующем:

Например, у меня будут следующие компоненты :
- drawable - компонент делает объект видимым (отрисовка спрайтов/анимации, смена кадров анимации)
- collideable- компонент участвует в проверке коллизии
Вопрос вот в чем:
Для отрисовки объекта необходимо знать его координаты. Для проверки столкновений - тоже. Так где же правильней хранить координаты объекта? Выходит, компоненты-то не такие уж и независимые. Не получится просто пройти по вектору компонентов и вызвать функцию update(). В любом случае между ними будут взаимодействия. Так в чем тогда смысл, зачем строить сложные связи между компонентами (в drawable получать координаты с collideable и т.д.), если можно просто идти по цепочке наследования? Или я чего-то не понимаю?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.04.2020, 18:41
Ответы с готовыми решениями:

В кассовом аппарате есть восемь 25-копеечных монет, 10 - стоимостью по 50 коп. и 12 - по 5 коп
В кассовом аппарате есть восемь 25-копеечных монет, 10 - стоимостью по 50 коп. и 12 - по 5 коп. Найти вероятность того, что среди пяти...

В киоске продается газета стоимостью 3 коп. и журнал стоимостью 20 коп.
В киоске продается газета стоимостью 3 коп. и журнал стоимостью 20 коп. Составить программу, которая спрашивает о желании ...

Товар стоит "a" руб. "b" коп. За него заплатили "c" руб. "d" коп. Сколько сдачи требуется получить?
Товар стоит a руб. b коп. За него заплатили c руб. d коп. Сколько сдачи требуется получить? Вводятся 4 числа: a, b, c и d. Необходимо...

3
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
30.04.2020, 11:38
Цитата Сообщение от erstwr Посмотреть сообщение
Так где же правильней хранить координаты объекта?
В самом объекте?

Цитата Сообщение от erstwr Посмотреть сообщение
Выходит, компоненты-то не такие уж и независимые.
Две разные независимые задачи:
1. Пересчитать координаты объектов.
2. Отрисовать объекты.

Добавлено через 14 минут
У объектов есть (могут быть) несколько существенных (влияющих на обработку) признаков. По каждому признаку своя иерархия. Поэтому эти признаки лучше всего организовать с помощью классов типов (как в Хаскеле) или с помощью миксинов.
1
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
30.04.2020, 12:42
Цитата Сообщение от Shamil1 Посмотреть сообщение
Так где же правильней хранить координаты объекта?
На самом верхнем уровне иерархии.

Например:

Класс Place, поля XYZ
От него наследуем GameObject, поле visible
От него наследуем GameObjectMobile, поля: битмапы для анимации, текущая скорость, максимальная скорость
и GameObjectStill - поле - битмап
От GameObjectMobile наследуем, ну к примеру Пехотинец, Танкетка, Имперский разрушитель. Разница между ними должна быть уже не иерархическая, а конструктивная - у каждого их них имеется объект Weapon, если по-простому... И в этом они отличаются.

Да, от игры к игре бывает выгодно менять иерархию...

Но принцип остается - общий признак должен быть на вершине иерархии.
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.05.2020, 11:19
Цитата Сообщение от erstwr Посмотреть сообщение
В любом случае между ними будут взаимодействия.
Конечно взаимодействия будут. Иначе и быть не может.
Но преимущество КОП в том, что взаимодействия компонентов реализуются не через жесткое наследование классов, а через взаимодействие компонентов в рантайм. Игровой объект выступает как контейнер компонентов, и каждый объект может содержать только необходимые ему компоненты.
Цитата Сообщение от erstwr Посмотреть сообщение
Так где же правильней хранить координаты объекта?
Для хранения координат(а также вращений, масштаба и т.д.) создайте отдельный компонент Transform.
Когда некий компонент, например Drawable, захочет отрисоваться, он запрашивает у объекта компонент Transform. И если такой компонент найден - берет из него координаты для рисования.
Цитата Сообщение от erstwr Посмотреть сообщение
Так в чем тогда смысл, зачем строить сложные связи между компонентами (в drawable получать координаты с collideable и т.д.), если можно просто идти по цепочке наследования?
Проблема в том, что если вы будете наследовать таким образом, то у вас будет огромный зоопарк различных классов на каждый чих. К тому же, если у вас нет множественного наследования, то вы и не сможете реализовать все возможные комбинации. КОП же позволяет делать произвольные сочетания компонентов, без написания отдельных классов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.05.2020, 11:19
Помогаю со студенческими работами здесь

Установка нескольких ОС на один коп
Здравствуйте. Хочу установить на компьютер несколько ОС Виндовс, Линукс и Мак ОС Лайон для учебы и работы в них. Хочу спросить каким...

Вывод цен в виде руб/коп
НЕ ПОЛУЧАЕТСЯ ГРАМОТНЫЙ КОД НАПИСАТЬ,ХОТЬ УБЕЙТЕ!( Дан текстовый файл, представляющий собой таблицу стоимости товаров, состоящий из...

Сумма в отчете в формате Х руб. ХХ коп.
Подскажите пожайлуста Можно ли сделать:вПоле сумма пишет сумму100,20 а, надо 100 руб.20 коп. как прописать в событиях на поле после...

Считывание информации с GPIB шины (КОП)
Ребят подскажите идеи реализации надо решить вопрос считывания информации с GPIB который идет от Agility на ноут, надо подовать нужное...

Управление устройством через КОП (GPIB)
В лаборатории измерительной техники у нас много различных устройств: частотомеры, мультиметры, аттенюаторы и т.д. Но никто не знает как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru