2014-02-19 69 views
2

最近我一直在排練Sprite Kit,我遇到了一個很奇怪的問題。當縮放父節點(改變縮放比例)時,由SKPhysicsJointPin連接在一起的物體逐漸彼此分開,然後關節斷開。讓我給你看看這些圖像。縮放時接頭斷裂

這是正常狀態: Here's the normal state

這裏放大時'S: Zoomed in

在這裏,縮小時是: Zoomed out

如果你問我如何加入機構:我加盟棕色粘在藍色節點中心的藍色節點上。任何想法我的問題是什麼?

編輯:我最近發現,關節不會中斷,一切工作如預期當連接的身體不動態。因此,例如,如果我使用[SKPhysicsBody bodyWithEdgleLoopF​​romRect]而不是 [SKPhysicsBody bodyWithRectangleOfSize]爲精靈創建物理主體,則沒有任何問題。但我需要身體是動態的。

下面是我用來將物理附加到節點的代碼。當然,這一切都是動態完成的。爲了簡潔,我只是硬編碼。

-(void)attachPhysics{ 
    //fixedComponentLeft & fixedComponentRight are two SKSprites 
    fixedComponentLeft.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.frame.size.width]; 
    fixedComponentRight.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.size.width]; 
    beam1.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam1.size]; 
    joiningBody.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:joiningBody1.size.width]; 
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentLeft.physicsBody bodyB:beam1.physicsBody anchor:fixedComponentLeft.position]]; 
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:joiningBody.physicsBody bodyB:beam1.physicsBody anchor:beam1.endPoint]]; 
    beam2.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam2.size]; 
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:joiningBody.physicsBody bodyB:beam2.physicsBody anchor:beam2.position]]; 
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentRight.physicsBody bodyB:beam2.physicsBody anchor:beam2.endPoint]]; 
} 

在上面的代碼中,beam1和beam2是SKSpriteNode的子類的實例。默認情況下,錨點是(0,0.5),我添加了一個名爲endPoint的屬性,它作爲精靈最右邊的邊緣點。

回答

3

事實上,這不是一個答案,但我認爲我不會使用評論區這一點,因爲問題是足夠大,不適應那裏。我應該猜到,問題是由於元素被繪製的節點和物理世界的物體添加到不同的座標系而造成的。這是因爲物理世界屬於場景,這意味着無論將多少個子節點添加到場景中,通常只有一個物理世界,連接到不同子節點上的不同節點的所有物體共享相同的世界。我不知道它是否好。因此,這裏的東西我們可以嘗試:

  1. 規模場景本身,而不是子節點:當我試了一下,不出意外我有一個非常大的問題。由於場景通常是遊戲中所有節點的根節點,這意味着所有事情都會相應地放大或縮小。這也包括控制權。所以,不是一個好主意

  2. 您可以嘗試子類SKNode,以便它實現自己的SKPhysicsWrold實例並將所有內容添加到該世界:不幸的是,出於某些原因,蘋果公司不可能擁有自己的物理世界。是的,你可以將你的關節添加到你想要的任何世界。但關節需要身體共享同一個世界。從純粹的解開Box2D我記得身體還需要添加到物理世界。所以我假設,蘋果已經做到了這一點,當你設置物理體時,它會被添加到scene.physicsWorld中。如果你嘗試關節添加到自定義創建的物理世界,你會得到一個Box2D的錯誤,指出聯合能力小於關節計數。 :))

  3. 唯一現實的辦法似乎是重建物理機構和關節。但這是一個真正的痛苦,我也沒有成功。除了潛在的性能影響之外,這種方法還需要一個非常準確的身體和關節重建順序,設置他們以前的速度等。

    因此,在網絡上搜索了20多天並沒有找到真正的工作解決方案,我可以說這是一個真正的問題,我認爲蘋果需要考慮重新考慮,或至少提供良好的解決方案。

1

我不知道你的代碼是什麼樣子,但是我碰到了類似的問題,在那裏我一個成熟的遊戲有繩(覺得超級馬里奧),使用瓷磚地圖,如果我說的繩子在水平開始時一切正常,關節之間的連接處於持續狀態,但當我將繩子放在中間或水平末端時,關節會變得更有彈性,繩子會分開,而在同時把物理世界變成一個無限循環,把一切都停下來。

修復結果很簡單,正如你所說的,物理世界屬於現場,只有場景本身,我在一個基於節點位置的位置添加了繩索,這實際上導致了問題。

當我用

CGPoint positionInScene = [self convertPoint:nodeB.position fromNode:self.map]; 

下面的代碼到節點的位置轉換到場景的座標,後來使用了positionInScene變量聯合重視像這樣一個錨:

[SKPhysicsJointFixed jointWithBodyA: nodeA.physicsBody 
           bodyB: nodeB.physicsBody 
          anchor: CGPointMake(positionInScene.x, positionInScene.y)]; 

一切開始正常工作。

所以在你的情況下,如果你可以顯示你使用的代碼,也許我們可以找出類似的東西。 希望這有助於。

+0

謝謝@Andrew的洞察力。我已經添加了一些代碼。 –

+0

您是否在設置錨點位置時嘗試使用[yourScene convertPoint:fromNode:]? – Andrew

+0

我剛剛做了你的建議後,其實我可能以前試過。但它並沒有幫助 –

1

遇到與平移世界類似的問題。

世界座標不再匹配物理座標。

所以你必須使用調用[scene convertPoint:pt fromNode:pannedWorld]。

我重寫了applyForce:atPoint:和applyTorque:atPoint:來抽象並確保代碼保持清晰。

我還發現,如果您在didBeginContact中添加對象(例如爆炸的彈片),則創建的任何對象都必須在絕對物理世界座標系中給出座標,而不是相對平移/放大的世界。

在效果上都表現得如同PhysicsWorld是絕對&不變的座標系中,而SKNode觀點正是,對物理世界的看法,並且可以平移等 那裏得到令人困惑的是,座標是大多數情況下透明地從一個系統轉換到另一個系統,但並非總是如此。

+0

感謝,對於輸入,但我已經意識到,Sprite Kit仍然不成熟,有很多錯誤/意圖行爲,從而無法制作出尖端遊戲。所以我回到了古老的Cocos2D。 V3現在已經將物理整合到了它中 –