Управління списками різних типів організацій - чи є кращий спосіб?


9

Я розробляю 2D космічну гру для мобільних пристроїв, але вона стає дуже складною, і моє рішення дуже заплутане і створює безліч повторних сегментів коду.

Я хава світового класу, в якому у мене є множинні списки різних об'єктів, таких як:

List<Enemy> enemys;
List<Projectile> projectiles;
List<Collectable> collectables;
List<Asteroid> asteroids;
List<Effect> effects;
..

Кожен список оновлюється світовим класом. але це ще не все. У кожного ворога є список двигунів, а також список збройових рушників, який ворог оновлює. Тепер кожен двигун додає деякі "вогневі ефекти" до світового списку "ефекти", а кожен зброяр додає снаряди до світового списку "снаряди". Усі ці класи мають різні параметри, тому мені потрібно додаткове оновлення І додаткова функція візуалізації для кожного класу.

Принаймні, всі вони є «GameObject», який надає їм основні речі, такі як вектори позиції, швидкості та прискорення, обмежуючі Полігони та такі функції, як ApplyForce та машина з кінцевим станом

Чи є кращий чи більш поширений спосіб зробити це? як один загальнодоступний клас, який містить усі можливі параметри та методи для всіх різних об'єктів. (я думаю, це призведе до ще більш заплутаного коду)


Це схоже на моє запитання: gamedev.stackexchange.com/questions/22559/… Я пропоную переглянути відповіді, які йому дали.
Дерек

Відповіді:


5

Чи є кращий чи більш поширений спосіб зробити це? як один загальнодоступний клас, який містить усі можливі параметри та методи для всіх різних об'єктів.

Так, це називається а архітектури. Ознайомтесь тут із деталями.

Це дозволить отримати лише один список організацій вашого світового класу:

List<Entity>

Це один із прикладів складу над спадщиною .


3

В межах вашого початкового запитання одним із варіантів було б розбити списки на дії, а не на типи, як у вас. Наприклад, у вас буде " List<HasAI>one for", List<Collidable>і коли ви створюєте новий об'єкт, він додає себе до будь-якого списку дій, який він потребує, коли об'єкт знищений, то він видаляє себе з цих списків. Об'єкт може бути у кількох списках.

Другий крок цього варіанту полягає в перетворенні класів з ієрархії на той, який використовує інтерфейси, тому тип HasAI - це клас, який реалізує інтерфейс IBrains як приклад. Відповідно, що для List<HasAI>об'єктів потрібен лише інтерфейс IBrains.

Це повинно допомогти очистити деякі складності.


2

Я думаю, що вам потрібно зробити, це абстрагувати візуалізацію в своїх власних класах, я думаю, що один для гравця і один для ворога (або, можливо, лише один для гравця, а потім створити його примірник для гравця та ворога - не на 100% впевнений вашого ігрового дизайну.)

Ви можете використовувати шаблон відвідувача, щоб дозволити циклу візуалізації навколо різних об'єктів і вирішити, що намалювати, що може бути менш складним.


2

Використовувати базовий клас та покладатися на поліморфізм - дуже гарна ідея. Але є кілька альтернативних підходів. Є дві статті Ноеля Льопіса, які варто прочитати. Останнім часом я дивився на орієнтований на дані дизайн і думаю, що він має деякі заслуги.

Статті тут і тут . Це може трохи спростити ваш код, ніж поліморфізм. Але як і все, що стосується YMMV, погляньте і переконайтеся, чи відповідає воно тому, що ви намагаєтесь досягти. Поліморфізм використовує спадщину, а DOD використовує агрегацію як плюсів, так і мінусів, тому вибирайте свою отруту.


1

Можна, використовуючи ООП і особливо поліморфізм.

В основному, ви повинні створити базовий клас, від якого успадковуються всі ігрові об'єкти. Цей базовий клас є максимально абстрактним, він буде містити такі речі, як створення, оновлення та, можливо, зруйнувати функцію.

Тоді ви отримуєте всі ваші інші ігрові об’єкти з цього класу. Можливо, вам також потрібно буде додати якесь відображення у свій код, якщо ваша мова не підтримує його, щоб зробити якісь більш досконалі речі, але це уникнути, якщо ви вмієте правильно структурувати свою спадщину.


1
Він це вже робив - усі його класи - це діти GameObject. Йому просто потрібно перетворити свою серію списків в єдиний список GameObjects.
ДеякіГой
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.