2016-01-20 47 views
0

下面是代码:skphysicsbody到skspritenode错误

import SpriteKit 
import CoreMotion 

struct PhysicsCatagory { 
    static let Player :UInt32 = 0x1 << 0 
    static let shark :UInt32 = 0x1 << 1 
    static let jellyfish :UInt32 = 0x1 << 2 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    var Player = SKSpriteNode() 
    var game = true 
    var playerPos = false 
    var ScoreCount = 0 
    let myLabel = SKLabelNode(fontNamed: "3D-Thirteen-Pixel-Fonts") 
    var HighScore = 0 
    let DisplayScore = SKLabelNode(fontNamed: "3D-Thirteen-Pixel-Fonts") 
    let LeaderBoardScore = SKLabelNode(fontNamed: "3D-Thirteen-Pixel-Fonts") 
    let LeaderBoardHighscore = SKLabelNode(fontNamed: "3D-Thirteen-Pixel-Fonts") 
    var CheckGameState = false 
    let playButton = SKSpriteNode(imageNamed: "Play") 
    let Scores = SKSpriteNode(imageNamed: "LeaderBoard") 
    var PlayerUpState = false 
    var PlayerDownState = false 
    var ifPlayerDrawJustCalled = false 
    var TextureAtlas = SKTextureAtlas() 
    var TextureArray = [SKTexture]() 
    var TextureAtlas2 = SKTextureAtlas() 
    var TextureArray2 = [SKTexture]() 
    var TextureAtlas3 = SKTextureAtlas() 
    var TextureArray3 = [SKTexture]() 
    var motionManager: CMMotionManager! 
    var fishYpos = 115.0 
    let shark = SKSpriteNode(imageNamed: "shark") 
    let jellyfish = SKSpriteNode(imageNamed: "jellyfish") 



