【问题标题】:c# Xna keydown with a delay of 1 secc# Xna keydown 延迟 1 秒
【发布时间】:2010-04-02 05:00:15
【问题描述】:

我正在 xna 中编写俄罗斯方块。我有一个带有方法rotateBlocks 的类。当我按下“向上”箭头键时。我希望当我按住按钮 1 秒或更长时间时,它会执行第一个 else if(快速旋转块)中的参数,现在什么都没有发生。我已经在课堂上全局声明了 oldState。如果我首先删除游戏时间检查,否则如果该块将快速旋转 imdietley。如果我尝试使用换行符单步执行代码,则分辨率会提高

public void RotateBlocks(loadBlock lb, KeyboardState newState, GameTime gameTime) { _elapsedSeconds2 += (float)gameTime.ElapsedGameTime.TotalSeconds;

        if (lb._name.Equals("block1"))
        {

            if (newState.IsKeyDown(Keys.Up) && !oldState.IsKeyDown(Keys.Up))
            {
                // the player just pressed Up


                if (_rotated)
                {
                    lb._position[0].X -= 16;
                    lb._position[0].Y -= 16;
                    lb._position[2].X += 16;
                    lb._position[2].Y += 16;
                    lb._position[3].X += 32;
                    lb._position[3].Y += 32;
                    _rotated = false;
                }

                else if (!_rotated)
                {
                    lb._position[0].X += 16;
                    lb._position[0].Y += 16;
                    lb._position[2].X -= 16;
                    lb._position[2].Y -= 16;
                    lb._position[3].X -= 32;
                    lb._position[3].Y -= 32;
                    _rotated = true;
                }


            }
            if (newState.IsKeyDown(Keys.Up) && oldState.IsKeyDown(Keys.Up))
            {
                // the player is holding the key down
                if (gameTime.ElapsedGameTime.TotalSeconds >=1)
                {
                    if (_rotated)
                    {
                        lb._position[0].X -= 16;
                        lb._position[0].Y -= 16;
                        lb._position[2].X += 16;
                        lb._position[2].Y += 16;
                        lb._position[3].X += 32;
                        lb._position[3].Y += 32;
                        _rotated = false;
                    }

                    else if (!_rotated)
                    {
                        lb._position[0].X += 16;
                        lb._position[0].Y += 16;
                        lb._position[2].X -= 16;
                        lb._position[2].Y -= 16;
                        lb._position[3].X -= 32;
                        lb._position[3].Y -= 32;
                        _rotated = true;

                    }
                    _elapsedSeconds2 = 0;
                }

            }

【问题讨论】:

  • 我有同样的问题,但在 Silverlight 应用程序中。这必须是面向操作系统的,因为我也在 winforms 中发现了这个问题

标签: c#


【解决方案1】:

问题是您的游戏时间检查只检查自上一次滴答以来已经过去了多长时间。

您需要存储他们第一次按键的时间,然后比较该时间与当前时间的差异。

【讨论】:

    【解决方案2】:

    ElapsedGameTime 是自上次调用 Game.Update() 以来的时间。因此,如果您的游戏循环以每秒 60 次的恒定速度运行,则 ElapsedGameTime 将始终为 1/60 秒。您需要记录最初按下按键时的 TotalGameTime,并在以后的更新中进行比较。

    【讨论】:

    • 你有什么好的例子可以提供吗?我对 xna 真的很陌生
    • 您可以使用与存储旧状态几乎相同的方式进行操作。
    • 我有,所以方块每 1 秒向下移动 1 个方块。这是有效的。不明白为什么它不起作用 public void BlocksTickingMove(GameTime gameTime) { _elapsedSeconds += (float) gameTime.ElapsedGameTime.TotalSeconds; if (_elapsedSeconds >= 1) { MoveBlock(); _elapsedSeconds -= 1; } }
    • 您在一个地方使用“if (_elapsedSeconds >= 1)”,在另一个地方使用“if (gameTime.ElapsedGameTime.TotalSeconds >=1)”,但不明白为什么它们工作方式不同?
    • 呵呵。我一定是盲人。现在,当我按住按钮时,它每隔一秒缓慢旋转一次
    【解决方案3】:

    @Michael 是正确的,你需要做类似的事情

    // where integertype is int or long etc
    integertype startPress = 0;
    
    public void RotateBlocks(loadBlock lb, KeyboardState newState, GameTime gameTime) {
    
        _elapsedSeconds2 += (float)gameTime.ElapsedGameTime.TotalSeconds;
    
      if (lb._name.Equals("block1"))
            {
                if (newState.IsKeyDown(Keys.Up) && !oldState.IsKeyDown(Keys.Up))
                {
                    // the player just pressed Up
    startPress = GameTime.ElapsedGameTime.TotalSeconds;
    
                    if (_rotated)
                    {
                        lb._position[0].X -= 16;
                        lb._position[0].Y -= 16;
                        lb._position[2].X += 16;
                        lb._position[2].Y += 16;
                        lb._position[3].X += 32;
                        lb._position[3].Y += 32;
                        _rotated = false;
                    }
    
                    else if (!_rotated)
                    {
                        lb._position[0].X += 16;
                        lb._position[0].Y += 16;
                        lb._position[2].X -= 16;
                        lb._position[2].Y -= 16;
                        lb._position[3].X -= 32;
                        lb._position[3].Y -= 32;
                        _rotated = true;
                    }
    
    
                }
                if (newState.IsKeyDown(Keys.Up) && oldState.IsKeyDown(Keys.Up))
                {
                    // the player is holding the key down
                    if (gameTime.ElapsedGameTime.TotalSeconds - startPress >=1)
                    {
                        if (_rotated)
                        {
                            lb._position[0].X -= 16;
                            lb._position[0].Y -= 16;
                            lb._position[2].X += 16;
                            lb._position[2].Y += 16;
                            lb._position[3].X += 32;
                            lb._position[3].Y += 32;
                            _rotated = false;
                        }
    
                        else if (!_rotated)
                        {
                            lb._position[0].X += 16;
                            lb._position[0].Y += 16;
                            lb._position[2].X -= 16;
                            lb._position[2].Y -= 16;
                            lb._position[3].X -= 32;
                            lb._position[3].Y -= 32;
                            _rotated = true;
    
                        }
                        _elapsedSeconds2 = 0;
                    }
    
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2011-10-24
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多