0

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

    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;

所以我想要的是按下 EntergameState.gameLoading并且两个分辨率都是全屏的并且gameState等于mainMenu. 当gameState.mainMenu分辨率无法通过按 Enter 键从全屏更改为窗口时。如何做到这一点?也许使用列表?

4

2 回答 2

1

既然您已经决定了游戏的状态,为什么不使用状态机设计模式来控制您的输入处理行为呢?该模式的议程是将工作从实际对象委托给其状态。您所做的是为每个状态创建一个带有 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.
    }
}

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

于 2013-08-27T11:52:22.090 回答
1

gameState我认为如果他们需要不同的行为,你应该有不同的类。这将确保您每个Update都只影响自己的gameState.

于 2013-08-24T20:44:00.197 回答