簡體   English   中英

Java中的不同游戲狀態

[英]Different Game States in Java

我正在嘗試用Java做游戲-現在只是一個簡單的游戲。 創建不同游戲狀態的最佳方法是什么? 我是否應該為每個狀態單獨設置一個類,每個類都帶有paint()方法? 另外,如何在狀態之間切換?

無法使用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);
        }
    }
}

管理器中的想法只是簡單地更新或繪制最高狀態。 然后,如果當前狀態未阻塞,則遞歸地降級堆棧。 這樣,您可以彈出一個暫停狀態以阻止更新,但不能進行抽簽(例如,您希望使游戲在暫停窗口后面部分可見)。 或另一個彈出窗口將阻止繪制,但不會更新-這允許游戲繼續進行,但節省了繪制時間。

您將狀態推入並彈出到堆棧上,因此在播放時看起來可能像這樣:

  • 播放狀態
  • TitleMenuState
  • OpeningScreenState

PlayState會阻止抽獎並將其輸入到其下方的所有內容。 假設用戶暫停,則按下一個PauseState阻止其下的更新。 如果他們退出菜單,則彈出到TitleMenuState。

我建議使用枚舉保存狀態和一些StateManager類,以保留游戲的狀態。 然后,您可以輕松地使用switch語句來檢查不同的狀態,並使每個狀態都有其自己的繪制和更新方法。

StateManager應該在所有位置都可以訪問,因為您可能想多次詢問游戲狀態: if(paused || gameOver)

最優雅的方法是創建一個枚舉狀態機 JVM中每個狀態只有一個實例,並且是免費的。 另一方面, 這里是實現狀態機的更常規的方式。 我建議第一種方法,第二種方法更像是“老派”,但是它運行並且很常用。

我不建議自己這樣做。 編寫了許多支持此功能的游戲引擎。 除非您出於教育目的而這樣做,並且想要構建自己的游戲引擎。 但是,如果您的目標是制作游戲,那么最好使用第三方庫來為您服務。

我使用Java Slick 它是LWJGL的包裝,並提供了許多功能。 其中的游戲狀態。 它易於使用,免費,並且其作者在論壇上都很活躍,並提供幫助和錯誤修復。 我推薦它。

下面是游戲狀態中華而不實的工作這里是你展示如何制作完成的游戲一些教程:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM