簡體   English   中英

SpriteKit物理體在與關節連接時不會發生碰撞

[英]SpriteKit physics bodies not colliding when connected with joints

我正在評估iOS SpriteKit物理引擎,為了測試,我創建了一個包含兩個圓形節點的Xcode的簡單場景:

SpriteKit場景中的兩個節點

兩個節點都具有圓形和5千克質量的物理體。 我用SKPhysicsJointSpring連接兩個節點。 這是整個設置(在viewDidLoad() ):

let path = NSBundle.mainBundle().pathForResource("MyScene", ofType: "sks")!
let scene = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as! SKScene

let border = SKPhysicsBody(edgeLoopFromRect: scene.frame)
border.restitution = 0;
border.friction = 0;
scene.physicsBody = border

let player = scene.childNodeWithName("player")! // large ball
let tail1 = scene.childNodeWithName("tail1")! // smaller ball

player.physicsBody!.usesPreciseCollisionDetection = true
tail1.physicsBody!.usesPreciseCollisionDetection = true

let spring1 = SKPhysicsJointSpring.jointWithBodyA(player.physicsBody!, bodyB: tail1.physicsBody!, anchorA: player.position, anchorB: tail1.position)
spring1.damping = 1
spring1.frequency = 3
scene.physicsWorld.addJoint(spring1)

spriteKitView.presentScene(scene)

注意:場景編輯器中的重力設置為(0,0)。

當我移動較大的節點時(例如,通過使用touchesBegan()捕獲觸摸並將節點的位置設置為觸摸位置),另一個遵循彈簧參數。

但是,如果我足夠快地移動節點,使彈簧力變得極端,則彈簧收縮時兩個節點都會重疊。 我期望它們相互沖突,因為它們的collisionBitMask默認設置為-1(所有位都設置)。 我已啟用usesPreciseCollisionDetection但效果仍然可見。

當我在場景周圍添加邊緣循環時,它們會按預期與該邊緣碰撞。 與具有物理主體(但沒有連接關節)的其他節點相同。

我的印象是彈簧的存在以某種方式使引擎忽略與關節連接的節點之間的碰撞。 還有其他人觀察過這個嗎? 我忘了什么嗎? 或者這是否按預期工作?

試圖回答我自己的問題。

我發現其他關節(例如SKPhysicsJointLimit )也禁用了連接節點之間的沖突。 我唯一的結論是,所有SpriteKit關節都以某種方式將兩個對象視為一個,其中碰撞被認為是不合需要的。 雖然在我的應用程序中我更喜歡啟用碰撞。 也許我應該在Apple開發人員的反饋中提交增強功能。

到目前為止,我的解決方法包括:

  1. 通過將SKFieldNode.springFieldSKFieldNode.dragField作為子節點添加到sprite節點來創建spring行為。 親:作為孩子,這些字段會自動跟隨父母的位置; Con:這花費了2比特的fieldBitMask ,它對這些節點的數量進行了自然限制。
  2. 在每一幀手動施加一些彈簧+拖拽力。 Pro:不浪費fieldBitMask ,Con:手動計算彈簧+拖拽力。

所以我傾向於選擇2。

總結:如果您希望在保持碰撞的同時在兩個節點之間進行彈簧行為,請手動執行力並且不要使用關節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM