2015-09-26 36 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)”。

换句话说,由于没有指定边缘循环的大小,您的节点可能正在通过边缘循环下降