2016-08-02 12 views
3

私はSwiftで最初のゲームを構築しています。スクリーンスプライトを複数同時に処理する方法を知りたかったのです。私のゲームはスプライトを画面に連続的にプッシュします。addChildが連続しているので、一度に多くのアクティブがあります。一度にすべての敵のスプライトの物理特性に影響を与えたいと思うように、私は同時にそれらのすべてに同時に影響を及ぼす適切な方法がないことに気付きました。これまでのところ、空の配列var enemySprites = [enemyType1]()GameSceneの先頭に作成し、appendingのスプライトインスタンスにaddChildを使用して直接シーンに描画しました。しかし、私は通じ単にループすることができないんだとしてスクリーニングするために、それらを描く:画面上のスプライトグループを正しく管理する方法

for enemy in enemySprites{ 
     addChild(enemy) 
    } 

コードのこのビットはoverride func update(currentTime: CFTimeInterval)機能であるので、多分私はちょうどそれを置き忘れていますか?これについてどうやって行くのかについての助けがあれば素晴らしいでしょう!

+0

簡単です。彼らに名前を与え、その名前でそれらを列挙してください。または、それらを配列に保ち、その配列をループします。シーンにスプライトを追加するには配列をループする必要がありますが、update:メソッド(これは毎秒60回実行されます)ではそうしたくないかもしれません。また、スプライトに追加する前に親があるかどうかを確認することもできます。 – Whirlwind

+0

@whirlwindどこでそれをやるべきですか?新しい敵をプッシュし、古い(殺した)ものを削除する必要があるので、配列は絶えず更新されていますので、配列をループしてシーンに 'addChild(newEnemy) 'するか、 (物理特性のように)それらのすべてを一度に有効にすることもできます。 – Sam

+1

これは達成しようとしていることによって異なります。私はあなたが望むものを実際に得ることはできませんが、@AlessandroOrnanoがあなたに正しい方向を教えてくれたようです。たとえば、特定の連絡先が発生したときにすべてのノードに影響を与えたい場合は、didBeginContactまたは同様のメソッドでノードを列挙する必要があります。または、同じことをしたい場合でも、ユーザーが画面にタッチすると、touchesBeganでその操作を行います。または、特定のアニメーションが完了した後でこれを行う場合は、そのアニメーションの完了ハンドラで行います。それはあなた次第です。 – Whirlwind

答えて

1

サム、

はここにいくつかありますあなたの人生が0になったときに敵を更新するサンプルコード:

、私たちはまず、あなたはすべての命を失うときに我々は関数を呼び出すことができるようにlivesプロパティのプロパティのオブザーバを設定します、

var lives = 3 { 
    didSet { 
     if lives == 0 { 
     updateEnemies() 
    } 
} 

をそして、すべての敵の上に列挙し、(0にそれぞれ1の速度を変更する機能0):

func update enemies() { 
     enumerateChildNodesWithName("type1") { 
      node, stop in 
      let enemy = node as! SKSpriteNode 
      enemy.physicsBody?.velocity = CGVector(dx: 0, dy: 0) 
     } 
} 
+0

ありがとう、私は実際にこれに非常に類似した何かにつまずいた。とにかくあなたは 'のように'! 'を' 'のように説明できますか?基本的に、 'node'型の変数の敵を' SKSpriteNode'の型に型変換していることを理解していますが、なぜオプションの '!'が必要なのか分かりません。また、もし私が研究をしてしまって、それを完全に得ることができないため、あなたがオプションのために推薦するリソースがあれば。 (「船」の代わりに「命」を意味しましたか?)とにかく、もう一度ありがとう! – Sam

+0

@Sam申し訳ありません、それは私のコードからそれを取った船ではなく、人生です。私は他のものを見てみましょうが、SOの選択肢について多くの説明があります。 –

1

updateメソッドを使用する代わりに、タイマーを使用できます。ソースから:あなたはアップルガイドに従うならば

public class func scheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> NSTimer 

だから、それは例えば次のようになります。

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("spawnAlien:"), userInfo: myParameter, repeats: true) 

func spawnAlien(timer : NSTimer) { 
     if let myUserInfo = timer.userInfo { 
     print(myUserInfo) // a parameters passed to help you to the alien creation 
     } 
     timer.invalidate() 
} 

しかしWhirlwindによると、私は彼と一緒にしてLearnCocos2d仕事、スプライトキット丼に同意しますタイマ(詳しくはLearnCocos2dのリンクで説明されています)とより良い方法、特に最初のゲームを開発したら、SKActionを使用して、同様の動作を実現するアクションの組み合わせを使用しますdによってNSTimer

私は予想通り、それが仕事だなら、私に知らせて、機能や拡張について考えてきました:

extension SKAction { 
    class func scheduledTimerWithTimeInterval(time:NSTimeInterval, selector: Selector, repeats:Bool)->SKAction { 
     let call = SKAction.customActionWithDuration(0.0) { node, _ in 
      node.performSelector(selector) 
     } 
     let wait = SKAction.waitForDuration(time) 
     let seq = SKAction.sequence([wait,call]) 
     let callSelector = repeats ? SKAction.repeatActionForever(seq) : seq 
     return callSelector 
    } 
} 

使用

let spawn = SKAction.scheduledTimerWithTimeInterval(time, selector: #selector(GenericArea.spawnAlien), repeats: true) 
self.runAction(spawn,withKey: "spawnAlien") 
+0

これは一度にすべての敵を修正するのに役立ちますか? – Sam

+0

一度にすべての敵を修正することはどういう意味ですか?あなたの目的は何ですか? –

+0

たとえば、私は10人の敵を画面に表示することがありますが、1つにぶつかったらゲームを失います。私はそれらのすべてがまだ浮遊していてもらいたいが、彼らはもう私と衝突することはできず、より遅い速度で動くべきである。これを達成するために、私が生成する新たな敵のインスタンスはすべて 'if文 'で修正されます。しかし、既にスクリーン上にあった全ての敵は影響を受けません。彼らがいつも配列や何かに入っていたら、私はすべてのスプライトに影響を与えることができるはずです。 (これは私が意味するものの単なる例です)。 – Sam

関連する問題