2

所以对于我的计算机编程小项目,我们必须用 JAVA 创建一个游戏。他们为我们提供了一个非常简单的引擎式应用程序,它简单地从第一人称视角显示一个 3D 迷宫,用户可以通过该迷宫导航。我们的工作是让它成为一个有敌人的“完整”成熟的 FPS。我们使用 JAVA 和 OpenGL (JOGL)

他们告诉我们使用游戏状态,但从来没有关于这个的讲座,他们的回答是用谷歌搜索。好吧,我在谷歌上搜索的内容有点太复杂了,无法真正掌握我的想法,所以我只会问一些关于州的具体问题。

游戏需要具有暂停和主菜单等状态。但是,我也读到播放器本身也可以具有不同的射击模式等状态。

  1. UML 图或任何包含状态类的图看起来如何?它是一个层次结构,状态类位于顶部吗?

  2. 所有状态都定义在一个状态类中吗?这是一个简单的游戏,所以我们有:射击、暂停、主菜单、冲刺、闪避、健康包。(也许有困难)。

  3. 例如,如果按下 ESC,将触发 UserInput 中的一个方法。我假设我必须以某种方式改变游戏的状态。这是问题 1 的一个子问题。改变游戏状态的干净方法是什么?如,我将如何联系状态类?

都是这些州吗?

这是我们所拥有的 UML 图。 游戏的UML图

4

2 回答 2

1

过去我使用过手动编码的整数(实际上是一个枚举)。

例如:

// "GAME" application state sub states;
private int GAMESTATE;
private static final int INTRO = 0;
private static final int PLAYING = 1;
private static final int OUTRO = 2;

然后基于 GAMESTATE 的值我可以控制游戏代码的分支。

我创建状态的首选方法是创建一个状态管理器类,它允许在需要时实例化新状态,并且可以控制哪些状态是活动的,以及允许哪些有效状态到状态移动(例如,允许intro状态到play状态但不intro表示胜利state

(C++ 的类似示例位于此处,但基于该代码在 java 中实现相同的功能很简单:)

我刚刚找到了一组旧代码,其中包含以下内容(请原谅它大约 10 年前的格式,并且专为最小行数布局而设计):

GameStateManager.java

import java.awt.Image;
import java.awt.Graphics2D;
import java.util.*;

public class GameStateManager {

    public static final String EXIT_GAME = "_ExitGame";

    private Map gameStates;
    private Image defaultImage;
    private GameState currentState;
    private InputManager inputManager;
    private boolean done;

    public GameStateManager(InputManager inputManager,
        Image defaultImage)
    {
        this.inputManager = inputManager;
        this.defaultImage = defaultImage;
        gameStates = new HashMap();
    }

    public void addState(GameState state) {        gameStates.put(state.getName(), state);    }

    public Iterator getStates() {        return gameStates.values().iterator();    }

    public void loadAllResources(ResourceManager resourceManager) {
        Iterator i = getStates();
        while (i.hasNext()) {
            GameState gameState = (GameState)i.next();
            gameState.loadResources(resourceManager);
        }
    }

    public boolean isDone() {        return done;    }

    public void setState(String name) {
        // clean up old state
        if (currentState != null) {            currentState.stop();        }
        inputManager.clearAllMaps();

        if (name == EXIT_GAME) {            done = true;        }
        else {
            // set new state
            currentState = (GameState)gameStates.get(name);
            if (currentState != null) {                currentState.start(inputManager);            }
        }
    }

    public void update(long elapsedTime) {
        // if no state, pause a short time
        if (currentState == null) {
            try {
                Thread.sleep(100);
            }
            catch (InterruptedException ex) { }
        }
        else {
            String nextState = currentState.checkForStateChange();
            if (nextState != null) {                setState(nextState);            }
            else {                currentState.update(elapsedTime);            }
        }
    }

    public void draw(Graphics2D g) {
        if (currentState != null) {            currentState.draw(g);        }
        // if no state, draw the default image to the screen
        else {     g.drawImage(defaultImage, 0, 0, null);        }
    }
}

GameState.java (接口)

import java.awt.Graphics2D;

public interface GameState {

public String getName();
//    Returns the name of a state to change to if this state is
//    ready to change to another state, or null otherwise.
public String checkForStateChange();
//    Loads any resources for this state. This method is called
//    in a background thread before any GameStates are set.
public void loadResources(ResourceManager resourceManager);
//    Initializes this state and sets up the input manager
public void start(InputManager inputManager);
//    Performs any actions needed to stop this state.
public void stop();
//    Updates world, handles input.
public void update(long elapsedTime);
//    Draws to the screen.
public void draw(Graphics2D g);
}

您还需要实现 anInputManager和 a ResourceManager,但希望这对您有所帮助:)

如果您需要更多信息,请告诉我,因为有几种方法可以做到这一点。

于 2013-11-14T13:08:46.977 回答
0

值得一提的是,我不是游戏开发人员,但我在 Java 方面有几年的经验。要执行诸如暂停游戏或不同射击模式之类的状态,我会使用枚举。

看看这些:http ://docs.oracle.com/javase/7/docs/api/java/util/Enumeration.html

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

https://www.captechconsulting.com/blog/waseem-quraishi/java-enumerations

于 2013-11-14T11:26:31.577 回答