如何在JAVA中使用简单的FPS中的游戏状态

时间:2013-11-14 11:24:02

标签: java opengl game-engine

因此,对于我的计算机编程小项目,我们必须在JAVA中创建一个游戏。他们为我们提供了一个非常简单的引擎式应用程序,它只是从用户可以导航的第一人称视图中显示3D迷宫。我们的工作就是让敌人成为一个“全面”的FPS。我们使用JAVA和OpenGL(JOGL)

他们告诉我们使用游戏状态,但是从来没有关于这个的演讲,他们的回答是google它。好吧,我用Google搜索的内容有点过于复杂而无法真正掌握我的头脑,所以我只会询问有关各州的具体问题。

游戏需要有暂停和主菜单之类的状态。但是,我还读到玩家本身也可以拥有不同的射击模式等状态。

  1. UML图或任何包含状态类的图表怎么样?它是一个层级结构,其中州级是最重要的吗?

  2. 是否所有州都定义在一个州级?这是一个简单的游戏,所以我们有:射击,暂停,主菜单,冲刺,躲避,健康包。 (也许是困难)。

  3. 如果按下ESC,将触发UserInput中的方法。我假设我不得不改变游戏的状态。这是一个问题1的子问题。改变游戏状态的干净方法是什么?如同,我将如何联系州级?

  4. 所有这些州都是吗?

    这是我们所拥有的UML图。 UML Diagram of the game

2 个答案:

答案 0 :(得分:1)

过去我使用过手动编码的int(实际上是枚举)。

例如:

// "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

(类似的一个示例位于here 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);
}

您还需要InputManagerResourceManager的实现,但希望这会对您有所帮助:)

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

答案 1 :(得分: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