XNA - 如何为不同的选项使用相同的密钥?

时间:2013-08-24 14:29:32

标签: c# if-statement xna keyboard enter

所以我有这个代码:变量:

    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中时,无法通过按Enter键将分辨率从全屏更改为窗口。怎么做到这一点?也许使用列表?

2 个答案:

答案 0 :(得分:1)

我认为如果需要有不同的行为,你应该为任何gameState设置不同的类。这将确保每个Update仅影响其自己的gameState

答案 1 :(得分:1)

由于您已经确定了游戏的状态,为什么不使用状态机设计模式来控制输入处理行为? 这种模式的议程是将工作从实际对象委托给其状态。你要做的是为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.
    }
}

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