Чтобы применить свои знания ООП, я делаю игру в понг на javascript (я знаю, я знаю, это все равно что играть в Stairway to Heaven в магазине гитар). У меня было несколько функционирующих версий игры, в которых реализовано несколько различных техник, включая ООП на основе прототипа и функциональный стиль. Однако я не делаю это, чтобы получить функциональную игру, я делаю это, чтобы учиться.
Я использую html5 canvas и обычный старый javascript, без фреймворков (хорошо, немного jQuery для захвата клавиатуры). У меня был объект Pong, который представлял мою игру. Понг имел атрибут ctx
, который содержал ссылку на контекст canvas.getContext("2d")
. Он также имел атрибуты player1
, player2
и ball
для хранения, вы знаете что. Когда был создан экземпляр мяча и двух игроков, контекст был передан их конструктору, чтобы они тоже могли содержать ссылку на контекст для использования в своих draw(ctx)
методах. У Понга был метод draw()
, который вызывался с использованием setInterval(this.draw, 10)
. Метод ничьей Понга вызвал бы метод ничьих двух игроков и мяча.
Мне не нравится, что оба игрока и мяч имеют контекст в качестве атрибута. Им не принадлежит контекст, и поэтому он не должен быть атрибутом. Однако природа использования javascript и canvas заключается в том, что это лучший способ. Кто или что должно владеть контекстом в этой ситуации? В идеале я бы не хотел, чтобы у игроков и мячей вообще был объект для рисования. Я чувствую, что у них должны быть атрибуты, которые описывают их геометрию и положение, и отдельный объект должен быть поставлен перед их отображением на экране. Таким образом, если бы в будущем я решил, что хочу использовать
вместо canvas, я мог бы просто изменить объект рендеринга, и все остальное было бы забыто.
Я знаю, что делаю игру Pong на javascript более сложной, чем должна быть, но я хочу практиковать приемы и действительно впитывать концепцию ООП, но каждый раз, как мне кажется, я решаю ее совершенно новую проблему, созданную мое «решение» представляет себя.
РЕДАКТИРОВАТЬ: Если это помогло бы, если бы вы любопытный на мой код, вот (почти) полностью рабочая версия:
library.js - http://mikemccabe.me/tests/pong.archive.14.06.11/library.js
pong.js - http://mikemccabe.me/tests/pong.archive.14.06.11/pong.js
Попробуйте - из http://mikemccabe.me/tests/pong.archive.14.06.11/