2016-03-31 7 views
0

В игре, подобной тетрису, я пытаюсь использовать действия для перемещения фигур вниз, а затем, когда вызывается следующая фигура, она останавливает предыдущую фигуру от перемещения, так что они не имеют перемещение. Я попытался использовать removeAllActions и removeActionForKey во множестве других вопросов, заданных по этому вопросу, а также в документации SKNode, но он, похоже, не работает. Я проверил actionForKey на моем коде, и кажется, что он не подбирает никаких действий, которые выполняются, даже если другие фигуры все еще движутся.Остановить действие в SpriteKit с быстрым

Я сначала вызываю функцию doMethod внутри didMoveToView, которая генерирует форму и затем начинает ее перемещать следующим образом. Это называется всякий раз, когда я нажимаю кнопку, чтобы я мог контролировать, когда каждая новая фигура создается.

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 функция заключается в следующем

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

Я закомментировал другой removeAllActions и removeActionForKey просто чтобы показать, что я был первоначально. Кроме того, первый бит MoveBlocks находится там, так что, когда генерируется первая форма, он не пытается остановить какие-либо действия, если они не существуют. Тогда это будет для второго, третьего и так далее.

У меня такое ощущение, что это как-то связано с тем, как я на самом деле создаю действие, но я не слишком уверен.

+0

removeAllActions удаляет только с места происшествия, а не ваш текущий спрайт. Вам также нужно вызвать удаление на спрайтах. 'CurrentSprite? .removeAllActions' – Knight0fDragon

+0

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

+0

О да, спасибо! Я реализовал цикл for так же, как в конце 'MoveBlocks()', и сделал то, что вы сказали, и это сработало. Благодаря! Есть ли у вас какие-либо учебные пособия, кроме как с быстрым, а не с объективным-c? – MathCoder

ответ

0

Немного поразмыслив, могли бы вы построить их как физические тела, а затем при контакте с другими блоками удалить свои действия, чтобы «заморозить» их? Просто мысль.

+0

Я думал об этом на самом деле! Я мог бы дать ему понять, как это происходит! – MathCoder

+0

Вы можете получить действительно хороший контроль тел: 'Func evalBorderContact (контакт: SKPhysicsContact) { пусть coña = Int (contact.bodyA.categoryBitMask) пусть conB = Int (contact.bodyB.categoryBitMask) // случай bottemEdge = 16 // случай topEdge = 32 , если conB == 16 { contact.bodyA.applyImpulse (CGVectorMake (0, + 10)) } иначе, если CONA == 16 { contact.bodyB.applyImpulse (CGVectorMake (0 , +10)) '(просто фрагмент) –