2016-08-10 4 views
0

これまでのところ、私はほとんどゲームを終えました。私は重力のために落ちるボールを持っていて、ボールを飛ばすためにタップします。スプライトがタップされるたびに、+1がスコアに追加されます。ビューロード時に表示される合計3つのボールがあります。各ボールが特定のポイントマーク(人が10ポイントに達すると1つのボールが表示され、プレーヤーが20に達すると別のボールが表示されます)が表示されます。スコアに基づいてスプライトを追加するにはどうすればよいですか?

私はupdate(currentTime: CFTimeInterval)でこれを置くことを試みたが、私はこれで終わる:

enter image description here

(これは10点に来るsecondballある。)無限数存在するよう

らしいですその人が終わりのないカスケードを止める21ポイントに達するまで、あなたはカスケードをタップすると、それはボールを選択し、それが私が望んでいたsortaは飛び出すようになります。

これは

import SpriteKit 

class GameScene: SKScene { 
var ball: Ball! 
var secondball: Ball! 


override func didMoveToView(view: SKView) { 
//=======Ball 1=======// 
    let ball = Ball() 

    ball.position = CGPoint(x:self.frame.midX, y:440) 

    addChild(ball) 



    ball.physicsBody = SKPhysicsBody(circleOfRadius: 90) 
    ball.physicsBody?.dynamic = true 
    ball.physicsBody?.allowsRotation = false 

    ball.physicsBody?.friction = 0 
    ball.physicsBody?.angularDamping = 0 
    ball.physicsBody?.linearDamping = 0 
    ball.physicsBody?.usesPreciseCollisionDetection = true 
    ball.physicsBody!.categoryBitMask = 0 


    //======Ball 2======// 
    let secondball = Ball() 
    secondball.position = CGPoint(x:self.frame.midX * 1.65, y: 440) 
    addChild(secondball) 



    secondball.physicsBody = SKPhysicsBody(circleOfRadius: 90) 
    secondball.physicsBody?.dynamic = false 
    secondball.physicsBody?.allowsRotation = false 

    secondball.physicsBody?.friction = 0 
    secondball.physicsBody?.angularDamping = 0 
    secondball.physicsBody?.linearDamping = 0 
    secondball.physicsBody?.usesPreciseCollisionDetection = true 
    secondball.physicsBody!.categoryBitMask = 0 
} 

class Ball: SKSpriteNode { 



    init() { 
     let texture = SKTexture(imageNamed: "Ball") 
     super.init(texture: texture, color: .clearColor(), size: texture.size()) 
     userInteractionEnabled = true 

    } 


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     let scene = self.scene as! GameScene 
     scene.score += 1 

     physicsBody?.velocity = CGVectorMake(0, 100) 
     physicsBody?.applyImpulse(CGVectorMake(0, 900)) 



    } 

} 

override func update(currentTime: CFTimeInterval) { 


    if (score >= 10){ 
     self.backgroundNode.texture = SKTexture(imageNamed: "orangebackground") 
    } 


    if (score >= 20){ 
     self.backgroundNode.texture = SKTexture(imageNamed: "yellowbackground") 
    } 


    if (score >= 30) { 
     self.backgroundNode.texture = SKTexture(imageNamed: "greenbackground") 
    } 
    if (score >= 40){ 
     self.backgroundNode.texture = SKTexture(imageNamed: "bluebackground") 
    } 
    if (score >= 50){ 
     self.backgroundNode.texture = SKTexture(imageNamed: "darkbluebackground") 
    } 
    if (score >= 60){ 
     self.backgroundNode.texture = SKTexture(imageNamed: "purplebackground") 
    } 
    if (score >= 70){ 
     self.backgroundNode.texture = SKTexture(imageNamed: "brownbackground") 
    } 
    if (score >= 80) { 
     self.backgroundNode.texture = SKTexture(imageNamed: "maroonbackground") 
    } 
    if (score >= 90){ 
     self.backgroundNode.texture = SKTexture(imageNamed: "tanbackground") 
    } 
    if (score >= 100){ 
     self.backgroundNode.texture = SKTexture(imageNamed: "pinkbackground") 
    } 
    if (score >= 125) { 
     self.backgroundNode.texture = SKTexture(imageNamed: "bronzebackground") 
    } 
    if (score >= 150) { 
     self.backgroundNode.texture = SKTexture(imageNamed: "silverbackground") 
    } 
    if (score >= 175) { 
     self.backgroundNode.texture = SKTexture(imageNamed: "goldbackground") 
    } 
    if (score >= 200) { 
     self.backgroundNode.texture = SKTexture(imageNamed: "elitebackground") 

    } 




    } 


} 

