2017-07-10 17 views
2

これは、ball()クラスの単純なゲームからのものです。このクラスは、ただひとつのボールのテクスチャを囲んでいるボールのテクスチャに置き換える、関数shieldOn()を持っています。シールド。クラスからのSpriteKit呼び出し関数

ボールがGameSceneで、次のように作成されます。ここでは

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

はボールのクラスは、私が持っていない私のコード(GameScene.swift)のメインセクションで

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") 
    } 
} 

ですボールを参照してください。だから私は画面上のすべてのノードを順番に調べて、下のように一致するものをキャストしようとします。ボールにSKSpriteNode型の値をキャストできないというエラーが表示されてクラッシュします。

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

私は幸運のないいくつかのバリエーションを試しました。私は少なくとも正しい方向に取り組んでいますか?ありがとう!

答えて

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) 
} 
+0

確かに別の良い点。手助けするupvoteを持ってください。 – Siriss

+0

これは物事を説明しますが、悲しいことに、ボール変数は1つしかなく、ボール型です。 – squarehippo10

+0

本当の質問はボールですボールクラス、カスタムクラスをダブルチェックする必要があります – Knight0fDragon

1

おそらく、これを行うより良い方法は、すべてのボールの配列を作成してシーンに追加することです。その後、配列を繰り返し処理し、テクスチャを更新することができます。画面上でそれらを列挙する必要はありません。スプライトが数多くあるとパフォーマンスが低下する可能性があります。

あなたはこのバグの影響を受ける可能性があるように限り、あなたのコードが行くように、それが見えます:

ボールクラス:私はあなたがこのような何かをしたいと思います新しい情報で

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

+0

一度に画面にボールが1つしかないので、配列がおそらく役に立たないでしょう。私はあなたのポストでフォーラムからの回答を試みました - それはどちらも役に立たなかった。しかし、私は努力を感謝します! – squarehippo10

関連する問題