OOP の知識を実践するために、JavaScript で Pong ゲームを作成しています (ギター ショップで Stairway to Heaven をプレイするようなものです)。プロトタイプ ベースの OOP や関数型スタイルなど、いくつかの異なる手法を実装することで、ゲームのいくつかの機能するバージョンを作成しました。ただし、機能的なゲームを取得するためにこれを行っているのではなく、学習するために行っています。
私は html5 キャンバスとプレーンな古い JavaScript を使用しています。ゲームを表す Pong オブジェクトがありました。Pongには、コンテキストctx
への参照を含む属性がありました。canvas.getContext("2d")
また、何を知っているかを保持するためplayer1
のplayer2
and属性もありました。ボールと 2 人のプレーヤーがインスタンス化されると、メソッドball
で使用するコンテキストへの参照を保持できるように、コンテキストがコンストラクターに渡されました。draw(ctx)
Pong には、draw()
を使用して呼び出されるメソッドがありましたsetInterval(this.draw, 10)
。Pong の draw メソッドは、2 人のプレーヤーとボールの draw メソッドを呼び出します。
2 人の選手とボールが属性としてコンテキストを持っているというのは、私には合いません。それらはコンテキストを所有していないため、属性であってはなりません。ただし、javascript とキャンバスを使用する性質上、これが最善の方法のようです。この状況では、誰または何がコンテキストを所有する必要がありますか? 理想的には、プレーヤーとボール オブジェクトに描画オブジェクトをまったく持たせたくないでしょう。ジオメトリと位置を記述する属性が必要であり、専用のオブジェクトがそれらを画面にレンダリングする必要があるように感じます。このようにして、将来、キャンバスの代わりに <div> を使用したいと決めた場合、レンダリング オブジェクトを変更するだけで、他のすべてのことを忘れることができます。
JavaScript Pong ゲームを必要以上に複雑にしていることはわかっていますが、テクニックを練習し、OOP の概念を本当に理解したいと思っていますが、それをクラックしたと思うたびに、私の「ソリューション」によって作成されたまったく新しい問題が発生します。 」が現れます。
編集:私のコードにうるさい人がいると助かる場合は、(ほぼ)完全に機能するバージョンを次に示します。
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/