Правильный OO Pong

Как мне создать "правильный" OO Pong?

Идея правильного существа в том, что любой элемент может быть изменен: форма мяча, сундука и весла, добавление препятствий и даже "бонусы", такие как "может вставлять мяч в весло".

Еще два актуальных вопроса:

  • Кто проверяет наличие колонок? и
  • Когда происходит разложение, кто говорит мячу, как отскакивать?

Ответ 1

Я предполагаю, что вы могли бы создать объект физического движка, который вы обновляете непрерывно с заданными временными интервалами. Он будет проверять наличие коллизий, перемещать мяч, вычислять углы отката и т.д.

РЕДАКТИРОВАТЬ № 1: Чтобы добавить немного более подробную информацию, объект "физика игры" сохранит, среди прочего, ссылки на другие игровые объекты, такие как мяч и весла. Объект физики игры будет иметь метод "обновления", который будет вызываться непрерывно по мере запуска игры. Некоторые из шагов, которые этот метод будет выполнять, следующие:

  • Получить текущую позицию весла (которые контролируются игроками).
  • Обновить положение мяча на основе его предыдущей скорости и направления и времени, прошедшего с момента последнего обновления.
  • Обнаружение столкновений с другими объектами (веслами, стенами и т.д.).
  • Подсчитайте скорость и направление мяча на основе любых столкновений.

Несколько идей.

РЕДАКТИРОВАТЬ № 2: Разработать немного больше фокуса OO...

Различные физические объекты, такие как мяч и весла, будут хранить врожденные физические состояния и параметры для себя (положение, скорость, массу и т.д.) как свойства. Объект физической игры будет по существу представлять все уравнения физического движения как методы.

В качестве примера... Предположим, вы хотите моделировать влияние трения воздуха на шар. Объект шара сохранит свойства, такие как "скорость" и "коэффициент сопротивления". Физический объект игры будет иметь метод вычисления силы сопротивления воздуха на объекте путем извлечения необходимых свойств этого объекта и включения их в заданное уравнение перетаскивание жидкости.

Инкапсулируя вещи таким образом, обновления кода могут быть проще. Например, если вы хотите использовать другое уравнение для гидравлического сопротивления, единственное изменение, которое вам нужно сделать, - это соответствующий метод объекта физики игры. Ни один из других объектов не нужно изменять.

Ответ 2

Мне кажется, что суд будет подходящим объектом для проверки или в зависимости от того, насколько сложна логика, отдельный класс для борьбы с столкновениями (т.е. какой-то физический движок, такой как гновиц).

Шары и весла не должны знать друг о друге, так как они не имеют прямого отношения к объектно-ориентированному смыслу. Один не содержит другого, и он не выводится из другого.

Ответ 3

В типичной настройке. Каждый объект получает возможность реагировать на событие столкновения с любым другим объектом, с которым они взаимодействуют. В каком-то кодексе psuedo (python):

class Moveable:
     def Update(self):
          self.move()

class Ball(Moveable):
     def Collide(self, target):
          self.restore() # move out of the bounding box 
                         # of whatever we collided into from 
          self.reflect() # change direction after bouncing
          if target is a Paddle:
              self.speedup() # Make it a little harder after hitting a paddle

class Paddle(Moveable):
     def Collide(self, target):
         if target is a Ball:
             self.AwardSomePoints()

def main_loop():
    ...
    while True:
        for thing_one in Moveables:
            thing_one.Update()

            for thing_two in Moveables:
                if thing_one is not thing_two 
                        and thing_one is touching thing_two:
                    thing_one.collide(thing_two)

Ответ 4

Мне нравится использовать методологию Model-View-Controller, поэтому в этом случае у вас будет игровой контроллер, который будет обрабатывать управление столкновением, но при сверлении он просто контролирует контроллер... это слишком сложно объяснить здесь и я не настолько умный, поэтому проверьте его:

http://en.wikipedia.org/wiki/Model-view-controller