(C#Monogame)将对象添加到列表时,键盘输入滞后于帧

时间:2016-12-18 04:54:55

标签: c# xna monogame

基本上,我使用gameTime.TotalGameTime.TotalSeconds列出了敌人对象和定时事件。它每0.1秒就会调用一种方法来检查敌人的产卵,如果我们在第二个2.5,我们就会向敌人的名单添加一个敌人。

现在发生的事情是键盘输入滞后一秒,例如,如果我连续向左移动,我的角色会在恢复移动之前停留一小段时间(比如0.1秒)。 / p>

我使用gameTime每毫秒检查键盘输入,但我也尝试过不使用它,但它仍然会发生。这也很奇怪,因为我有代码可以每隔0.5秒创建一个子弹对象,如果我按照与敌人相同的方式按住Z(通过将对象添加到列表中),但这并不能使它成为lagg输入

if (elapsedMs > oldElapsedMs + 0.001) //Millisecond update, for movement
        {
            oldElapsedMs = elapsedMs;

            //Keys to be held down.
            newState = Keyboard.GetState();
            Keys[] pressed_Key = Keyboard.GetState().GetPressedKeys();
            for (int i = 0; i < pressed_Key.Length; i++)
            {
                switch (pressed_Key[i])
                {
                    case Keys.Escape:
                        this.Exit();
                        break;
                    case Keys.Left:
                        player.tryMoveLeft();
                        break;
                    case Keys.Right:
                        player.tryMoveRight();
                        break;
                    case Keys.Up:
                        player.tryMoveUp();
                        break;
                    case Keys.Down:
                        player.tryMoveDown();
                        break;

                    default:
                        break;
                }
            }
        }

产生检查代码:

//0.1sec Update, spawning code
        if (elapsedSpawnTime > oldElapsedSpawnTime + 0.1)
        {
            oldElapsedSpawnTime = elapsedSpawnTime;
            spawnTimer += 1; //Every 0.1 sec add one to spawnTimer. The spawn timer int is what stage.Spawn() uses to check for spawns.
            stage.Spawn();


        }

我的舞台课中的产卵方法:

public void Spawn()
    {
        switch (game.spawnTimer) //Each int is 0.1sec
        {
            //10 spawnTimer = 1 Second

            case 40:
            case 42:
            case 44:
            case 46:
                game.enemyList.Add(new Enemy(game.enemySprite, 500, 500, 1, true));
                break;

            default:
                break;
        }
    }

感谢。如果您想帮助我但需要更多信息,可以添加我的Skype @ emil1000123

2 个答案:

答案 0 :(得分:0)

屏幕截图中的代码

( elapsedMs > oldElapsedMs + 0.001 )

变量名称表示这些值以毫秒为单位,那么您是否每0.001毫秒检查一次?

答案 1 :(得分:0)

似乎问题在于毫秒更新:

if (elapsedMs > oldElapsedMs + 0.001)

那么,如果它出现在这个声明中会发生什么,但是还没有超过1毫秒呢?

计算机以滴答的形式查看代码,这些代码的速度比毫秒快,因此它根本不会忽略该语句,这会导致微小的延迟,具体取决于PC的性能和文件大小(通过添加数组或列表将增加)

现在,我不知道您在TryMoveLeft()(等)方法中使用了什么。但我认为你更好地摆脱了所说的if语句。并试着改变玩家走路的方式。

如果我能看到player.TryMoveRight方法的样子,我可能会提供一些提示。