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中,按回车键无法将分辨率从全屏更改为窗口。如何做到这一点?也许使用列表?

XNA-如何将同一个键用于不同的选项

如果任何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.
    }
}

同样,如果您不喜欢被动上下文的实现,可以将其更改为更主动。希望这能有所帮助!