2014-11-23 70 views
2

我正在製作iOS遊戲(swift xcode)。碰撞時將節點粘貼到另一個節點

有一輛不斷移動的汽車(SKAction)和一個可以用滑動手勢移動的玩家。

都好,但現在我想的是,如果玩家觸摸的車,它會移動相同的同車(它被貼到汽車)

現在我該怎麼辦呢?

我試過很多東西,但他們沒有工作順利..

我試圖用

if (CGRectIntersectsRect(car.frame, player.frame)) { 
car.position = player.position 
} 

這工作,但球員被踢倒在車的中間,我不想這個。 我想要的是,如果玩家觸摸到汽車的底部,它會粘在汽車的底部。

我該怎麼做?

的碰撞detecion我還試圖用:

func didBeginContact(contact: SKPhysicsContact!) { 
    var firstBody:SKPhysicsBody 
    var secondBody:SKPhysicsBody 

    if(contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask){ 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    }else{ 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 


    if((firstBody.categoryBitMask & CarCategory) != 0 && (secondBody.categoryBitMask & playerCategory) != 0) 
    { 


    } 

} 

,但我不知道該怎麼括號之間放,使其順利運作就像我想要的。

+0

爲什麼不使用sprite套件中的內置碰撞檢測? – Stefan 2014-11-23 21:47:54

+0

你的意思是didbegincontact? (見編輯) – DNC 2014-11-23 21:52:39

+0

是的。更多細節見我的答案。 – Stefan 2014-11-23 21:58:49

回答

3

你可以用一個固定的物理聯合連接這兩個節點。一般來說,物理關節連接着場景中的兩個物理實體。固定版本,SKPhysicsJointFixed,加入兩個身體,使他們作爲一個單一的身體。

這裏是如何連接與固定接頭2個物理機構一個例子:

首先,將它添加到您的SKScene子類(如GameScene.m)

func joinPhysicsBodies(bodyA:SKPhysicsBody, bodyB:SKPhysicsBody, point:CGPoint) { 
    let joint = SKPhysicsJointFixed.jointWithBodyA(bodyA, bodyB: bodyB, anchor: point) 
    self.physicsWorld.addJoint(joint) 
} 

,並在if添加此在didBeginContact

self.joinPhysicsBodies(firstBody, bodyB:secondBody, point:contact.contactPoint) 

其中contact.contactPoint語句是接觸點。

0

落實SKPhysicsContactDelegate協議:

class GameScene: SKScene, SKPhysicsContactDelegate 

在didMoveToView

override func didMoveToView(view: SKView) { 
    ... 

    self.physicsWorld.contactDelegate = self 
} 

創建全局變量來存儲碰撞類別年底將委託:

let collisionCar: UInt32 = 0x1 << 0 
let collisionPlayer: UInt32 = 0x1 << 1 

創建一個物理汽車和玩家的身體:

car.physicsBody = SKPhysicsBody(rectangleOfSize: car.size) 
car.physicsBody?.affectedByGravity = false 
car.physicsBody?.dynamic = false 
car.physicsBody?.categoryBitMask = collisionCar 
car.physicsBody?.contactTestBitMask = collisionPlayer 
car.physicsBody?.collisionBitMask = 0x0; 

player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size) 
player.physicsBody?.affectedByGravity = false 
player.physicsBody?.dynamic = false 
player.physicsBody?.categoryBitMask = collisionPlayer 
player.physicsBody?.contactTestBitMask = collisionCar 
player.physicsBody?.collisionBitMask = 0x0; 

實施didBeginContact:

func didBeginContact(contact: SKPhysicsContact) { 
... 
    } 
+0

是的,謝謝你,我已經有了,但是我不知道在didbegincontact中放置什麼功能讓它像我想要的那樣粘在一起。你能幫助我嗎? – DNC 2014-11-23 22:00:15

+0

好的。對不起,我還沒有讀過。在這種情況下,您可以使用SKConstraints來實現以下行爲。我在博客中寫了一個小教程。也許這有助於:http://stefansdevplayground.blogspot.de/2014/09/howto-implement-targeting-or-follow.html – Stefan 2014-11-23 22:02:47

+0

有沒有更簡單的方法?我嘗試了你的方式,但它不能像我想要的那樣工作,以及如何防止追隨者在跟隨時旋轉? – DNC 2014-11-23 22:15:16

1

更簡單的方法來做到這一點沒有物理是使用constraints

if (CGRectIntersectsRect(car.frame, player.frame)) { 
    player.constraints=[SKConstraint.distance(SKRange(upperLimit: 100), toNode: car)] 
} 

這將確保玩家最多從車100分之遙(你可以改變這個數字,使之更加切合實際)

而且當你要分離的玩家:

player.constraints=[] 
0

有兩種方法可以做到這一點。

您可以使用關節,因爲這裏詳述How to create joints in Sprite Kit (Xcode)?

或者,你可以從世界中刪除玩家節點,並將其添加爲車輛的子節點,在這種情況下,車輛節點和玩家的節點會鏈接並將一起移動。用removeChildWithName()addChild()做到這一點。

+0

car.addChild(播放器)是這樣的嗎?當我這樣做時,它移動相同,但位置不同,我不知道爲什麼,我試圖改變與player.position = CGPointMake(),但由於某種原因,不工作? – DNC 2014-11-25 23:30:23

+0

「職位不同」是什麼意思?我假設你希望玩家在賽車運動時能夠被賽車「撞擊」並坐在發動機罩上,對嗎?將玩家添加爲小孩將使玩家保持在與汽車碰撞的相同位置。 – jonogilmour 2014-11-26 00:06:39

+0

當你設置玩家的位置時,它會將其設置爲相對於父級。所以你需要記住它不再是相對於世界的定位,而是相反的。 – jonogilmour 2014-11-26 00:08:09

相關問題