SetAngularVelocity不会立即运行

时间:2015-04-03 15:49:25

标签: javascript box2d

我正在使用Box2D创建一个“游戏”(我正在学习...),我有一个玩家(一个球)和一个位于玩家下方的高箱子。

当用户点击/触摸/点击键盘上的键时;在第一次点击时,玩家应该向上跳,而在第二次,高箱应该向右旋转。

我在输入处理功能中轻松解决了这个问题:

var numClicks = 0;

var handleInput = function () {
    numClicks++;

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

正如你所看到的,在第一次点击/触摸/无论什么时,玩家跳起来,第二次发射器发射/开始旋转,然后玩家拍打他的翅膀。所有这一切都很明确。

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

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

到底是怎么回事?我不知道它们是如何连接的......如果我放了一个console.log('Launch');在旋转启动器的呼叫旁边我接到控制台呼叫,但旋转拒绝在玩家接触地面之前开始IF(并且仅在此情况下)我在玩家再次开始向下行进之后启动旋转。

您可以在此处查看:http://31.192.226.6/flappy/

尝试快速点击两次,“启动器”应该开始旋转并将玩家打开。然后尝试更慢地点击(特别是等待玩家开始下降)并注意会发生什么。

有很多代码,但与此相关的内容可以在这里找到:

处理输入函数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();
    }
};

球员襟翼功能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;
};

启动器启动功能https://github.com/powerbuoy/FlappyMatteo/blob/master/js/02-launcher.js第28行:

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

我是如何进入这个的? :P

1 个答案:

答案 0 :(得分:0)

显然SetAngularVelocity(),与ApplyImpulseApplyTorque不同,不会唤醒对象,因此新的速度不会超过对象醒来。

这就是为什么双击它的原因(对象仍然从触摸它的玩家醒来)但是在慢速双击时对象已经睡着了并且不会被唤醒直到玩家再次触摸它

在致电body.SetAwake(true)之前,只需设置SetAngularVelocity()即可解决问题。