什麼是最好的方法使Swift SKSpriteNode自動更正它的方向後,它已經有了一些physicsBody敲,並且現在不在默認方向?SKSpriteNode with physicsBody自動校正方向
例如,我有一個2D棍子,被另一個物體撞到一邊,並希望棍子傾斜並將其自身重新定位到默認站立位置。
什麼是最好的方法使Swift SKSpriteNode自動更正它的方向後,它已經有了一些physicsBody敲,並且現在不在默認方向?SKSpriteNode with physicsBody自動校正方向
例如,我有一個2D棍子,被另一個物體撞到一邊,並希望棍子傾斜並將其自身重新定位到默認站立位置。
我過去的做法是等到物理體停下來後,關閉火柴人的物理引擎,重新定向火柴人,重新打開物理引擎。
給自己寫一個叫做standupAction的動作,它激活了火柴人的重新定向,也許只是一個旋轉或跳起來。然後做下面的事情。
對不起這個Objective-C不是Swift,不知道很快,但應該很容易翻譯。
if (stickman.physicsBody.resting) {
stickman.physicsBody.dynamic = NO;
[stickman runAction:[SKAction sequence:@[
standupAction,
[SKAction runBlock:^{ stickman.physicsBody.dynamic = YES;}]
]]];
}
這種方法唯一的缺點是,有時直到火柴人來來休息,它可以採取整秒。 Box2d需要相當長的時間才能安頓下來。但是如果你等待,它看起來很現實。
或者,您可以檢查火柴人的方位,如果他的平衡度超過45度,則用衝動調整他的方向。當你需要像這樣的精確運動時,我發現衝動很難知道應用多大的力量。
謝謝我沒有想到休息的財產!在我的情況下1秒鐘不應該是一個重要的等待。 – Revick 2015-02-06 20:13:46
只是爲了更新,我無法設置physicsBody不是動態的。
我的場景更新的每個節點,類似於蘋果的冒險遊戲,因此我實現的子類SKSpriteNode的更新方法旋轉這樣:
if (isTouchingGround) {
if self.zRotation != 0 && !rotating {
let actions = [
SKAction.runBlock {
self.rotating = true
},
SKAction.rotateToAngle(0, duration: 1.0),
SKAction.runBlock {
self.rotating = false
}]
runAction(SKAction.sequence(actions))
}
}
Apple's Adventure不使用物理引擎來計算重力等。當物理機體由物理引擎管理時,您正在手動更改旋轉角度。當物理引擎與你爭奪控制角色的移動時,這可能會產生瑕疵。我會使用@ LearnCocos2D的原始建議,使用衝動將其旋轉回0。 – 2015-02-09 07:21:26
申請角衝取決於哪一方,他是有可能的強度或更頻繁地應用衝動,字符越傾向於 – LearnCocos2D 2015-02-06 12:02:21