2015-09-26 35 views
0

我正在使用Swift在SpriteKit中製作遊戲。我不能爲我的生活找出爲什麼我的節點不會在屏幕上發生碰撞和反彈,就像SKSpriteNode的默認行爲一樣。SpriteKit SKNode不會與邊緣衝突

這裏是我的代碼從三個不同的文件:

GameViewController:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let skView = view as! SKView 
    skView.showsFPS = true 
    skView.showsNodeCount = true 

    let battleScene = CSLevel() 
    battleScene.size = view.frame.size 
    battleScene.scaleMode = .AspectFill 

    skView.presentScene(battleScene) 
} 

CSLevel:

//sorry here's the real code  
class CSLevel: SKScene, SKPhysicsContactDelegate { 

    var myWorld: SKNode! 
    var leader: CSCharacter? 

    override init(size: CGSize) { 
     super.init(size: size) 

     setUpScene() 
     setUpCharacters() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func didMoveToView(view: SKView) { 
     super.didMoveToView(view) 


    } 

    func setUpScene() { 
     //Take care of setting up the world and bring in property list 

     self.anchorPoint = CGPoint(x: 0.5, y: 0.5) //0,0 to 1,1 

     myWorld = SKNode() 
     self.addChild(myWorld) 

     let map = SKSpriteNode(imageNamed: "map") 
     map.position = CGPoint(x: 0, y: 0) 

     myWorld.addChild(map) 

     myWorld.xScale = 1 
     myWorld.yScale = 1 

     //Setup physics 
     self.physicsWorld.gravity = CGVector(dx: 0, dy: -1) 
     self.physicsWorld.contactDelegate = self 

     myWorld.physicsBody = SKPhysicsBody(edgeLoopFromRect: screenFrame) 
     myWorld.physicsBody?.categoryBitMask = wallCategory 
    } 

    func setUpCharacters() { 
     leader = CSCharacter() 
     myWorld.addChild(leader!) 
    } 

    override func update(currentTime: NSTimeInterval) { 

    } 

    func didBeginContact(contact: SKPhysicsContact) { 
     let firstBody = contact.bodyA 
     let secondBody = contact.bodyB 

     if firstBody.categoryBitMask == wallCategory || secondBody.categoryBitMask == wallCategory { 

     } 
    } 
} 

CSCharacter:

class CSCharacter: SKNode { 

    var character: SKSpriteNode! //this will be the actual image you see of the character 

    override init() { 
     super.init() 

     character = SKSpriteNode(imageNamed: "character") 
     self.addChild(character) 

     self.physicsBody = SKPhysicsBody(circleOfRadius: character.frame.size.width/2) 
     self.physicsBody?.dynamic = true 
     self.physicsBody?.restitution = 5 
     self.physicsBody?.allowsRotation = true 

     self.xScale = 2 
     self.yScale = 2 

     self.physicsBody?.categoryBitMask = playerCategory 
     self.physicsBody?.collisionBitMask = wallCategory 
     self.physicsBody?.contactTestBitMask = wallCategory 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

這是一個錯誤或東西?運行Xcode beta 7.1。我實際上遵循了一個教程,它的行爲與那個人的行爲不一樣,即使我爲他正在輸入的函數鍵入函數。任何幫助或澄清讚賞!

回答

0

這裏#(希望這有助於)

嘗試增加 「skView.showsPhysics =真正的」 下方 「skview.showsNodeCount =真正的」 這將自動跟蹤你的左右線physicsbodys。 當你運行你的應用程序時,你應該在你的skscene周圍看到你的邊緣循環處的細藍線。 如果沒有,你可能需要添加一個參數到「let battleScene = CSLevel()」。 因此,「讓battleScene = CSLevel()」現在是「let battleScene = CSLevel(size:skView.frame.size)」。

換句話說,由於沒有指定邊緣循環的大小,您的節點可能正在通過邊緣循環下降