创建播放器pong块时的类组织问题

时间:2013-07-14 04:44:06

标签: java class opengl lwjgl 2d-games

我有一些阶级组织的困境(我一直都很擅长)。我有一个使用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();
    }
}

InputHandler:

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
    }
}

2 个答案:

答案 0 :(得分:1)

这个问题没有一个正确答案,但我会做的是:

  1. 丢失InputHandler。
  2. 在每个检查的帧中调用播放器中的方法 输入并更改内部位置变量。
  3. 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);等)。在完成任何其他渲染之前,需要调用这些东西。

答案 1 :(得分:1)

如果一个球员区块是一个与球碰撞的球拍,请将其放入Player级别。

Player可能是一个矩形桨,移动速度和分数对吗?由于课程只是一组具有某些行为的相关项目,因此最有效的方法是将您的播放器块放在Player中。

另一个提示,除非您计划使用InputHandler执行更复杂的操作,否则请将其删除。这会将InputHandlerPlayer分开。

解耦只意味着一个类依赖于另一个类。 InputHandlerPlayer的依赖意味着,如果您更改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