2015-03-06 4 views
0

Я только что создал очень базовую сцену в SpriteKit, и первая проблема только что появилась.SpriteKit: SKShapeNodes перекрывается

Когда два SKShapeNode входят в контакт, узел игрока перекрывает наземный узел, я не понимаю, почему.

Вот мой код и скриншот:

import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 
    var contentCreated = false 
    var player: SKShapeNode? 

    override func didMoveToView(view: SKView) { 
     if !contentCreated { 
      createSceneContents() 
      contentCreated = true 
     } 
    } 

    func createSceneContents() { 
     self.backgroundColor = SKColor(white: 1.0, alpha: 1.0) 
     self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
     self.physicsWorld.gravity = CGVectorMake(0, -10) 
     self.physicsWorld.contactDelegate = self 

     let groundCategory: UInt32 = 0x1 << 0 
     let playerCategory: UInt32 = 0x1 << 0 

     let ground = SKShapeNode(rect: CGRectMake(0, 0, self.frame.width, 50)) 
     ground.fillColor = UIColor.blueColor() 
     ground.lineWidth = 0 
     ground.position = CGPoint(x: 0, y: 0) 
     ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.frame.size) 
     ground.physicsBody?.dynamic = false 
     ground.physicsBody?.categoryBitMask = groundCategory 
     ground.physicsBody?.collisionBitMask = groundCategory 
     ground.physicsBody?.contactTestBitMask = groundCategory 
     self.addChild(ground) 

     player = SKShapeNode(rect: CGRectMake(0, 0, 30, 30)) 
     player?.fillColor = UIColor.blackColor() 
     player?.lineWidth = 0 
     player?.position = CGPoint(x: 20, y: 400) 
     player?.physicsBody = SKPhysicsBody(rectangleOfSize: player!.frame.size) 
     player?.physicsBody?.mass = 1.0 
     player?.physicsBody?.categoryBitMask = playerCategory 
     player?.physicsBody?.collisionBitMask = playerCategory 
     player?.physicsBody?.contactTestBitMask = playerCategory 
     self.addChild(player!) 
    } 
} 

enter image description here

Спасибо.

+1

Возможно, что ваши физические тела не совпадают с вашими узлами спрайтов - установите 'showPhysics = YES' на ваш SKView – Paulw11

+0

Я догадался, что это как-то связано с физическими телами, но я не знал' showPhysics', очень удобное спасибо! – Skoua

ответ

1

Вы могли бы хотеть иметь различную битовую маску для ground и player:

let groundCategory: UInt32 = 0x1 
let playerCategory: UInt32 = 0x1 << 1 

Тогда вы также можете установить столкновение/контакт битовая маска по-разному:

ground.physicsBody?.categoryBitMask = groundCategory 
ground.physicsBody?.collisionBitMask = playerCategory 
ground.physicsBody?.contactTestBitMask = playerCategory 

player?.physicsBody?.categoryBitMask = playerCategory 
player?.physicsBody?.collisionBitMask = groundCategory 
player?.physicsBody?.contactTestBitMask = groundCategory 

Даже так, вам У тебя уже есть что-то вроде тебя. Однако, если вы включите showPhysics (как это было предложено @Skoua):

physics

Вы можете видеть, что тело физика прикрепляется к нижней левой точки привязки.

Вот как это исправить:

func createSceneContents() { 
    self.backgroundColor = SKColor(white: 1.0, alpha: 1.0) 
    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
    self.physicsWorld.gravity = CGVectorMake(0, -10) 
    self.physicsWorld.contactDelegate = self 

    let groundCategory: UInt32 = 0x1 
    let playerCategory: UInt32 = 0x1 << 1 

    let ground = SKShapeNode(rectOfSize: CGSize(width: self.frame.width, height: 50)) // HERE 
    ground.fillColor = UIColor.blueColor() 
    ground.lineWidth = 0 
    ground.position = CGPoint(x: ground.frame.size.width/2, y: ground.frame.size.height/2) // HERE 
    ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.frame.size) 
    ground.physicsBody?.dynamic = false 
    ground.physicsBody?.categoryBitMask = groundCategory 
    ground.physicsBody?.collisionBitMask = playerCategory 
    ground.physicsBody?.contactTestBitMask = playerCategory 
    self.addChild(ground) 

    player = SKShapeNode(rectOfSize: CGSize(width: 30, height: 30)) // HERE 
    player?.fillColor = UIColor.blackColor() 
    player?.lineWidth = 0 
    player?.position = CGPoint(x: 20, y: 400) 
    player?.physicsBody = SKPhysicsBody(rectangleOfSize: player!.frame.size) 
    player?.physicsBody?.mass = 1.0 
    player?.physicsBody?.categoryBitMask = playerCategory 
    player?.physicsBody?.collisionBitMask = groundCategory 
    player?.physicsBody?.contactTestBitMask = groundCategory 
    self.addChild(player!) 
} 

nowOkay

Не забывайте, что при размещении узла, что точка привязки по умолчанию в нижней левой части сцены.

Смежные вопросы