1

私が取り組んでいるゲームでは、1 つのクラスがスプライトを描画するジョブを持ち、別のクラスが座標を操作するジョブを持っています (つまり、スプライトが画面から消えそうになったら、そこで止めます。はい、これは知っています)。はベクトル グラフィックです)。とにかく、両方のクラス間で座標を共有する必要があります。クラス拡張機能を使用してこれを実行しようとしましたが、スーパークラス (スプライトを描画するクラス) がサブクラス (変数を操作するクラス) のインスタンスを作成する必要があるため、スタック オーバーフローが発生しました。

// In the superclass Render
public AnimateMC mc = new AnimateMC( 2 ); // AnimateMC is the subclass of the 
                                             superclass, Render
//later in the program
//code for drawing all of the shapes in the sprite
mc.gravitizeY(); // this is why I need to make an instance of AnimateMC

// In the subclass AnimateMC
// animates sprite by changing the coordinates

1 つのクラスを拡張せずに、2 つのクラス間で整数変数の座標を共有するにはどうすればよいでしょうか。

4

2 に答える 2

4

継承の誤用がこの問題を解決しないことを学びました。代わりに、構成を拡張します。あるオブジェクトから別のオブジェクトにスプライトへの参照を渡し、その参照を操作します。

そのため、スプライトにアクセスする必要があるクラスに Sprite 変数 sprite を与え、setter メソッドを介して Sprite リファレンスを渡します。つまり、

public void setSprite(Sprite sprite) {
   this.sprite = sprite;
}

または、クラスのコンストラクターを介して設定します。

于 2012-07-01T23:00:16.767 に答える
3

これは基本的なモデル ビュー コントローラーの質問です。私の推測では、「コントローラー」の部分が欠落していると思います。ゲーム ロジック (モデル) と表示ロジック (ビュー) の両方を管理し、それらの間でデータを共有する中心的なクラスが必要です。そこにはたくさんのリソースがあります。私がリンクしたウィキペディアの記事は良い出発点です。

あなたの質問の言い方から、オブジェクトの継承についてまだしっかりと把握していないと思います-大丈夫です、完全に単純ではありません-しかし、2つの異なるクラス間でデータを共有するためにオブジェクトを拡張することはほとんどありません、それはあなたがここでやろうとしているように聞こえます.

「このオブジェクトを拡張する必要がありますか?」の一般的な経験則。Has-A 対 Is-A の関係です。基本的に、オブジェクトが他のオブジェクトである場合、一方が他方を拡張する必要があります。そうでない場合は、すべきではありません。Car Is-A Vehicleそう思うCar extends VehicleけどCar Has-A SunroofそうSunroof伸びてはいけないCar。繰り返しますが、詳細についてはリンクをお読みください。

于 2012-07-01T23:11:19.467 に答える