Java中的不同游戏状态

Java中的不同游戏状态,java,Java,我正在尝试用Java制作一个游戏——目前只是一个简单的游戏。创建不同游戏状态的最佳方法是什么?我应该为每个状态分别创建一个类,每个类都有一个paint()方法吗?另外,我应该如何在状态之间切换?我建议使用枚举来保存状态,并使用一些StateManager类来保存游戏的状态。然后,您可以轻松地使用switch-语句检查不同的状态,并让每个状态都有自己的绘制和更新方法 StateManager应该在任何地方都可以访问,因为您可能需要多次询问游戏状态:if(暂停| | gameOver)最优雅的方法是

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

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


StateManager应该在任何地方都可以访问,因为您可能需要多次询问游戏状态:
if(暂停| | gameOver)

最优雅的方法是创建一个。JVM中每个状态只有一个实例,而且是免费的。另一方面,是实现状态机的更传统的方法。我会推荐第一种方法,第二种方法更“老派”,但它运行和常用

不能用Java精确地注释,但我过去处理状态的方式是为每个状态使用单独的类。它们都从基态继承,并由堆栈管理

在伪c#-

每个状态都可以阻止以下状态的更新和绘制

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);
        }
    }
}
公共类GameStateManager
{
公共联系国;
公共无效更新()
{
//更新顶部状态
更新(States.Top);
}
私有无效更新(节点状态)
{
state.Value.Update();
//如果当前状态未阻塞,则向下移动堆栈
如果(!state.Value.BlockUpdate)
{
更新(state.Next);
}
}
公众抽签()
{
绘制(States.Top);
}
专用空心绘制(节点状态)
{
state.Value.Draw();
如果(!state.Value.BlockDraw)
{
绘制(state.Next);
}
}
}
管理器中的想法只是更新或绘制顶部状态。然后,如果当前状态没有阻塞,它将递归地从堆栈中退出。通过这种方式,你可以弹出一个暂停状态来阻止更新,而不是平局(比如你想让游戏在暂停窗口后部分可见)。或者另一个弹出窗口将阻止抽签,但不会更新-这允许游戏继续,但节省抽签时间

您将状态推送到堆栈上并弹出,因此在播放时,它可能如下所示:

  • 游戏状态
  • Titlemenuate
  • 开筛

PlayState将阻止对其下方所有内容的绘制和输入。假设用户暂停,则按下PauseState按钮,该按钮将阻止其下方的更新。如果他们退出菜单,您将弹出到TitleMenuState。

我不建议您自己这样做。在许多其他功能中,有一些游戏引擎支持这一点。除非你这样做是为了教育目的,并想建立自己的游戏引擎。如果你的目标是制作一个游戏,那么最好使用第三方库

我用。它是LWJGL的包装器,提供了很多特性。其中包括游戏状态。它很容易使用,免费,并且它的作者在论坛上很活跃,并且提供帮助和bug修复。我推荐它

这里是如何
还有一些教程向您展示了如何制作完整的游戏:

如果没有更多关于这些状态的含义以及切换发生的时间和原因的信息,这个问题无法得到有意义的回答。请查看,我建议为抽象的“游戏状态”和“显示状态”保留单独的数据结构。游戏状态跟踪游戏中发生的事情(玩家健康、分数、物品等),显示状态跟踪游戏状态如何呈现给用户。然后,显示状态可以改变模式(第一人称、概览、统计等),而与游戏的进行方式无关。您甚至可以同时进行多个游戏显示(例如,平视叠加);因为它们是从游戏状态驱动的,所以你不必担心它们之间的协调。很酷,非常感谢。这看起来是一个非常有前途的包装使用!然而,预先制作的游戏引擎有很多缺点。有时他们的许可会给你带来问题,而有时他们内部有一个bug,导致你从用户那里得到过多的bug报告,即使你不使用不同的游戏引擎也无法修复这个bug,仅仅因为开发者停止更新你使用的游戏引擎,顺便说一句,这很可能是封闭源代码。
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);
        }
    }
}