时间:2017-07-10 18:40:28

标签: swift class sprite-kit skspritenode

这是来自SpriteKit中的一个简单游戏,其中Ball()类具有一个功能shieldOn(),目前,它只是将单个球的纹理替换为由盾牌包围的球的纹理。

球在GameScene中创建如下:

func getBall() {
   let ball = Ball()
   ball.createBall(parentNode: self)
}

这是Ball类

class Ball: SKSpriteNode {

   func createBall(parentNode: SKNode) {
      let ball = SKSpriteNode(texture: SKTexture(imageNamed: "ball2"))
      ball.physicsBody = SKPhysicsBody(circleOfRadius: 25)
      ball.name = "ball"
      parentNode.addChild(ball)
      ball.size = CGSize(width: 50, height: 50)
      ball.position = CGPoint(x: 20, y: 200)

      launch(spriteNode: ball, parentNode: parentNode)
   }


   private func launch(spriteNode: SKSpriteNode, parentNode: SKNode) {
      spriteNode.physicsBody?.applyImpulse(CGVector(dx: 5, dy: 0))
   }

   func shieldOn() {
      self.texture = SKTexture(imageNamed: "ballShield")
   }

   func shieldOff() {
      self.texture = SKTexture(imageNamed: "ball2")
   }
}

在我的代码的主要部分(GameScene.swift)中,我没有对球的引用。所以我循环浏览屏幕上的所有节点并尝试转换匹配的节点,如下所示。我崩溃了一个错误,说它无法将类型SKSpriteNode的值转换为Ball。

for node in self.children {
   if node.name == "ball" {
      let ball = node as! Ball
      ball.shieldOn()
   }
 }

我尝试了一些没有运气的变化。我至少在朝着正确的方向努力吗?谢谢!

2 个答案:

答案 0 :(得分:3)

根据新信息,我认为你想要这样的东西:

球类:

class Ball: SKSpriteNode{


init() {

    let texture = SKTexture(imageNamed: "ball2")
    let size = CGSize(width: 50, height: 50)

    super.init(texture: texture, color: UIColor.clear, size: size)

    self.name = "ball"
    self.physicsBody = SKPhysicsBody(circleOfRadius: size.height/2)

    self.physicsBody?.applyImpulse(CGVector(dx: 5, dy: 0))

}

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

    func shieldOn() {
        self.texture = SKTexture(imageNamed: "ballShield")
    }

    func shieldOff() {
        self.texture = SKTexture(imageNamed: "ball2")
    }

}

然后用它来创造球:

func getBall() {
    let ball = Ball()
    ball.position = CGPoint(x: 20, y: 200)
    scene?.addChild(ball)
}

答案 1 :(得分:1)

也许更好的方法是保持所有Ball的数组创建并添加到场景中。然后你可以遍历你的数组并更新它们的纹理。您不需要在屏幕上枚举它们,如果有许多移动的精灵,这会降低性能。

就您的代码而言,看起来您可能会受到此错误的影响:

https://forums.developer.apple.com/thread/26362