游戏建筑与国家设计

时间:2014-05-21 00:05:17

标签: java game-engine state

这可能是一个非常广泛的问题,但我想知道在Java中构建和设计具有多个状态的游戏的最佳方法是什么。

我已经开始设计一个具有多种状态的战舰游戏(AI与人工智能,人与人等等)。

看起来像这样:

Imgur

不幸的是,由于游戏所需的状态逻辑和资源的多重变化,我的代码变得非常混乱和混乱。我想找到一种更好的方法来清理我的代码,并以一种易于维护且不那么复杂的方式进行组织。

那么为这样的游戏保持良好设计的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以同时使用inheritancecomposition来解决此问题。我假设您有一个主要的游戏类或级别类,您想要存储这些数据。您可能希望创建一个名为GameState的接口,并创建所有子类(AI vs AI,Human vs Human,等等...)。然后将一个变量添加到您的关卡类:

class MainGame{
    GameState state;

    public MainGame(){
        state = new HumanVsHumanState();
    }
    public void update(){
        state.update();
    } 
    //etc...
}

答案 1 :(得分:0)

我特别喜欢FlashPunk 2D游戏引擎提供的抽象。在此框架中,您可以识别以下抽象:

  • Context(用于访问全局属性和函数的静态类)
  • 引擎(主要游戏类)
  • 世界(每种可能的游戏状态)
  • 实体(每个世界中的对象)

在此之后,代码将如下所示:

class MyGame extends Engine {
    MyGame() {
        // Here we code high level setup
        Context.world = new MenuWorld()
    }
}

class MenuWorld extends World {
    MenuWorld() {
        // Here we add the elements of the menu
        this.add(new CompCompButton());  
        this.add(new HumanHumanButton());
    }
}

class CompCompButton extends Entity {
    CompCompButton() {
        // Here we setup button properties
    }

    // This is a callback function that is automatically called by the framework.
    void Update() {
        if (Input.mousePressed()) {
            onClick();
        }
    }

    void onClick() {
        Context.world = new CompCompWorld();
    }
}

注意使用静态Context类。这个类应该实现渲染新世界的所有逻辑。

HumanHumanButton类实现与CompCompButton类基本相同。唯一的区别是onClick函数现在将当前世界更改为HumanHumanWorld。实际上,您可以实现通用Button类,然后对其进行扩展以获得更清晰的代码。

您可以在其网站上阅读有关FlashPunk的更多信息。寻找Java游戏引擎也是值得的,有一个名为LWJGL,但由于我没有使用它,所以我什么都不知道。

希望有所帮助。