当涉及到创建球员乒乓球块时,类组织问题



我在一些类组织方面遇到了一些小麻烦(这是我一直不擅长的)。我有一个乒乓球游戏,我正在使用LWJGL库用Java构建。到目前为止,我有三节课。我有一个Startup类、一个所有东西都在其中启动的类(这显示了窗口)、一个InputHandler(处理用户输入的类)和一个Player类。我希望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
    }
}

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

  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);等)从主循环下方向上移动。在完成任何其他渲染之前,都需要调用这些内容。

如果球员拦网是与球碰撞的球拍,则将其放入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

最新更新