我遇到了一个有趣的问题,即控制降落伞运动的自动收报机。无论何时改变加速度方向,它都会花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;
}
我已经用console.log观看了循环,它在达到条件的第二秒就识别出该循环,通常要等到改变之前最多59毫秒。
答案 0 :(得分:1)
不确定这是否可以解决问题,但是您可以完全摆脱循环:
[
{ "type": "cell", "number": "702-123-4567" },
{ "type": "work", "number": "702-987-6543" }
]
答案 1 :(得分:1)
我明白了。原来是
let dragMod = (1 - this.drag);
这整个时间。不是网络循环,时间等。增加帧速率独立性会有所帮助,但是我必须更改拖动时间。这导致了异常的延迟。