【问题标题】:Toggleable pause screen XNA 4.0 C#可切换暂停屏幕 XNA 4.0 C#
【发布时间】:2015-05-07 04:30:13
【问题描述】:

我正在使用 XNA 4.0 框架在 C# 中制作一个简单的游戏,但是在实现 pause 功能时遇到了问题。

我希望它开始关闭暂停,然后在按下P取消暂停并开始游戏时,然后在按下 P 的任何时候,再次暂停。到目前为止,它开始暂停并切换到播放,但一旦开始播放就不会暂停。这是我按下 P

时暂停的代码
    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        {
            this.Exit();
        }

        KeyboardState newState = Keyboard.GetState();

        // Is P key down?
        if (newState.IsKeyDown(Keys.P))
        {
            // If P key is down now but not down last update and game isn't paused; pause
            if (!oldState.IsKeyDown(Keys.P) && !paused)
            {
                // Pausing the game
                paused = true;
                pauseScreen = true;
            }
            // If P key is down now but not last update and game is pause; unpause
            if (!oldState.IsKeyDown(Keys.P) && paused)
            {
                // Unpausing
                paused = false;
                pauseScreen = false;
            }
        }
        oldState = newState;

paused 是一个布尔值,因为 pauseScreen 两者都用于触发 if 语句暂停/取消暂停游戏并显示/隐藏我正在使用的后挡板。这些都工作得很好,就是上面那一点给我带来了麻烦。

任何想法为什么它只记录一次按下 P 键而不是每次按下它?

对不起,如果这看起来很愚蠢,已经晚了,我想不出任何原因导致这不起作用。

【问题讨论】:

  • 您似乎在下一个if 语句处暂停然后取消暂停。使用暂停块中的 else 包装 unpausing if 语句
  • 感谢您的建议。

标签: c# visual-studio-2010 xna


【解决方案1】:
bool isPause;
bool isPauseKeyDownHandled;

bool isPauseKeyDown = ...;
if (isPauseKeyDown)
{
    if (!isPauseKeyDownHandled)
    {
        isPause = !isPause;
        isPauseKeyDownHandled = true;
    }
}
else
{
    isPauseKeyDownHandled = false;
}

或者使用this:

CustomKeyInputManager keyInputManager;

Initialize()
{
    keyInputManager = CustomKeyInputManager();
    keyInputManager.RegisterKey("pause", Keys.P);
}

Update(GameTime pGameTime)
{
    keyInputManager.Update(pGameTime);  
    if (keyInputManager["pause"].IsPressedAndNotHandled)
    {
        pause != pause;
        keyInputManager["pause"].SetHandled();
    }
}

【讨论】:

  • 谢谢!第二种解决方案非常有效!我不知道有像prostokiriuah这样的实用程序存在,pause = !pause 非常好,不敢相信我没想到这么简单。完美的解决方案,正是我现在想要的,谢谢!
  • 谢谢。这是我的帐户,不是官方产品。如果您愿意,可以免费使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多