2014-09-04 21 views
6

Sono nuovo nella codifica con SpriteKit/Swift e ho il seguente problema: Un personaggio dovrebbe raccogliere monete saltandoci sopra. Non c'è alcun problema nel rilevare la collisione e liberarsi della moneta raccolta, ma il mio personaggio rimbalza della moneta prima che scompaia.Rileva Sprite Collision senza rimbalzare in SpriteKit

Il personaggio dovrebbe volare attraverso la moneta e raccoglierla durante il tragitto.

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

rilevamento delle collisioni funziona bene come questo, ma come ho detto, come posso evitare l'urto di e sostituirlo con un "volo attraverso"?

sto usando Xcode 6 Beta 7

Grazie in anticipo!

Solution nel commento qui sotto;)

+5

Impostare collisionBitMask in modo che non includa la categoria di monete/giocatori. Se non hai bisogno di monete per scontrarsi con qualcosa basta impostarlo su 0. Nota la differenza tra contatto (determinare sovrapposizione) e collisione (ricevere impulso dal contatto). – LearnCocos2D

+0

Trovato! Grazie! Metti la moneta scontroBitMap a 0 e il giocatore collisionBitMap a GroundCategory in modo che il mio giocatore non cada dal terreno. – MikeB

risposta

4

Te comportamento predefinito di spritekit è che tutto si scontra con tutto meno che la maschera di collisione bit è il cambiamento a 0.

modificare questo valore nel codice a 0 in tutti quegli oggetti che non vuoi rimbalzare ma ricevere notifiche da loro.

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 

Questo fermerà quegli oggetti da rimbalzare contro l'altro.

0

Sei quasi arrivato. C'è la terza maschera per impostare: collisionBitMask

Una maschera che definisce le categorie di organismi fisica possono collidere con questo corpo fisica.

Dato che abbiamo:

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; 

Il corpo giocatore in questo caso rileva il contatto sia con terra e moneta, ma si scontrerà solo con il terreno.