1

私は単純なゲームを作成しています。プレーヤーは基本的に左右に移動するキャラクターを操作して、危険な岩を避け、さまざまな宝石を捕まえてポイントを上げようとします。

ただし、オブジェクト指向の設計を練習しようとしているので、MVC レイアウトを使用しようとしています。

これが私が持っているものです。問題なくこれを行うのはこれが初めてなので、うまくいけば私はこれを間違っています:p:

  1. 画面に表示されるすべてのオブジェクトを保持する GameScreen クラスがあります。
  2. すべてのアニメーションとレンダリング、およびカメラを処理する WorldRenderer クラスがあります。
  3. 最後になりましたが、ユーザーからのすべての入力を処理する Controller クラスです。

これですべてが機能し、ゲーム画面がオブジェクトを作成し、レンダラーがオブジェクトの状態とユーザー入力に従って機能します。したがって、すべてがうまく連携します。

たとえば、A を押すと、コントローラーは Jim (キャラクター) を WALKING STATE に変更し、彼が左を向いている場合はブール値を true に変更します。コントローラーはワールド レンダラーに A が押されたことを伝え、A までテクスチャを反転して描画します。 D が押された場合、ワールド レンダラーに reflip などを指示します。何も押されていない場合、Jim をアイドル状態に設定し、アイドル テクスチャを描画します。

それでは、コードをチェックしてみましょう....笑ってください:D:

// Draw textures/sprites
    batch.begin();
    if (GameScreen.jim.currentState == 1) {
        if (GameScreen.jim.facingLeft
                && !GameScreen.jim.sprites[1].isFlipX()) {
            for (int i = 0; i < GameScreen.jim.sprites.length; i++) {
                GameScreen.jim.sprites[i].flip(true, false);
            }
        } else if (!GameScreen.jim.facingLeft
                && GameScreen.jim.sprites[1].isFlipX()) {
            for (int i = 0; i < GameScreen.jim.sprites.length; i++) {
                GameScreen.jim.sprites[i].flip(true, false);
            }

        }
        batch.draw(GameScreen.jim.currentFrame, GameScreen.jim.bounds.x,
                GameScreen.jim.bounds.y, GameScreen.jim.bounds.getWidth(),
                GameScreen.jim.bounds.getHeight());
    }
    if (GameScreen.jim.currentState == 0) {
        if (GameScreen.jim.facingLeft && !GameScreen.jim.jim0.isFlipX()) {
            GameScreen.jim.jim0.flip(true, false);
        } else if (!GameScreen.jim.facingLeft
                && GameScreen.jim.jim0.isFlipX()) {
            GameScreen.jim.jim0.flip(true, false);
        }
        batch.draw(GameScreen.jim.jim0, GameScreen.jim.bounds.x,
                GameScreen.jim.bounds.y, GameScreen.jim.bounds.getWidth(),
                GameScreen.jim.bounds.getHeight());
    }
    batch.end();

ええ、その完全なニックネームを見てください。これは非常にうまく機能します。壊れていないものは修正しないでください。さらに学習するまでこのコードを修正しませんが、何が改善されるかを知ることは良いことです。私はこれらすべてが好きではありません:

GameScreen.jim.jim0, GameScreen.jim.bounds.x,
                GameScreen.jim.bounds.y,

私は常に GameScreen を参照して Jim にアクセスし、次に作成された Jim の変数、フィールド配列などを参照する必要があります。これはおそらく恐ろしいコーディング方法であるだけでなく、まったく恐ろしいものに見えます:)。

今、私は、GameScreen を直接参照できる場合、どうすれば Jim クラスに対してそれを行うことができず、代わりに次のことを行うことができるかを考えていました。

Jim.jim0;

Jim は元気で何もないため、これは null 例外をスローします。私は彼を作成していません。

クラスのトップでこれを行うと、次のようになります。

Jim jim;

そして、次を使用します。

jim.jim0;

まだ null 例外です。

これには get メソッドを使用する必要がありますか? 作成した Jim に到達する前に GameScreen を最初に参照する必要がないようにするにはどうすればよいでしょうか? これは不可能ですか?

テキストの壁で申し訳ありません。十分な情報を用意して、私が何をしているのかを説明してください。

4

1 に答える 1