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