Javascript 为什么变量更改要延迟x毫秒才能生效?

Javascript 为什么变量更改要延迟x毫秒才能生效?,javascript,Javascript,我遇到了一个有趣的问题,一个控制降落伞运动的自动售票机。无论何时改变加速方向,它都需要整整60毫秒才能生效,这会导致一些奇怪的行为,例如降落伞撞到游戏墙,并在交换方向之前“研磨” 当它撞击墙壁时,在本测试案例中,它应立即改变方向。这似乎是偏移量循环造成的,但是我在没有循环的情况下运行了基本代码,它仍然以相同的方式运行 基本引擎是Phaser 3,tick()直接在其Update()循环中运行 我已经用setInterval和requestAnimationFrame直接测试了这一点——它们产生相

我遇到了一个有趣的问题,一个控制降落伞运动的自动售票机。无论何时改变加速方向,它都需要整整60毫秒才能生效,这会导致一些奇怪的行为,例如降落伞撞到游戏墙,并在交换方向之前“研磨”

当它撞击墙壁时,在本测试案例中,它应立即改变方向。这似乎是偏移量循环造成的,但是我在没有循环的情况下运行了基本代码,它仍然以相同的方式运行

基本引擎是Phaser 3,tick()直接在其Update()循环中运行

我已经用setInterval和requestAnimationFrame直接测试了这一点——它们产生相同的奇数延迟

tick(time)
{
    if (this.last == 0)
    {
        this.last = time;
    }

    let offSet = Math.min(time - this.last, 5000);

    let dragMod = (1 - this.drag);

    for(let i = 0; i < offSet; i++);
    {
        if (!this.isGrounded)
        {
            if (this.AccelDirection == -1)
            {
                this.XSpeed += -this.windPower;
            }

            if (this.AccelDirection == 0)
            {
                this.XSpeed = 0;
            }                 

            if (this.AccelDirection == 1)
            {
                this.XSpeed += this.windPower;
            } 

            this.YSpeed += this.gravity;
            this.X += this.XSpeed;
            this.Y += this.YSpeed;

            this.YSpeed *= dragMod;
            this.XSpeed *= dragMod;

            if (this.X >= 868)
            {
                this.X = 868; // Right //
                if (this.isMe)
                {
                    this.AccelDirection = -this.AccelDirection;
                    //this.scene.bounce();
                }

            }

            if (this.X <= 32)
            {
                this.X = 32; // Left //
                if (this.isMe)
                {
                    this.AccelDirection = -this.AccelDirection;
                    //this.scene.bounce();
                }
            } 

        } else {
            this.YSpeed = 0;
            this.XSpeed = 0;
        }

        if (this.Y > 868)
        {
            this.isGrounded = true;
        }
    }

    this.x = this.X;
    this.y = this.Y;
    this.last = time;
}
勾选(时间)
{
如果(this.last==0)
{
这是最后一次;
}
让offSet=Math.min(time-this.last,5000);
设dragMod=(1-this.drag);
for(设i=0;i=868)
{
this.X=868;//对//
if(this.isMe)
{
this.AccelDirection=-this.AccelDirection;
//this.scene.bounce();
}
}
如果(此.X 868)
{
this.isGrounded=true;
}
}
this.x=this.x;
this.y=this.y;
这是最后一次;
}

我已经用console.log观察了循环,它在遇到条件的那一刻就识别出它,通常在它改变之前会累计59毫秒。

不确定这是否解决了它,但你可以完全摆脱循环:

勾选(时间)
{
如果(!this.last){
//如果没有“last”属性,则无法计算偏移量
这是最后一次;
返回;
}
让offSet=Math.min(time-this.last,5000);
设dragMod=(1-this.drag);
让y速度=这个。重力;
设xSpeed=this.AccelDirection<0?-this.windPower:
该加速度系数<1?0:
/*否则*/this.windPower;
this.isground=this.Y>868;
如果(!this.isground){
this.XSpeed+=XSpeed*偏移量;
this.YSpeed+=YSpeed*偏移量;
this.X+=this.XSpeed;
this.Y+=this.Y速度;
this.XSpeed*=拖动速度;
this.YSpeed*=德拉格莫德;
if(this.isMe){
如果(this.X>=868 | | this.X=868?868:32;
这个方向*=-1;
//this.scene.bounce();
}
}
}否则{
this.XSpeed=this.YSpeed=0;
}
this.x=this.x;
this.y=this.y;
这是最后一次;
}

我知道了。结果是

let dragMod = (1 - this.drag);

这段时间。不是网络循环、时间等。增加帧率独立性有帮助,但我不得不改变拖动时间。这导致了不寻常的延迟。

如何运行
勾选
功能?通过
请求动画帧
?在
设置间隔
的情况下,您可以通过组合
来减少和简化代码>AccelDirection
用于速度计算,这将允许您在代码中保留多个复选框。基本引擎是Phaser 3,勾号在其更新()中运行loopOkay,我得到了一个部分答案。是帧速率导致了这种行为。但是,我需要弄清楚在哪里添加帧速率独立性。为什么要从这个循环开始?在我看来,它除了多次更改属性外,没有任何用处(取决于偏移量的值,该值可能非常高,因为它根据经过的时间计算时间差)。您可以通过将
偏移量
值乘以您想要更新的任何值来完全消除它。下面是我的答案。这实际上是网络代码,旨在使其与服务器命令保持同步-这就是循环的目的,时间基于上一次服务器时间。我将对其进行测试,但现在主要的ssue正在计算帧速率独立性。我一时兴起,决定尝试用这种方式测试,而精灵甚至不会随着这种方式移动。