2015-02-28 10 views
1

Есть монета, и она должна только сталкиваться с игроком, а не нажимать на нее. Вместо этого игрок (палец) получает толчок вниз, и он сталкивается со всем. Вот код:Бит-маска не работает. SpriteKit Swift

var coin=SKSpriteNode(imageNamed: "Coin") 
coin.position=CGPoint(x: xPos, y: yPos) 
coin.physicsBody=SKPhysicsBody(circleOfRadius: 250) 
//coin.physicsBody!.mass=CGFloat(mass); 
coin.xScale=1 
coin.yScale=1 

coin.name="coin"; 
coin.physicsBody?.contactTestBitMask=1 
coin.physicsBody!.collisionBitMask=0 
coin.physicsBody!.categoryBitMask=0 

self.addChild(coin) 

Вот настройки игрока:

Finger.physicsBody?.collisionBitMask=0; 
Finger.physicsBody?.categoryBitMask=0; 
Finger.physicsBody?.contactTestBitMask=1 

ответ

3

Проблема заключается в том, что collisionBitMask монеты устанавливается на categoryBitMask игрока. Позвольте мне демистифицировать три переменные столкновений для вас:

x.categoryBitMask: Это способ дать объекту «х» способ идентифицировать его.

x.collisionBitMask: Здесь вы поместите categoryBitMask вар объектов, которые вы хотите «х», чтобы иметь возможность столкнуться с (врезаться)

x.contactTestBitMask: Здесь вы поместите categoryBitMask вар из объект, который вы хотите что-то сделать, когда они вступают в контакт с «x». ContactTestBitMask вызовет предоставленную apple функцию «didBeginContact», и там вы можете закодировать то, что вы хотите, когда говорите, что монета касается игрока.

Некоторый код, чтобы помочь вам положить кусочки вместе:

var coinCategory: UInt32 = 1 // categories must be type UInt32 
var playerCategory: UInt32 = 2 
var nothingCategory: UInt32 = 3 // some other number for not colliding into anything 

coin.name="coin"; 
coin.physicsBody!.categoryBitMask= coinCategory // set category first 
coin.physicsBody?.contactTestBitMask = playerContact 
coin.physicsBody!.collisionBitMask = nothingCategory // doesn't crash into anything. 
// if you want coins to crash into each other then set their collisionBitMask to the coinCategory 


self.addChild(coin) 

и:

Finger.physicsBody?.categoryBitMask= playerCategory; 
Finger.physicsBody?.collisionBitMask= nothingCategory; 

// This next one only needs to be set on one of the objects when you want the "didBeginContact" function to be called when there is contact 
//Finger.physicsBody?.contactTestBitMask = coinCategory 

удачи!

2

И это лучшая практика, чтобы не использовать целочисленные значения для битовых масок:

var coinCategory: UInt32 = 0x1 << 1 
var playerCategory: UInt32 = 0x1 << 2 
var nothingCategory: UInt32 = 0x1 << 3