2

私はいくつかのクラス組織に少し苦境に陥っています (私がいつも苦手だったものです)。LWJGL ライブラリを使用して Java で構築している卓球ゲームがあります。現在3クラスあります。Startup クラス、すべてが開始されるクラス (ウィンドウが表示されます)、InputHandler (ユーザーからの入力を処理するクラス)、および Player クラスがあります。Player move メソッドが必要でmoveUp()moveDown()player クラスに入ります。これらのメソッドは、InputHandler上矢印と下矢印の入力を受け取り、入力に基づいてプレイヤーブロックを動かすクラス。一つの問題。プレーヤーブロックのどこに書きますか? 画面に表示できるように、起動時に書きますか?Player クラスに記述しますか? それとも、キーボードの動きによって制御できるように、InputHandler クラスに書き込むことさえできますか? 以下に3つのクラスすべてを投稿します。それらはすべてかなり短いです。私が見つけていないかもしれない他の欠陥を指摘してください。私は Java はかなり初めてで、LWJGL は信じられないほど初めてです。

スタートアップ クラス:

public class Startup {

    // set up display
    public void start() {
        try {
            Display.setDisplayMode(new DisplayMode(600, 400)); // these numbers pending
            Display.setTitle("Evan's Pong!");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }

        while (!Display.isCloseRequested()) {
            // render OpenGL here
            handler.handleInput();  
            Display.update();
            Display.sync(60);
        }

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, 600, 4, 0, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);


        Display.destroy();
    }


    // Let's start this beyotch up!
    InputHandler handler = new InputHandler();

    public static void main(String[] args) {
        new Startup().start();
    }
}

入力ハンドラ:

public class InputHandler {

    /*
     * create a new player object. This is for the player's paddle that will
     * move up and down to block the ball
     */
    Player player = new Player();

    // testing input for now!
    public void handleInput() {
        if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
            // System.out.println("going up.");
            player.moveUp();
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
            // System.out.println("going down");
            player.moveDown();
        }
    }
}

プレイヤークラス:

public class Player {

    private int moveSpeed = 10; // mph

    public void moveUp() {
        // move up
    }

    public void moveDown() {
        // move down
    }
}
4

2 に答える 2

1

この質問に対する唯一の正解はありませんが、私なら次のようにします。

  1. InputHandler を失います。
  2. 入力をチェックして内部位置変数を変更するフレームごとに呼び出されるメソッドをプレーヤーで作成します。
public class Player {
    private int moveSpeed = 10; // mph
    private int position = 128; // Or whatever would be centered.

    public void update() {
        if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
            position += moveSpeed;
        } else if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
            position -= moveSpeed;
        }
    }
}

GL11.glMatrixMode(GL11.GL_PROJECTION);無関係なメモとして、OpenGl セットアップ コード (など) をメイン ループの下から上に移動する必要があります。他のレンダリングが行われる前に、そのようなものを呼び出す必要があります。

于 2013-07-14T04:49:55.137 に答える
1

プレーヤーのブロックがパドルでボールに衝突する場合は、Playerクラスに入れます。

Playerおそらく長方形のパドル、移動速度、そしてスコアですよね?クラスは、何らかの動作を伴う関連アイテムの単なるグループであるため、プレーヤー ブロックを に配置するのが最も理にかなっていますPlayer

もう 1 つのヒントとして、 でもっと複雑なことをする予定がない限りInputHandler、これを削除してください。InputHandlerこれにより、 から切り離されPlayerます。

デカップリングとは、あるクラスが別のクラスに依存していることを意味します。InputHandleronの依存関係は、Player変更する場合、変更Playerが必要になる可能性があることを意味しますInputHandler。デカップリングが望ましい。ソフトウェア設計の専門用語を知っていることも役に立ちます。;)

コードを削除するInputHandlerと、次のようになります。

while (!Display.isCloseRequested()) {
    // render OpenGL here
    handleInput();
    Display.update();
    Display.sync(60);
}
public void handleInput() {
    if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
        player.moveUp();
    }
    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
        player.moveDown();
    }
}

後でキーボード入力に依存しないPlayer敵が必要になるため、キーボード入力をチェックするこのアプローチを好みます。Player

于 2013-07-14T04:50:08.070 に答える