我正在尝试用Java制作游戏 - 现在只是一个简单的游戏。创建不同游戏状态的最佳方法是什么?我应该为每个州都有一个单独的类,每个都有一个paint()方法吗?另外,我应该如何在状态之间切换?
答案 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会阻止绘制并输入其下面的所有内容。假设用户暂停,您按下阻止其下方更新的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是一些教程,向您展示如何制作完整的游戏: