在java中分离逻辑和GUI

时间:2014-04-30 07:50:36

标签: java

我正在用Java实现一个游戏,使用下面显示的类来控制游戏逻辑。在解释我的问题时我会非常清楚。

  • 的GamePanel

    • 我使用这个类用线程启动游戏循环(仅游戏循环

      public void run() {
      init(); //initialize gamePanel components
      // game loop
      while (running) {
            start = System.nanoTime();
            gameManager.update();
            KeyInput.update();
            MouseInput.update();
            gameManager.draw(graphic);
            Graphics g2 = getGraphics();
            g2.drawImage(image, 0, 0, null);
            g2.dispose();
      
            elapsed = System.nanoTime() - start;
            wait = targetTime - elapsed / 1000000;
            if (wait < 0)
          wait = 5;
           try {
               Thread.sleep(wait);
           } catch (Exception e) {
           e.printStackTrace();
         }
      
      }
      
  • GameManager

    • 我让这个课程控制游戏的每个方面为(更新,图形)

      private void loadState(int state) {
      
      if (state == States.MENU.getValue())
      gameState = new Menu(this);
      else if (state == States.GAME.getValue())
      gameState = new Game(this);
      else if (state == States.PATHSELECT.getValue())
      gameState = new SelectPath(this);
      }
      public void update() {
      if (gameState != null)
      gameState.update();
      }
      
      public void draw(java.awt.Graphics2D graphic) {
       if (gameState != null)
      gameState.draw(graphic);
       else {
      JOptionPane.showMessageDialog(null, JOptionPane.ERROR_MESSAGE);
           }
      }
      
  • 游戏状态

    • GameState是一个抽象类,它接收构造函数参数作为GameManager的一个实例,它在每个GameState (菜单,游戏,MultiPlayer等)中实现抽象方法

    • 这个类有这些抽象方法:

      • controller() - &gt;验证状态逻辑

      • 更新() - &gt;如果currentState是一个MultyPlayer,这个方法调用类Player等的更新方法......

      • 绘制(图形g) - &gt;绘制以屏蔽currentState的对象

我想过制作一个实用程序类单例,它实现了每个状态的所有draw(), 但是在一个班级中插入所有内容是非常讨厌的。

示例:

而不是致电gameState.draw(graphic);我致电Render.getRenderInstance().draw(graphic,gameState); 这个解决方案有效,但我不喜欢它。

那么如何以一种漂亮的方式将绘制方法与其余逻辑分开?

一些建议?谢谢。

1 个答案:

答案 0 :(得分:3)

通常的做法是将游戏分为两部分:

  • 逻辑,在您的情况下看起来没问题

  • 绘制事物的场景

这里的伪代码就是我这样做的:

the main loop:
  gamestate.update()
  scene.render();

在场景中,您应该拥有所有图形操作。您应该能够使用类似于此的调用将新图形添加到场景中:

scene.addObject(SomeGraphic graphic);

因此场景会在每次主循环迭代时渲染该图形。

要发生这种情况,您应该在Scene类中保留一个列表或另一个集合,并在每个tick中呈现每个对象。所以实际的scene.render()看起来像这样:

public void render() {
  for(SomeGraphic graphic : objects) {
    graphic.draw()
  }
}

然后,您将能够从游戏逻辑中控制场景中的内容 - 您将能够添加和删除对象等。