Я сподіваюся, що ці сутички дадуть зрозуміти моє запитання - я б повністю зрозумів, якщо вони не збираються, тому повідомте мені, чи це так, і я спробую зробити себе зрозумілішим.
Зустріньте BoxPong , дуже просту гру, яку я зробив для ознайомлення з об'єктно-орієнтованою розробкою гри. Перетягніть коробку, щоб керувати м'ячем і збирати жовті речі.
Створення BoxPong допомогло мені сформулювати, між іншим, фундаментальне питання: як я можу мати об’єкти, які взаємодіють один з одним, не маючи «належати» один одному? Іншими словами, чи існує спосіб, щоб об’єкти не були ієрархічними, а натомість співіснували? (Я детальніше опишуся нижче).
Я підозрюю, що проблема співіснуючих об'єктів є загальною, тому, сподіваюся, існує усталений спосіб її вирішити. Я не хочу винаходити квадратне колесо, тому, мабуть, ідеальна відповідь, яку я шукаю, - ось ось схема дизайну, яка зазвичай використовується для вирішення вашої проблеми.
Особливо в таких простих іграх, як BoxPong, зрозуміло, що на одному рівні існує декілька предметів, які співіснують на одному рівні. Там коробка, там кулька, є колекціонування. Все, що я можу виразити об'єктно-орієнтованими мовами, хоча - або так здається - є суворими відносинами HAS-A . Це робиться за допомогою змінних членів. Я не можу просто запустити ball
і нехай він робить свою справу, мені потрібно, щоб він постійно належав до іншого об’єкта. Я встановив це так, щоб основний ігровий об’єкт мав ящик, а коробка в свою чергу має м'яч і має лічильник рахунків. Кожен об’єкт також маєupdate()
метод, який обчислює положення, напрямок тощо, і я йду схожим шляхом: я називаю метод оновлення основного ігрового об'єкта, який викликає методи оновлення всіх його дітей, а вони, в свою чергу, називають методи оновлення всіх своїх дітей. Це єдиний спосіб я бачу зробити об'єктно-орієнтовану гру, але я вважаю, що це не ідеальний спосіб. Зрештою, я б не вважав, що м'яч належить до коробки, а як те, що він знаходиться на одному рівні та взаємодіє з ним. Я припускаю, що цього можна досягти, перетворивши всі ігрові об’єкти в членські змінні основного ігрового об’єкта, але я не бачу, щоб це вирішило нічого. Я маю на увазі ... залишаючи осторонь очевидний безлад, як би існував спосіб, коли м'яч і коробка пізнавали один одного , тобто взаємодіяли?
Існує також проблема об’єктів, які потребують передачі інформації між собою. У мене є чималий досвід написання коду для SNES, де ви весь час маєте доступ практично до всієї ОЗУ. Скажіть, ви створюєте спеціальний ворог для Super Mario World , і ви хочете, щоб він видалив усі монети Маріо, а потім просто збережіть нуль, щоб отримати $ 0DBF, без проблем. Немає обмежень, які говорять про те, що вороги не можуть отримати статус гравця. Я думаю, що мене зіпсувала ця свобода, тому що за допомогою C ++ і подібних мені часто стає цікаво, як зробити цінність доступною для інших об'єктів (або навіть глобальних).
Використовуючи приклад BoxPong, що робити, якщо я хотів, щоб м'яч відскочив від країв екрана? width
і height
є властивостями Game
класу,ball
мати доступ до них. Я міг би передавати такі значення (або через конструктори, або через методи, де вони потрібні), але це просто кричить на мене погану практику.
Я думаю, що моя головна проблема полягає в тому, що мені потрібні об'єкти, щоб пізнати один одного, але єдиний спосіб, який я бачу, це зробити - це сувора ієрархія, яка некрасива і непрактична.
Я чув про "класи друзів" на C ++ і свого роду знаю, як вони працюють, але якщо вони є кінцевим рішенням, то як я не бачу friend
ключових слів, розлитих у кожному проекті C ++, і як з'являються Концепція не існує в кожній мові ООП? (Те саме стосується функціональних покажчиків, про які я нещодавно дізнався.)
Заздалегідь дякую за будь-які відповіді - і знову, якщо є частина, яка не має для вас сенсу, повідомте мене.