这是来自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()
}
}
我尝试了一些没有运气的变化。我至少在朝着正确的方向努力吗?谢谢!
答案 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的数组创建并添加到场景中。然后你可以遍历你的数组并更新它们的纹理。您不需要在屏幕上枚举它们,如果有许多移动的精灵,这会降低性能。
就您的代码而言,看起来您可能会受到此错误的影响: