因此,对于我的计算机编程小项目,我们必须在JAVA中创建一个游戏。他们为我们提供了一个非常简单的引擎式应用程序,它只是从用户可以导航的第一人称视图中显示3D迷宫。我们的工作就是让敌人成为一个“全面”的FPS。我们使用JAVA和OpenGL(JOGL)
他们告诉我们使用游戏状态,但是从来没有关于这个的演讲,他们的回答是google它。好吧,我用Google搜索的内容有点过于复杂而无法真正掌握我的头脑,所以我只会询问有关各州的具体问题。
游戏需要有暂停和主菜单之类的状态。但是,我还读到玩家本身也可以拥有不同的射击模式等状态。
UML图或任何包含状态类的图表怎么样?它是一个层级结构,其中州级是最重要的吗?
是否所有州都定义在一个州级?这是一个简单的游戏,所以我们有:射击,暂停,主菜单,冲刺,躲避,健康包。 (也许是困难)。
如果按下ESC,将触发UserInput中的方法。我假设我不得不改变游戏的状态。这是一个问题1的子问题。改变游戏状态的干净方法是什么?如同,我将如何联系州级?
所有这些州都是吗?
这是我们所拥有的UML图。
答案 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);
}
您还需要InputManager
和ResourceManager
的实现,但希望这会对您有所帮助:)
如果您需要更多信息,请告诉我,因为有几种方法可以做到这一点。
答案 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