0

少し前に、自分が作成しているアプリケーションのクラス図を投稿しました。いくつかの役立つヒントを得て、仕事に行きました。確かにデザインするのは難しいです!とにかく、私はバージョン2.0を作成しましたが、他のことに遭遇しました。たぶん誰かが私のクラス図に関するポインタ、コメント、またはアドバイスを与えることができます:-)

スペースインベーダーアーキテクチャV.2.0

最初に、 Sprite抽象クラスの一部としてSomeInterfaceに「Speed」がありました。検討の結果、これは「スピード」を置くのに最適な場所ではないと思いました。あまり良くないことは、インターフェイスに適切な名前を付けることができなかったことと、プロパティであるため、属性または操作コンパートメントのどこに「速度」を配置するかがわからなかったことです...

各オブジェクト(弾丸、侵入者、船)は独自の速度で移動するため、「速度」をインターフェイスに配置します。すべてのオブジェクトはスーパークラスSpriteを継承し、Update()メソッドのみをオーバーライドします。Bullet抽象クラスは、Spriteから取得したUpdateメソッドでは何もしません。そこから取得したことを示すためだけにあります。これが正しい方法であるかどうか、またはそれを省略して、それをオーバーライドするクラスでのみ表示する必要があるかどうかはわかりません。

対処方法がわからないもう1つの問題は、侵入者によって行われるアニメーションです。次のプロパティを取得しました:SheetSize、FrameSize、およびCurrentFrame。シートにはエイリアンの写真(パラパラマンガなど)が含まれ、FrameSizeはシート上のフレームだけを選択するためのものであり、CurrentFrame...は現在のフレームを保持します。ShipとBulletはアニメートしないため、これらのプロパティは役に立ちません。それらをどこに置くか?

最後に、IBulletBehaviorを実装する場所がありませんでした。最初に、各弾丸の動作にIBulletBehaviorを実装させましたが、抽象Bulletクラスに実装させるように切り替えました。どちらを取るかを決めるルールはありますか?

4

1 に答える 1

0

抽象クラスは、クラスとは何かを記述します。メソッド呼び出しの実際の機能を実装する必要はないので、BulletクラスのBulletに関するすべてを実装する必要があるとは思わないでください。また、インターフェースは、クラスの機能を説明するのに最適です。抽象クラスは何かが何であるか(Is-A)を示し、インターフェースはクラスが何ができるかを記述します。

(これが単なるクラス/インターフェイスの演習なのか、実際にゲームを作成しているのかはわかりません。単なる演習の場合は、次の段落にスキップできます)。SomeInterFaceインターフェースの場合、IMoveableやIMobileのようなものはどうですか?ここでは、数学的なベクトルも見ることができます。インターフェイスを実装しているオブジェクトの外部のオブジェクトがSpeedと相互作用するようにしたい場合を除いて、インターフェイスはSpeedを公開しないでください。代わりに、Move()やDetectCollision()に沿ったものにする必要があります。外部とのやり取りはインターフェースで行われます。つまり、自分に何ができるかを世界に伝えているのです。

最後に、IBulletBehaviorとは何ですか?スプライトが1つである場合、なぜそれを気にする必要がありますか?これは、クラスで何ができるかを説明することに戻ります。弾丸はスプライトですが、IBulletBehavior(それが何であれ)を実装します。すべてのスプライトにIBulletBehaviorを実装しますか?岩や何かをプレイヤーの邪魔にしたいとしたらどうなりますか?これで、指定された動作を実装しないオブジェクトが作成されます。

于 2011-02-21T16:10:53.050 に答える