2014-09-04 69 views
6

我是SpriteKit/Swift編碼的新手,它有以下問題: 一個角色應該通過跳入硬幣來收集硬幣。檢測碰撞和擺脫收集的硬幣沒有問題,但我的角色在硬幣消失之前會反彈。檢測SpriteKit中沒有反彈的Sprite碰撞

角色應該飛過硬幣並在途中收集它。

let playerCategory: UInt32 = 0x1 << 0 
let coinCategory: UInt32 = 0x1 << 1 

player = SKSpriteNode(texture: playerTexture) 
player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.height/2) 
player.physicsBody?.dynamic = true 
player.physicsBody?.allowsRotation = false 
player.physicsBody?.categoryBitMask = playerCategory 
player.physicsBody?.contactTestBitMask = coinCategory 

var coin:SKSpriteNode = SKSpriteNode(texture: coinTexture) 
coin.physicsBody = SKPhysicsBody(circleOfRadius: coin.size.height/2) 
coin.physicsBody?.dynamic = false 
coin.physicsBody?.allowsRotation = false 
coin.physicsBody?.categoryBitMask = coinCategory 
coin.physicsBody?.contactTestBitMask = playerCategory 

func playerDidCollideWithCoin(player:SKSpriteNode, thisCoin:SKSpriteNode) { 
    thisCoin.removeFromParent() 
    coinsCollected++ 
} 

碰撞檢測工作正常,像這樣的,但正如我所說的,我怎麼能避免的碰撞,並用「飛通過」更換呢?

我正在使用Xcode 6 Beta 7

在此先感謝!

解決方案在下面的評論;)spritekit的

+5

設置collisionBitMask,使其不包含錢幣/玩家類別。如果您不需要硬幣與任何物體碰撞,只需將其設置爲0.請注意接觸(確定重疊)和碰撞(接收來自接觸的衝動)之間的差異。 – LearnCocos2D 2014-09-04 14:25:28

+0

明白了!謝謝!將硬幣collisionBitMap設置爲0,將玩家collisionBitMap設置爲groundCategory,這樣我的玩家就不會落地了。 – MikeB 2014-09-04 14:34:56

回答

4

禰默認行爲是一切的一切碰撞,除非衝突位掩碼更改爲0

更改此值在代碼0在所有那些你不想反彈但收到通知的對象中。

player = SKSpriteNode(texture: playerTexture) 
player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.height/2) 
player.physicsBody?.dynamic = true 
player.physicsBody?.allowsRotation = false 
player.physicsBody?.categoryBitMask = playerCategory 
player.physicsBody?.contactTestBitMask = coinCategory 
player.physicsBody?.collisionBitMask = 0 

var coin:SKSpriteNode = SKSpriteNode(texture: coinTexture) 
coin.physicsBody = SKPhysicsBody(circleOfRadius: coin.size.height/2) 
coin.physicsBody?.dynamic = false 
coin.physicsBody?.allowsRotation = false 
coin.physicsBody?.categoryBitMask = coinCategory 
coin.physicsBody?.contactTestBitMask = playerCategory 
coin.physicsBody?.collisionBitMask = 0 

這將從彈跳互相停止這些對象。

0

你快到了。有第三個要設置的掩碼:collisionBitMask

一個掩碼,用於定義物理實體的哪些類別可以與此物理實體發生碰撞。

鑑於我們已:

enum { 
    Ground = 1, 
    Player = 1<<1, 
    Coin = 1<<2, 
}; 

player.categoryBitMask = Player; 
player.collisionBitMask = Ground; 
player.contactTestBitMask = Ground | Coin; 

ground.categoryBitMask = Ground; 
ground.collisionBitMask = Player; 
ground.contactTestBitMask = Player; 

coin.categoryBitMask = Coin; 
coin.collisionBitMask = 0; 
coin.contactTestBitMask = Player; 

在這種情況下,球員的身體檢測到與地面和硬幣接觸,但僅與地面發生碰撞。