    override func didMoveToView(view: SKView) { 

     print("called") 

     motionManager = CMMotionManager() 
     motionManager.startGyroUpdates() 
     motionManager.gyroUpdateInterval = 0.02 




     backgroundColor = UIColor(red: 0.0, green: 7.0, blue: 1.0, alpha: 1.0) 
     let HighscoreDefault = NSUserDefaults.standardUserDefaults() 
     if(HighscoreDefault.valueForKey("Highscore") != nil){ 
      HighScore = HighscoreDefault.valueForKey("Highscore") as! Int 
     } 


     TextureAtlas = SKTextureAtlas(named: "Images") 
     TextureArray.append(SKTexture(imageNamed: "win_1.png")) 
     TextureArray.append(SKTexture(imageNamed: "win_2.png")) 
     TextureArray.append(SKTexture(imageNamed: "win_3.png")) 
     TextureArray.append(SKTexture(imageNamed: "win_4.png")) 


     TextureAtlas3 = SKTextureAtlas(named: "Images") 
     TextureArray3.append(SKTexture(imageNamed: "jellyfish_1.png")) 
     TextureArray3.append(SKTexture(imageNamed: "jellyfish_2.png")) 
     TextureArray3.append(SKTexture(imageNamed: "jellyfish_3.png")) 
     TextureArray3.append(SKTexture(imageNamed: "jellyfish_4.png")) 
     TextureArray3.append(SKTexture(imageNamed: "jellyfish_5.png")) 
     TextureArray3.append(SKTexture(imageNamed: "jellyfish_6.png")) 
     TextureArray3.append(SKTexture(imageNamed: "jellyfish_7.png")) 
     TextureArray3.append(SKTexture(imageNamed: "jellyfish_8.png")) 


     TextureAtlas2 = SKTextureAtlas(named: "Images") 
     TextureArray2.append(SKTexture(imageNamed: "shark_1.png")) 
     TextureArray2.append(SKTexture(imageNamed: "shark_2.png")) 
     TextureArray2.append(SKTexture(imageNamed: "shark_3.png")) 
     TextureArray2.append(SKTexture(imageNamed: "shark_4.png")) 
     TextureArray2.append(SKTexture(imageNamed: "shark_5.png")) 
     TextureArray2.append(SKTexture(imageNamed: "shark_6.png")) 




     Player = SKSpriteNode(imageNamed: TextureAtlas.textureNames[0]) 



     self.physicsWorld.contactDelegate = self 

     Player.zPosition = 10.0 




     Player.position = CGPoint(x: 80, y: fishYpos) 
     Player.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 30, height: 30)) 
     Player.physicsBody?.dynamic = false 
     Player.physicsBody?.affectedByGravity = false 


     myLabel.text = "\(ScoreCount)" 
     myLabel.fontSize = 70 
     myLabel.position = CGPointMake(CGRectGetMidX(self.frame), frame.size.height-150) 
     myLabel.zPosition = 18.0 
     addChild(myLabel) 

     addChild(Player) 

     Player.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(TextureArray, timePerFrame: 0.20))) 


     var BubbleTimer = NSTimer.scheduledTimerWithTimeInterval(1, target:self,selector: "addBubble", userInfo: nil, repeats: true) 
     var Gyro = NSTimer.scheduledTimerWithTimeInterval(0.02, target:self,selector: "gyroFunction", userInfo: nil, repeats: true) 
     var MainTimer1 = NSTimer.scheduledTimerWithTimeInterval(1, target:self,selector: "RunTimeTimer", userInfo: nil, repeats: true) 
     var sharkTimer = NSTimer.scheduledTimerWithTimeInterval(0.70, target: self, selector: "RunSharkTimer", userInfo: nil, repeats: true) 
     var jellyfishTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "RunJellyfishTimer", userInfo: nil, repeats: true) 
    } 





    func addBubble(){ 

     let randomNum1 = Int(arc4random_uniform(3)) 

     if(randomNum1 == 2){ 
      let randomNum2 = Int(arc4random_uniform(2)) 
      if(randomNum2 == 1){ 
       let Bubble1 = SKSpriteNode(imageNamed: "Bubble1") 
       Bubble1.position.x = Player.position.x+9 
       Bubble1.position.y = Player.position.y 
       Bubble1.zPosition = 2.0 
       addChild(Bubble1) 
       Bubble1.runAction(SKAction.moveToY(frame.size.height+20, duration: 3.0)) 
      } 
      if(randomNum2 == 0){ 
       let Bubble2 = SKSpriteNode(imageNamed: "Bubble2") 
       Bubble2.position.x = Player.position.x+9 
       Bubble2.position.y = Player.position.y 
       Bubble2.zPosition = 3.0 
       addChild(Bubble2) 
       Bubble2.runAction(SKAction.moveToY(frame.size.height+20, duration: 3.0)) 

      } 
     } 
    } 


    func RunTimeTimer(){ 
     if(game == true){ 
      timer() 
     } 
    } 

    func RunSharkTimer(){ 
     if(game == true){ 
      addShark() 
     } 
    } 

    func RunJellyfishTimer(){ 
     if(game == true){ 
      addJellyfish() 
     } 
    } 

    func gyroFunction(){ 

     if let gyro_y = motionManager.gyroData?.rotationRate.y { 
      if(fishYpos+gyro_y*(-10) > 115){ 
       if(CGFloat(fishYpos+gyro_y*(-10)) < frame.size.height-115){ 

       fishYpos = fishYpos+gyro_y*(-10) 

       let fishAction = SKAction.moveToY(CGFloat(fishYpos), duration: 0.05) 
       Player.runAction(fishAction) 


       } 
      } 
     } 
    } 





    func didBeginContact(contact: SKPhysicsContact) { 

     let firstBody = contact.bodyA as! SKSpriteNode 
     let secondBody = contact.bodyB as! SKSpriteNode 




     if(((firstBody.name == "Player") && (secondBody.name == "shark")) || (firstBody.name == "shark") && (secondBody.name == "Player") || ((firstBody.name == "Player") && (secondBody.name == "jellyfish")) || (firstBody.name == "jellyfish") && (secondBody.name == "Player")){ 


     game = false 
     if(CheckGameState == false){ 

      playButton.xScale = 1.9 
      playButton.yScale = 1.9 
      playButton.zPosition = 12.0 
      playButton.position = CGPoint(x: frame.midX-50, y: frame.midY-140) 
      playButton.name = "playButton" 
      playButton.userInteractionEnabled = false 
      addChild(playButton) 
      if(ScoreCount>HighScore){ 
       HighScore = ScoreCount 
       let HighscoreDefault = NSUserDefaults.standardUserDefaults() 
       HighscoreDefault.setInteger(HighScore, forKey: "Highscore") 
      } 

      LeaderBoardScore.text = "\(ScoreCount)" 
      LeaderBoardHighscore.text = "\(HighScore)" 

      LeaderBoardHighscore.position = CGPoint(x: frame.midX+30 , y: frame.midY+5) 
      LeaderBoardHighscore.xScale = 2.0 
      LeaderBoardHighscore.yScale = 2.0 
      LeaderBoardHighscore.zPosition = 15.0 
      LeaderBoardHighscore.fontColor = UIColor.purpleColor() 
      LeaderBoardScore.position = CGPoint(x: frame.midX+60 , y: frame.midY+72) 
      LeaderBoardScore.fontColor = UIColor.purpleColor() 
      LeaderBoardScore.xScale = 2.0 
      LeaderBoardScore.zPosition = 15.0 
      LeaderBoardScore.yScale = 2.0 
      addChild(LeaderBoardHighscore) 
      addChild(LeaderBoardScore) 
      Scores.xScale = 2 
      Scores.yScale = 2 
      Scores.zPosition = 11.0 
      Scores.position = CGPoint(x: frame.midX, y: frame.midY) 
      addChild(Scores) 
      CheckGameState = true 

      } 
     } 

    } 




    func addShark(){ 

     Player.physicsBody?.collisionBitMask = PhysicsCatagory.shark 
     Player.physicsBody?.contactTestBitMask = PhysicsCatagory.shark 
     Player.name = "Player" 
     Player.physicsBody?.dynamic = true 
     Player.physicsBody?.affectedByGravity = false 

     let randomNumShark = arc4random_uniform(2) 
     if(randomNumShark == 1){ 
      let shark = SKSpriteNode(imageNamed: "shark_1.png") 


      shark.position.x = frame.size.width 
      let PositionY = arc4random_uniform(UInt32(frame.size.height)) 
      shark.position.y = CGFloat(PositionY) 
      addChild(shark) 
      let sharkGoForward = SKAction.moveToX(CGFloat(-1100), duration: 1.5) 
      shark.runAction(sharkGoForward) 
      shark.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: shark.size.width, height:shark.size.height)) 
      shark.physicsBody?.categoryBitMask = PhysicsCatagory.Player 
      shark.physicsBody?.contactTestBitMask = PhysicsCatagory.Player 
      shark.physicsBody?.collisionBitMask = PhysicsCatagory.Player 
      shark.physicsBody?.dynamic = true 
      shark.physicsBody?.affectedByGravity = false 
      shark.name = "shark" 
      shark.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(TextureArray2, timePerFrame: 0.05))) 


     } 

    } 

    func addJellyfish(){ 
      Player.physicsBody?.collisionBitMask = PhysicsCatagory.jellyfish 
      Player.physicsBody?.contactTestBitMask = PhysicsCatagory.jellyfish 
      Player.name = "Player" 
      Player.physicsBody?.dynamic = true 
      Player.physicsBody?.affectedByGravity = false 


      let randomNumJelly = arc4random_uniform(2) 
      if(randomNumJelly == 1){ 
       let jellyfish = SKSpriteNode(imageNamed: "jellyfish") 
       jellyfish.position.y = 0 
       let PositionX = arc4random_uniform(UInt32(frame.size.width)) 
       jellyfish.position.x = CGFloat(PositionX) 
       addChild(jellyfish) 
       let jellyfishGoUp = SKAction.moveToY(CGFloat(frame.size.height+100), duration: 2.0) 
       jellyfish.runAction(jellyfishGoUp) 
       jellyfish.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: jellyfish.size.width, height:jellyfish.size.height)) 
       jellyfish.physicsBody?.categoryBitMask = PhysicsCatagory.Player 
       jellyfish.physicsBody?.contactTestBitMask = PhysicsCatagory.Player 
       jellyfish.physicsBody?.collisionBitMask = PhysicsCatagory.Player 
       jellyfish.physicsBody?.dynamic = true 
       jellyfish.physicsBody?.affectedByGravity = false 
       jellyfish.name = "jellyfish" 
       jellyfish.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(TextureArray3, timePerFrame: 0.05))) 

      } 






     } 











    func timer(){ 
     if(game == true){ 

      ScoreCount++ 
      myLabel.text = "\(ScoreCount)" 
     } 
    } 



    func rePositionPlayer(){ 
     Player.removeFromParent() 
     Player.position = CGPoint(x: 80, y: 220) 
     addChild(Player) 
    } 


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 


     for touch in (touches) { 

      let location = touch.locationInNode(self) 

      if(game == false){ 
       if playButton.containsPoint(location){ 
        game = true 
        LeaderBoardHighscore.removeFromParent() 
        LeaderBoardScore.removeFromParent() 
        playButton.removeFromParent() 
        Scores.removeFromParent() 
        CheckGameState = false 
        rePositionPlayer() 
        ScoreCount = 0 
        fishYpos = 220 
       } 
      } 


      if(game == true){ 

      } 
     } 
    } 

    override func update(currentTime: CFTimeInterval) { 

    } 
} 

我的错误是在该行

let secondbody = contact.bodyB as! SKSpriteNode 

它说

可以投SKPhysicsBody到unrealted SKSpriteNode

如何解决这个问题?

回答

0

试着说let secondbody.node = contact.bodyB as! SKSpriteNode