2014-09-04 9 views
6

Jestem nowy w kodowaniu za pomocą SpriteKit/Swift i mam następujący problem: Postać ma zbierać monety, wskakując do nich. Nie ma problemu z wykryciem kolizji i pozbyciem się zebranej monety, ale moja postać odbija monety zanim zniknie.Wykrywanie kolizji Sprite bez odbijania w SpriteKit

Postać ma przelecieć przez monetę i zebrać ją po drodze.

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++ 
} 

Wykrywanie kolizji działa dobrze, ale tak jak powiedziałem, w jaki sposób można uniknąć wpadając i zastąpić go z "latające"?

Używam Xcode 6 Beta 7

Z góry dziękuję!

Rozwiązanie w komentarzu poniżej;) domyślne zachowanie

+5

Ustaw właściwość collisionBitMask, aby nie uwzględniała kategorii monet/odtwarzaczy. Jeśli nie potrzebujesz monet, aby zderzyć się z czymkolwiek, po prostu ustaw je na 0. Zauważ różnicę między kontaktami (określ zakładkę) i kolizją (odbierz impuls od kontaktu). – LearnCocos2D

+0

Gotowy! dzięki! Ustaw collision monety BITMap na 0, a gracz collisionBitMap na groundCategory, aby mój odtwarzacz nie spadł na ziemię. – MikeB

Odpowiedz

4

Thee z spritekit jest to, że wszystko zderza się ze wszystkim, o ile bit maski kolizja jest zmiana 0.

zmienić tę wartość w kodzie 0 we wszystkich obiektach, których nie chcesz odbić, ale otrzymasz od nich powiadomienia.

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 

To zatrzyma te obiekty od odbijając przed siebie.

0

Już prawie jesteś. Jest trzecia maska ​​do ustawienia: collisionBitMask

Maska, która określa, które kategorie ciał fizyki mogą kolidować z tym ciałem fizyki.

Biorąc pod uwagę, że mamy:

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; 

Ciało gracz w tym przypadku wykrywa kontakt zarówno z ziemi i monety, ale tylko zderzają się z ziemi.