答えて

0

更新方法を速く増加スコア次いで呼ばれる(update(CFTimeInterval)機能を除く)GameScene.swiftあります。したがって、更新メソッドの呼び出しのたびに、新しいボールが追加されます。

このような何か試してみてください:

移動更新方法の外のコード行を1つのボールインスタンスを持つグローバル変数にする:更新の内部

let secondball = Ball() 

を:

if (score == 10) && secondball.parent == nil { 
+0

ゲームがクラッシュし、これを実行する場合。 –

+0

もっとコードを投稿できますか? – Stefan

+0

更新を確認してください。実際のシミュレータを動作させるために、コードを元々持っていたコードに戻しました。両方のボールは、ビューが読み込まれるとすぐに表示されます。 –

0

タッチ部分をBallクラスに制御することを選択しました。これは可能ですが便利ではありません。あなたのGameSceneに、次に

ball.name = "ball1" 
self.addChild(ball) 
... 
secondball.name = "ball2" 
secondball.alpha = 0.0 // hide your secondBall at start 
self.addChild(secondball) 

は、あなたのBallクラスからtouchesBeganを移動:すべての

まず作成中に自分のボールに名前を与える

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     let touch = touches.first 
     let positionInScene = touch!.locationInNode(self) 
     let touchedNode = self.nodeAtPoint(positionInScene) 

     if let name = touchedNode.name { 
      switch name { 
      case "ball1": // if you're touching ball1 
       self.score += 1 
       ball.physicsBody?.velocity = CGVectorMake(0, 100) 
       ball.physicsBody?.applyImpulse(CGVectorMake(0, 900)) 
       if score == 10 { 
        ball.removeFromParent() 
        // or make some animation like: 
        //let fadeOut=SKAction.fadeOutWithDuration(1.0) 
        //ball.runAction(fadeOut,completion: { 
        // self.ball.removeFromParent() 
        //}) 
        secondball.alpha = 1 
        // or make some animation like: 
        //let fadeIn=SKAction.fadeInWithDuration(0.5) 
        //secondball.runAction(fadeIn,completion: { 
        // self.secondball.physicsBody?.dynamic = true 
        //}) 
        secondball.physicsBody?.dynamic = true 
       } 
      case "ball2": // if you're touching ball2 
       self.score += 1 
       secondball.physicsBody?.velocity = CGVectorMake(0, 100) // here you can decrease parameters to more difficult 
       secondball.physicsBody?.applyImpulse(CGVectorMake(0, 900)) 
       if score == 20 { 
        // do the same thing maked for ball to show other ball 
       } 
      case "ball3": // if you're touching ball3 
       self.score += 1 
       secondball.physicsBody?.velocity = CGVectorMake(0, 100) // here you can decrease parameters to more difficult 
       secondball.physicsBody?.applyImpulse(CGVectorMake(0, 900))    
       if score == 21 { 
        // do other stuff here 
       } 
      default: 
       break 
      } 
     } 
    } 
+0

は機能していないようです。他のボールがフェードインしてもコードの残りの部分が機能するかどうかはわかりません。 –

+0

ブレークポイントを "switch name"に設定し、スコアが自分の値を上げない理由を確認してください –

+0

なぜ私は分かりません。私は 'case ball1'の' switch name {'にブレークポイントを追加しました。ボールをタップした後も、シミュレーションは引き続き行われます。 –

関連する問題