2016-04-15 7 views
2

私はタイマーを動かして画面をタッチすると、「プレイヤー」(中央の円)を増やそうとしています。SpritekitでNSTimerを使ってアクションをどのようにトリガーしますか?

タイマーが0秒を超えると、サイズが大きくなります。タイマーが3秒以上になると、元のスケールサイズに減少し、タイマーが7秒以上になるとリセットされ、これが永久に繰り返されます。

私は間違っていますか?

import SpriteKit 

class GameScene: SKScene { 

    var Center = SKSpriteNode() 
    var Player = SKSpriteNode() 
    var timer = NSTimer() 
    var seconds = 0 

    override func didMoveToView(view: SKView) { 

     Center = SKSpriteNode(imageNamed: "Center") 
     Center.size = CGSize(width: 80, height: 80) 
     Center.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
     self.addChild(Center) 

     Player = SKSpriteNode(imageNamed: "Player") 
     Player.size = CGSize(width: 80, height: 80) 
     Player.position = CGPoint(x: frame.size.width/2, y: frame.size.height/2) 
     self.addChild(Player) 

    } 


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

     timer = NSTimer.scheduledTimerWithTimeInterval(4.0, target: self, selector: #selector(GameScene.playerScaleUp), userInfo: nil, repeats: true) 

     } 

    func playerScaleUp(){ 
     if seconds > 0{ 
      Player.runAction(SKAction.scaleBy(4, duration: 2)) 

     } 

    } 

    func playerScaleDown(){ 
     if seconds > 3{ 
      Player.runAction(SKAction.scaleBy(-4, duration: 2)) 

     } 
    } 

    func resetScale(){ 
     if seconds > 7{ 
      timer.invalidate() 

     } 
    } 

    override func update(currentTime: CFTimeInterval) { 



    } 

} 

答えて

1

これは、いくつかの異なる方法で行うことができる。

update:方法及びその渡さ currentTimeパラメータを使用し、私の例では、使用 SKActions()

2)を用いて

1)

3 )NSTimerを使用してください。これは、シーン、ビュー、またはノードの一時停止状態の影響を受けないので、お勧めしません。続きを読むStackOverflow answer

4)おそらくもう少しですが、私はここで中止します。

私の例では、SKActionを使用しています。これは、どれくらいの時間が経過したかを実際に確認するのではなく、アクションをシーケンス(アクションが順番に実行される場合)とグループ(アクションが並行して構成される場合)に整理することを意味します。それはあなたが様々な状況でSKActionsを使用する方法を学ぶためにあなたを助けることができるので、私はLEGO'sで遊んでいますように、私はSKActionsを使用することを意味します:)ここで

はコードです...私は、意図的にデバッグコードを残しました。だからここ

class GameScene: SKScene, SKPhysicsContactDelegate { 

    let player = SKSpriteNode(color: .blackColor(), size: CGSize(width: 50, height: 50)) 

    var timePassed = 0.0 { 
     didSet { 
      self.label.text = String(format: "%.1f",timePassed) 
     } 
    } 

    let label = SKLabelNode(fontNamed: "ArialMT") 

    override func didMoveToView(view: SKView) { 

     /* Debugging - Not really needed, I added it just because of a better example */ 
     let wait = SKAction.waitForDuration(0.1) 

     let updateLabel = SKAction.runBlock({[unowned self] in self.timePassed += wait.duration}) 

     self.label.position = CGPoint(x: frame.midX, y: frame.midY+100.0) 
     addChild(self.label) 
     let timerSequence = SKAction.sequence([updateLabel, wait]) 
     self.runAction(SKAction.repeatActionForever(timerSequence), withKey: "counting") 

     //This is used later, at the end of scaleUpAndDownSequence to reset the timer 
     let resetTimer = SKAction.runBlock({[unowned self] in self.timePassed = 0.0}) 


     /* End Debugging */ 


     self.player.position = CGPoint(x: frame.midX, y: frame.midY) 
     addChild(self.player) 

     let waitBeforeScaleToOriginalSize = SKAction.waitForDuration(3.0) 
     let waitBeforeRestart = SKAction.waitForDuration(4.0) 

     let scaleUp = SKAction.scaleTo(2.0, duration: 1) 
     let scaleDown = SKAction.scaleTo(1.0, duration: 1) 

     let scaleUpGroup = SKAction.group([waitBeforeScaleToOriginalSize, scaleUp]) 
     let scaleDownGroup = SKAction.group([scaleDown, waitBeforeRestart]) 

     //One cycle, scale up, scale down, reset timer 
     let scaleUpAndDownSequence = SKAction.sequence([scaleUpGroup, scaleDownGroup, resetTimer]) 

     let loop = SKAction.repeatActionForever(scaleUpAndDownSequence) 

     self.player.runAction(loop, withKey: "scalingUpAndDown") 
    } 
} 

、私はアクションの2つのグループを持っている:アクションの

1)scaleUpGroup

2)scaleDownGroup

scaleUpGroupグループはそれに2つのアクションがあります:scaleUpアクションをし、スケールダウンアクションが発生する前にどれだけ待つべきかを示すアクション。すぐにスケールアップを実行したいので、waitBeforeScaleToOriginalSizeと並列に実行します。

同じロジックがscaleDownGroupになります。 scaleUpGroupが終了すると(その継続時間はlongest action in the groupで決定されます)、scaleDownGroupが開始され、プレイヤーをデフォルトサイズに縮尺し、全体を繰り返すのに一定の時間を待ちます。ここで

結果である:

Scaling Up and Down

私はタッチのアニメーションを開始(私はそのコードを削除した)、あなたが見ることができるように、スケールアップアニメーションが再生後、3秒後、直ちに開始元のサイズに縮小され、4秒後にはアニメーション全体が繰り返されます(プレーヤーは再びスケールアップされます)。

+0

ありがとうございました!トップマン。 –

+0

@ddramondあなたは歓迎です:)この回答があなたの問題の解決に役立つ場合は、それを合格とマークしてください。これは[this](http://stackoverflow.com/help/accepted-answer)を読むと便利です。 – Whirlwind

関連する問題