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