XNA-如何将同一个键用于不同的选项
本文关键字:选项 用于 同一个 XNA- | 更新日期: 2023-09-27 18:28:57
所以我有这样的代码:变量:
enum gameState
{
gameLoading,
mainMenu,
gameOptions,
levelSelect,
gamePlaying,
gameOver
}
在Update()
方法中:
if (CurrentGameState == gameState.gameLoading)
{
if (Keyboard.GetState().IsKeyDown(Keys.E))
{
graphics.ToggleFullScreen(); //?
}
graphics.ApplyChanges();
}
...
//gameState.gameLoading logic
if (Keyboard.GetState().IsKeyDown(Keys.Enter))
CurrentGameState = gameState.mainMenu;
所以我想要的是在gameState.gameLoading
中按下Enter键,两个分辨率都是全屏的,gameState
等于mainMenu
。在gameState.mainMenu
中,按回车键无法将分辨率从全屏更改为窗口。如何做到这一点?也许使用列表?
如果任何gameState
需要不同的行为,我认为它们应该有不同的类。这将确保每个Update
只影响其自己的gameState
。
既然您已经决定了游戏的状态,为什么不使用状态机设计模式来控制您的输入处理行为呢?这种模式的议程是将工作从实际对象委派到其状态。您所做的是像pinckerman建议的那样,为每个状态创建一个带有Update()方法的类,并在那里输入所有的输入处理+状态转换逻辑。你可以在这里找到一个例子:http://sourcemaking.com/design_patterns/state.当我使用它时,我通过使用抽象状态类将上下文从它的状态和转换中分离出来,并从中继承。这使得在需要时更容易更改状态机。这里有一个快速的例子:
public class Context
{
private GameState state;
public void Update()
{
state.Update();
}
public void ChangeState(GameState nextState)
{
state = nextState;
}
}
public abstract class GameState
{
protected Context context;
public virtual void Update()
{
// some basic implementation if you want.
}
}
public class GameLoadingState : GameState
{
public override void Update()
{
// Handle key presses.
context.ChaneState(new MainMenuState(context));
}
}
public class MainMenuState : GameState
{
public override void Update()
{
// Handle key presses in some other way.
// Change state if needed.
}
}
同样,如果您不喜欢被动上下文的实现,可以将其更改为更主动。希望这能有所帮助!