これらのとりとめのない質問で私の質問が明確になることを願っています。ただし、そうでない場合は完全に理解できます。その場合はその旨をお知らせください。さらに明確にしていきます。
オブジェクト指向のゲーム開発に精通するために私が作成した非常に単純なゲームであるBoxPongに出会ってください。ボックスをドラッグしてボールを操作し、黄色い物を集めます。
BoxPongを作成することは、とりわけ、基本的な質問の策定に役立ちました。互いに「所属する」必要なしに、互いに対話するオブジェクトをどのようにして持つことができますか?言い換えれば、オブジェクトが階層的ではなく、代わりに共存する方法はありますか?(以下でさらに詳しく説明します。)
オブジェクトの共存の問題はよくある問題だと思うので、解決する確立された方法があるといいのですが。私は四角いホイールを作り直したくないので、私が探している理想的な答えは「ここに、あなたの種類の問題を解決するために一般的に使用される設計パターンがある」と思います。
特にBoxPongのような単純なゲームでは、同じレベルで少数のオブジェクトが共存している、または共存している必要があることは明らかです。箱があり、ボールがあり、収集品があります。オブジェクト指向言語で表現できるのは、厳密なHAS-A関係だけですが、そうです。これは、メンバー変数を介して行われます。私は単に始めてball
それを実行させるだけではなく、永久に別のオブジェクトに属している必要があります。メインのゲームオブジェクトは、そのので、私はそれを設定した持っているボックスを、ひいてはボックスがありたボールを、そして持っているスコアカウンターを。各オブジェクトには、update()
位置、方向などを計算するメソッドと同じように移動します。メインのゲームオブジェクトのupdateメソッドを呼び出します。このメソッドは、すべての子のupdateメソッドを呼び出し、次に、すべての子のupdateメソッドを呼び出します。これがオブジェクト指向のゲームを作るために私が見ることができる唯一の方法ですが、それは理想的な方法ではないと感じています。結局のところ、私はボールをボックスに属していると正確に考えるのではなく、同じレベルにいて、それと相互作用していると考えています。これは、すべてのゲームオブジェクトをメインゲームオブジェクトのメンバー変数に変換することで実現できると思いますが、何も解決しないと思います。つまり...明らかな混乱をさけて、ボールとボックスがどのようにしてがお互い知る、つまり相互作用か?
また、オブジェクト間で情報を渡す必要があるという問題もあります。私はSNESのコードを書くのにかなりの経験があります。そこでは、実質的に常にRAM全体にアクセスできます。スーパーマリオワールドのカスタム敵を作成していて、マリオのコインをすべて削除して、ゼロを格納して$ 0DBFに対処したいとします。問題ありません。敵がプレイヤーのステータスにアクセスできないという制限はありません。C ++などでは、他のオブジェクト(またはグローバル)から値にアクセスできるようにする方法に疑問を感じることが多いので、私はこの自由に甘やかされていると思います。
BoxPongの例を使用して、ボールが画面の端から跳ね返るようにしたい場合はどうなりますか?width
そして、height
のプロパティであるGame
クラスは、ball
それらにアクセスできるようにします。これらの種類の値を(コンストラクターまたは必要なメソッドを介して)渡すこともできますが、それは私にとって悪い習慣であるだけです。
私の主な問題は、お互いを知るためにオブジェクトが必要であるということですが、それを行うために私が見ることができる唯一の方法は、厳密な階層であり、これは醜く非実用的です。
私はC ++の「友達クラス」について聞いたことがありますが、それらがどのように機能するかは知っていますが、それらが最終的な解決策である場合、どうして表示されないのですか friend
すべてのC ++プロジェクト全体にキーワードが注がれて概念はすべてのOOP言語に存在するわけではありませんか?(私が最近学んだばかりの関数ポインターについても同じことが言えます。)
あらゆる種類の回答を事前にありがとう—そして、あなたに意味をなさない部分があれば、私に知らせてください。