2

我对一些班级组织有一点困境(我一直不擅长)。我有一个使用 LWJGL 库在 Java 中构建的乒乓球游戏。到目前为止,我已经上了三个班。我有一个 Startup 类,一个一切都开始的类(这显示窗口),一个 InputHandler(处理来自用户的输入的类)和一个 Player 类。我想要播放器移动方法,moveUp()moveDown()进入播放器类。这些方法由InputHandler接受向上箭头和向下箭头输入并根据输入移动播放器块的类。一个问题。我在播放器块的哪里写?我会在启动时写它,所以它可以显示在屏幕上吗?我会把它写到 Player 类中吗?或者我什至会将它写入 InputHandler 类,以便可以通过键盘移动来控制它?我将在下面发布所有三个课程。他们都很短。请随时指出我可能没有发现的任何其他缺陷。我对 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;
        }
    }
}

在不相关的注释中,您需要将 OpenGL 设置代码(GL11.glMatrixMode(GL11.GL_PROJECTION);等)从主循环下方向上移动。在完成任何其他渲染之前,需要调用这些东西。

于 2013-07-14T04:49:55.137 回答
1

如果球员挡板是与球相撞的桨,则将其放入Player类中。

Player可能是矩形桨、移动速度和分数吧?由于一个类只是一组具有某些行为的相关项目,因此将玩家块放置在Player.

另一个提示,除非您打算用 做一些更复杂的事情,否则请InputHandler删除它。这将InputHandlerPlayer.

解耦只是意味着一个类依赖于另一个类。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 回答