2015-04-03 67 views
0

我使用Box2D创建了一个“游戏”(我在学习......),并且我有一个玩家(一个球)和一个位于玩家之下的高箱子。SetAngularVelocity不会立即运行

当用户点击/触摸/击中键盘上的按键;在第一次点击时球员应该跳起来,第二次球员应该向右旋转。

我已经在我的输入处理功能,轻松解决了这个:

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

回答

0

因此很明显,SetAngularVelocity(),不像ApplyImpulseApplyTorque不会唤醒对象了,因此新的速度不会采取直到对象醒来。

这就是为什么双击它发射(对象仍然从玩家已经触摸它醒来),但慢慢双击物体已经睡着了,并不会醒来,直到玩家再次触摸它。

只需在拨打SetAngularVelocity()之前设置body.SetAwake(true)即可解决。