Обнаружение столкновения спрайтов без отскока в 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;

тело игрока в этом случае обнаруживает контакт как с землей, так и с монетой, но будет сталкиваться только с землей.