2015-02-06 39 views
0

什麼是最好的方法使Swift SKSpriteNode自動更正它的方向後,它已經有了一些physicsBody敲,並且現在不在默認方向?SKSpriteNode with physicsBody自動校正方向

例如,我有一個2D棍子,被另一個物體撞到一邊,並希望棍子傾斜並將其自身重新定位到默認站立位置。

+1

申請角衝取決於哪一方,他是有可能的強度或更頻繁地應用衝動,字符越傾向於 – LearnCocos2D 2015-02-06 12:02:21

回答

1

我過去的做法是等到物理體停下來後,關閉火柴人的物理引擎,重新定向火柴人,重新打開物理引擎。

給自己寫一個叫做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度,則用衝動調整他的方向。當你需要像這樣的精確運動時,我發現衝動很難知道應用多大的力量。

+0

謝謝我沒有想到休息的財產!在我的情況下1秒鐘不應該是一個重要的等待。 – Revick 2015-02-06 20:13:46

0

只是爲了更新,我無法設置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)) 

      } 
     } 
+0

Apple's Adventure不使用物理引擎來計算重力等。當物理機體由物理引擎管理時,您正在手動更改旋轉角度。當物理引擎與你爭奪控制角色的移動時,這可能會產生瑕疵。我會使用@ LearnCocos2D的原始建議,使用衝動將其旋轉回0。 – 2015-02-09 07:21:26