【问题标题】:XNA - how to use the same key for different options?XNA - 如何为不同的选项使用相同的密钥?
【发布时间】:2013-08-24 14:29:31
【问题描述】:

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

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

【问题讨论】:

  • 你的问题不清楚,要不要在回车时改变全屏和游戏状态?
  • 是的,这就是我想要的。

标签: c# if-statement xna keyboard enter


【解决方案1】:

如果gameState 需要不同的行为,我认为您应该为它们设置不同的类。这将确保您每个Update 只影响它自己的gameState

【讨论】:

  • @PowerUser - 我不确定这如何回答你的问题,真正应该发生的事情是你应该为你的游戏状态设置一个 switch 语句,然后在其中可以有你的逻辑,或者正如pinckerman所说,指向一个差异类
  • 是的,正如我在另一个 XNA 问题中评论的那样,我的代码中确实有一个 switch 语句用于 gameStates。也正如我上面提到的//gameState.gameLoading logic 我的意思。我的switch 中的第一个case
【解决方案2】:

既然您已经决定了游戏的状态,为什么不使用状态机设计模式来控制您的输入处理行为呢? 该模式的议程是将工作从实际对象委托给其状态。您所做的是为每个状态创建一个带有 Update() 方法的类,就像 pinckerman 建议的那样,并在那里输入所有输入处理 + 状态转换逻辑。您可以在此处找到示例: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.
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多