2016-03-31 11 views
0

テトリスのようなゲームでは、アクションを使用してシェイプを移動しようとしていますが、次のシェイプが呼び出されると、前のシェイプが移動しなくなり、動く。私はremoveAllActionsremoveActionForKeyをこれとSKNodeドキュメンテーションで尋ねられた多くの他の質問に使用しようとしましたが、動かないようです。私はactionForKeyを私のコードでテストしました。それは、他の形がまだ動いているにもかかわらず実行されているアクションを取り上げていないようです。即時のSpriteKitでのアクションの停止

まず、図形を生成するdidMoveToViewの中で私のdoMethod関数を呼び出してから、次のように移動を開始します。これは、ボタンを押すたびに呼び出されるので、いつ新しいシェイプが作成されるかを制御できます。

func MoveBlocks(){ 
    if(number_of_blocks > 1){ 
     let newnum = number_of_blocks - 1 
     let KeyName = "MoveBlocks_"+String(newnum) 
     let ActName = actionForKey(KeyName) // returns nil 
     // removeAllActions() 
     // removeActionForKey(KeyName) 
    } 


    var Sprite = childNodeWithName("BOX_"+String(current_min)) 
    var y_min = (Sprite?.position.y) 
    // calc y_min to stop when gets to bottom - not currently implemented correctly 
    for i in current_min...(current_max-1){ 
     var CurrentSprite = childNodeWithName("BOX_"+String(i)) 
     if(CurrentSprite?.position.y < y_min){ 
      y_min = (CurrentSprite?.position.y) 
     } 
    } 
    if(y_min > CGFloat(BOX_WIDTH/2)){ 
     for i in current_min...current_max { 
      var CurrentSprite = childNodeWithName("BOX_"+String(i)) 
      //var current_pos = sprite_self?.position.y 
      //sprite_self?.position.y = (sprite_self?.position.y)! - CGFloat(BOX_WIDTH/2) 
      let moveAction = SKAction.moveBy(CGVector(dx: 0,dy: -60), duration: 0.001) 
      let pauseAction = SKAction.waitForDuration(0.999) 
      let runSequence = SKAction.sequence([moveAction, pauseAction]) 
      var KeyName = "MoveBlocks_"+String(number_of_blocks) 
      CurrentSprite?.runAction(SKAction.repeatActionForever(runSequence), withKey: KeyName) 
     } 
    } 
} 

を次のように

func doMethod(){ 
    if(true){ 
     if(number_of_blocks != 1){ 
      current_min = current_max + 1 
     } 
     // calculate points for shape 
     var box_d = createBox(self.size.width/2, yinit: 7*self.size.height/8) 
     // using box_d, make a SKNode with each calculated value 
     makeBox(box_d) 
     // move the blocks down 
     MoveBlocks() 
     number_of_blocks++ 
    } 
} 

それから私のMoveBlocks関数である私はちょうど私がもともと持っていたかを示すために、他のremoveAllActionsremoveActionForKeyをコメントアウトしています。また、MoveBlocksの最初のビットはちょうどそこにあるので、最初のシェイプが生成されたときには、アクションが停止しないようにします。その後、それは2番目、3番目などのためになります。

私は実際に私が最初にアクションを作成している方法と関係があると感じていますが、あまりよく分かりません。

+0

removeAllActionsは現在のスプライトではなく、シーンから削除します。スプライトでもremoveactionsを呼び出す必要があります。 'CurrentSprite?.removeAllActions' – Knight0fDragon

+0

https://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners – Knight0fDragon

+0

ありがとう!私は 'MoveBlocks()'の終わりのようにforループを実装し、あなたが言ったことをやっていました。ありがとう!あなたは客観的なものではなく迅速なものを除いて、そのようなチュートリアルはありますか? – MathCoder

答えて

0

少し違った考えですが、これらを物理学のボディとして構築し、他のブロックとの接触でそれらのアクションを削除してそれらを「フリーズ」することはできますか?ちょっとした考え。

+0

私はそれを実際に考えていました!私はそれがどのように乗って行くのを見るために行くことがあります! – MathCoder

+0

あなたは身体を本当に細かくコントロールできます: 'func evalBorderContact(contact:SKPhysicsContact){ conA = Int(contact.bodyA.categoryBitMask) let conB = Int(contact.bodyB.categoryBitMask) // case bottemEdge = 16 //場合topEdge = 32 CONBの== 16 { contact.bodyA.applyImpulse(CGVectorMake(0、+10)) }もしあれば他のConA == 16 { contact.bodyB.applyImpulse(CGVectorMake(0 、+10)) '(ただのスニペット) –

関連する問題