Обнаружение столкновения спрайтов без отскока в SpriteKit
Я новичок в кодировании с SpriteKit / Swift и имею следующую проблему: Персонаж должен собирать монеты, прыгая в них. Нет проблем в обнаружении столкновения и избавлении от собранной монеты, но мой персонаж отскакивает от монеты, прежде чем она исчезнет.
персонаж должен пролететь через монету и собрать ее по пути.
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
спасибо заранее!
решение в комментарии ниже ;)
2 ответов
поведение по умолчанию spritekit заключается в том, что все сталкивается со всем, если битовая маска столкновения не изменяется на 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
это остановит эти объекты от подпрыгивания друг против друга.
вы почти там. Существует третья маска для установки: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;
тело игрока в этом случае обнаруживает контакт как с землей, так и с монетой, но будет сталкиваться только с землей.