Java中的不同游戏状态

时间:2011-02-14 21:21:24

标签: java

我正在尝试用Java制作游戏 - 现在只是一个简单的游戏。创建不同游戏状态的最佳方法是什么?我应该为每个州都有一个单独的类,每个都有一个paint()方法吗?另外,我应该如何在状态之间切换?

4 个答案:

答案 0 :(得分:3)

无法用Java完全评论,但我过去处理状态的方式是每个州都有一个单独的类。它们都从基本状态继承并由堆栈管理。

在伪c# -

abstract class GameState
{
    public bool BlockDraw = true;
    public bool BlockUpdate = true;

    abstract void Update();
    abstract void Draw();
}

每个州都可以阻止以下州的更新和抽签。

public class GameStateManager
{
    public LinkedList<GameState> States;

    public void Update()
    {
        // Update the top state
        Update(States.Top);
    }

    private void Update(Node<GameState> state)
    {
        state.Value.Update();

        // Move down the stack if the current state is not blocking
        if (!state.Value.BlockUpdate)
        {
            Update(state.Next);
        }
    }

    public void Draw()
    {
        Draw(States.Top);
    }

    private void Draw(Node<GameState> state)
    {
        state.Value.Draw();

        if (!state.Value.BlockDraw)
        {
            Draw(state.Next);
        }
    }
}

经理的想法只是顶级状态得到更新或绘制。然后,递归地,如果当前状态没有阻塞,它会逐步降低堆栈。这样,您可以弹出暂停状态以阻止更新,但不会绘制(假设您希望游戏在暂停窗口后部分可见)。或者另一个弹出窗口将阻止绘制,但不会更新 - 这样可以让游戏继续,但可以节省绘图时间。

你将状态推送到堆栈,所以在播放时它看起来像这样:

  • PlayState
  • TitleMenuState
  • OpeningScreenState

PlayState会阻止绘制并输入其下面的所有内容。假设用户暂停,您按下阻止其下方更新的PauseState。如果它们退出菜单,则弹出TitleMenuState。

答案 1 :(得分:2)

我建议使用Enum来保存状态和一些StateManager类,这样可以保持游戏的状态。然后,您可以轻松地使用switch - 语句来检查不同的状态,并让每个州都有自己的绘制和更新方法。

StateManager应该可以在所有地方访问,因为你想要多次询问游戏状态:if(paused || gameOver)

答案 2 :(得分:2)

最优雅的方法是创建enum state machine。 JVM中每个州只有一个实例,它是免费的。另一方面,here是实现状态机的更常规方式。我会建议第一种方法,第二种方法是更“旧学校”,但它运行并且它是常用的。

答案 3 :(得分:2)

我不建议你自己这样做。有一些游戏引擎可以支持这个功能。除非你出于教育目的这样做,并希望建立自己的游戏引擎。但是,如果您的目标是制作游戏,那么使用第三方库最适合您。

我使用Java Slick。它是LWJGL的包装器,提供了许多功能。其中的游戏状态。它易于使用,免费,并且它的作者在论坛上是活跃的,并提供帮助和错误修复。我推荐它。

以下是game states work in slick的方法 here是一些教程,向您展示如何制作完整的游戏: