Sammle Münzen und füge sie dem Punktelabel im Sprite Kit hinzu

Ich versuche, ein einfaches Punktesystem in mein Spiel zu implementieren, indem ich dieses Tutorial als Referenz verwende:

http: //www.raywenderlich.com/87232/make-game-like-mega-jump-sprite-kit-swift-part-

Das Problem ist, wenn ich versuche, es so zu implementieren, wie es ist, stürzt es in der GameScene.swift in dieser Zeile ab:

 let another = whichNode as! GameObjectNode

Hier sind die Hauptteile des Codes, in denen der Spieler die Münzen sammelt. Ich kann Sie auch zu meinem Repo einladen, wenn Sie genauer hinschauen möchten. Ich weiß, dass es schwierig sein kann, den Code zu betrachten, den ich hier eingefügt habe.

GameObjectNode.swift:

enum CoinType: Int {
  case Normal = 0
  case Special
}

struct CollisionCategoryBitmask {

  static let Player: UInt32 = 0x00
  static let Coin: UInt32 = 0x01
  static let Platform: UInt32 = 0x02
}

class GameObjectNode: SKNode {

func collisionWithPlayer(player: SKNode) -> Bool {
    return false
}

func checkNodeRemoval(playerY: CGFloat) {
    if playerY > self.position.y + 300.0 {
        self.removeFromParent()
    }
  }
}

class CoinNode: GameObjectNode {

let coinSound = SKAction.playSoundFileNamed("StarPing.wav", waitForCompletion: false)
var coinType: CoinType!

override func collisionWithPlayer(player: SKNode) -> Bool {
    // Boost the player up
    player.physicsBody?.velocity = CGVector(dx: player.physicsBody!.velocity.dx, dy: 400.0)

    // Play sound
    runAction(coinSound, completion: {
        // Remove this Star
        self.removeFromParent()
    })

    // Award score
    GameState.sharedInstance.score += (coinType == .Normal ? 20 : 100)
    // Award stars
    GameState.sharedInstance.coins += (coinType == .Normal ? 1 : 5)

    // The HUD needs updating to show the new stars and score
    return true
  }
}

GameState.swift

class GameState {
  var score: Int
  var highScore: Int
  var coins: Int

  init() {
    // Init
    score = 0
    highScore = 0
    coins = 0

    // Load game state
    let defaults = NSUserDefaults.standardUserDefaults()

    highScore = defaults.integerForKey("highScore")
    coins = defaults.integerForKey("coins")
  }

  func saveState() {
    // Update highScore if the current score is greater
    highScore = max(score, highScore)

    // Store in user defaults
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setInteger(highScore, forKey: "highScore")
    defaults.setInteger(coins, forKey: "coins")
    NSUserDefaults.standardUserDefaults().synchronize()
  }

  class var sharedInstance: GameState {
    struct Singleton {
        static let instance = GameState()
    }

    return Singleton.instance
  }
}

Und die GameScene.swift:

import SpriteKit
import CoreMotion
import GameplayKit

struct PhysicsCategory {
 static let None: UInt32              = 0
 static let Player: UInt32            = 0b1      // 1
 static let PlatformNormal: UInt32    = 0b10     // 2
 static let PlatformBreakable: UInt32 = 0b100    // 4
 static let CoinNormal: UInt32        = 0b1000   // 8
 static let CoinSpecial: UInt32       = 0b10000  // 16
 static let Edges: UInt32             = 0b100000 // 32
}

class GameScene: SKScene, SKPhysicsContactDelegate {
 // Other Properties
  ...

 var player: SKSpriteNode!

 // HUD 
 var hudNode: SKNode!
 var lblScore: SKLabelNode!
 var lblCoins: SKLabelNode!

 override func didMoveToView(view: SKView) {
 ....
  // HUD
   hudNode = SKNode()
   hudNode.zPosition = 1000
   cameraNode.addChild(hudNode)

  // Coins
   let coin = SKSpriteNode(imageNamed: "powerup05_1")
   coin.position = convertPoint(CGPoint(x: 300, y: self.size.height-100), toNode: cameraNode)
   coin.zPosition = 1000
   hudNode.addChild(coin)

   lblCoins = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
   lblCoins.fontSize = 70
   lblCoins.fontColor = SKColor.whiteColor()
   lblCoins.position = convertPoint(CGPoint(x: 375, y: self.size.height-100), toNode: cameraNode)
   lblCoins.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Left
   lblCoins.zPosition = 1000
   lblCoins.text = String(format: "X %d", GameState.sharedInstance.coins)
   hudNode.addChild(lblCoins)

   // Score
   // 4
   lblScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
   lblScore.fontSize = 70
   lblScore.fontColor = SKColor.whiteColor()
   lblScore.position = convertPoint(CGPoint(x: self.size.width-325, y: self.size.height-100), toNode: cameraNode)
   lblScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Right
   lblScore.zPosition = 1000
   lblScore.text = "0"
   hudNode.addChild(lblScore)
}

 func setupNodes() {
  ...
    player = fgNode.childNodeWithName("Player") as! SKSpriteNode
 }

   func createStarAtPosition(position: CGPoint, ofType type: CoinType) -> CoinNode {
    // 1
    let node = CoinNode()
    let thePosition = CGPoint(x: position.x * scaleFactor, y: position.y)
    node.position = thePosition
    node.name = "NODE_COIN"

    // 2
    node.coinType = type
    var sprite: SKSpriteNode
    if type == .Special {
        sprite = SKSpriteNode(imageNamed: "CoinSpecial")
    } else {
        sprite = SKSpriteNode(imageNamed: "Coin")
    }
    node.addChild(sprite)

    // 3
    node.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size.width / 2)

    // 4
    node.physicsBody?.dynamic = false
    node.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Coin
    node.physicsBody?.collisionBitMask = 0
    node.physicsBody?.contactTestBitMask = 0

    return node
   }

 func didBeginContact(contact: SKPhysicsContact) {

    let other = contact.bodyA.categoryBitMask == PhysicsCategory.Player ? contact.bodyB : contact.bodyA

    var updateHUD = false

    let whichNode = (contact.bodyA.node != player) ? contact.bodyA.node : contact.bodyB.node
    // Code crashes here
    let another = whichNode as! GameObjectNode

    updateHUD = another.collisionWithPlayer(player)

    if updateHUD {
        lblCoins.text = String(format: "X %d", GameState.sharedInstance.coins)
        lblScore.text = String(format: "%d", GameState.sharedInstance.score)
    }

   switch other.categoryBitMask {
     case PhysicsCategory.CoinNormal:
       if let coin = other.node as? SKSpriteNode {
         emitParticles("CollectNormal", sprite: coin)
         jumpPlayer()
         runAction(soundCoin)
    }
     case PhysicsCategory.CoinSpecial:
       if let coin = other.node as? SKSpriteNode {
         emitParticles("CollectSpecial", sprite: coin)
         boostPlayer()
         runAction(soundBoost)
     }
    case PhysicsCategory.PlatformNormal:
       if let platform = other.node as? SKSpriteNode {
         if player.physicsBody!.velocity.dy < 0 {
           platformAction(platform, breakable: false)
           jumpPlayer()
           runAction(soundJump)
        }
     }
    case PhysicsCategory.PlatformBreakable:
       if let platform = other.node as? SKSpriteNode {
          if player.physicsBody!.velocity.dy < 0 {
             platformAction(platform, breakable: true)
             jumpPlayer()
             runAction(soundBrick)
      }
    }
       default:
       break;
   }
  }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage