SetAngularVelocity 不会立即 运行

SetAngularVelocity doesn't run immediately

我正在使用 Box2D 创建一个 "game"(我正在学习...),我有一个球员(一个球)和一个位于球员下方的高箱子。

当用户clicks/touches/hits键盘上的一个键时;第一次点击玩家应该跳起来,第二次点击高框应该向右旋转。

我已经在我的输入处理函数中轻松解决了这个问题:

var numClicks = 0;

var handleInput = function () {
    numClicks++;

    if (numClicks == 1) {
        Game.player.jump();
    }
    else if (numClicks == 2) {
        Game.launcher.launch();
    }
    else {
        Game.player.flap();
    }
};

如您所见,第一个 click/touch/whatever 玩家跳起来,第二个 launches/starts 旋转发射器,然后玩家拍打翅膀。所有这些都是为了清楚起见。

我遇到的问题是 (imo) 非常奇怪。发生的情况是,如果我启动播放器(通过单击)然后,在播放器达到他的峰值高度之前我再次单击,启动器将立即开始旋转。

但是,如果我通过单击启动播放器,然后等到播放器达到顶峰并开始向下移动,然后再次单击(启动启动器的旋转)启动器将不会开始旋转直到玩家接触地面.

这到底是怎么回事?我什至不知道它们是如何连接的……如果我放一个 console.log('Launch');在旋转启动器的调用旁边,我接到了控制台调用,但旋转拒绝在玩家接触地面之前开始如果(且仅当)我在玩家再次开始向下移动后启动旋转。

你可以在这里自己看看:http://31.192.226.6/flappy/

尝试快速点击两次,"launcher" 应该开始旋转并击退玩家。然后尝试更慢地点击(特别是等待播放器开始下降)并注意会发生什么。

代码比较多,不过相关的东西可以在这里找到:

处理输入函数https://github.com/powerbuoy/FlappyMatteo/blob/master/js/09-game.js第109行: // 处理输入 var numClicks = 0;

var handleInput = function () {
    numClicks++;

    if (numClicks == 1) {
        Game.player.flap();
    }
    else if (numClicks == 2) {
        Game.launcher.launch();
    }
    else {
        Game.player.flap();
    }
};

Player flap 函数 https://github.com/powerbuoy/FlappyMatteo/blob/master/js/02-player.js 第 25 行:

this.flap = function () {
    this.body.ApplyImpulse(new b2Vec2(0, -12 * this.energy), this.body.GetWorldCenter());

    this.energy = this.energy / 2;
};

Launcher 启动函数https://github.com/powerbuoy/FlappyMatteo/blob/master/js/02-launcher.js 第 28 行:

this.launch = function () {
    this.body.SetAngularVelocity(10);
};

我是如何陷入其中的? :P

显然 SetAngularVelocity(),与 ApplyImpulseApplyTorque 不同, 不会 唤醒对象,因此新速度不会占用直到对象醒来。

这就是为什么在双击时它会启动(对象在玩家触摸它时仍然醒着)但是在较慢的双击时对象已经睡着了并且在玩家再次触摸它之前不会醒来。

在调用 SetAngularVelocity() 之前简单地设置 body.SetAwake(true) 就解决了。