2016-03-31 10 views
0

Tetris benzeri bir oyunda, Şekiller'i aşağı taşımak için eylemleri kullanmaya çalışıyorum ve sonraki şekil çağrıldığında, önceki şeklin hareket etmesini engeller, böylece ikisi de hareketli. removeAllActions ve removeActionForKey'u bu konuda ve ayrıca SKNode Belgeleri'nde sorulan birçok başka soruyu kullanmaya çalıştım ama çalışmıyor gibi görünüyor. Kodumda actionForKey'u test ettim ve diğer şekiller hala hareket halinde olsa bile, gerçekleştirilmekte olan herhangi bir eylemi yakalamadığı anlaşılıyor.SpriteKit'te hızlı hareketle Durdur eylemi

İlk olarak, biçimi oluşturan didMoveToView içimdeki doMethod işlevimi çağırın ve ardından aşağıdaki gibi hareket etmeye başladım. Bu, bir düğmeye bastığımda her yeni şekil oluşturulduğunda kontrol edebilmem için çağrılır. Diğer removeAllActions ve removeActionForKey dışarı yorumladı

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

sadece Başlangıçta ne vardı göstermeye şöyle

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

Sonra MoveBlocks fonksiyonudur. Ayrıca, MoveBlocks'un ilk biti sadece oradadır, böylece ilk şekil oluşturulduğunda, herhangi bir eylemin bulunmadığı gibi durmaya çalışmaz. Sonra ikinci, üçüncü ve benzeri için olacak.

İlk başta Eylem'i nasıl oluşturduğumla ilgili bir şey olduğunu hissediyorum, ancak emin değilim.

+0

removeAllActions yalnızca sahneyi kaldırır, şu andaki grafiğiniz değil, spritelarda da kaldırmaları çağırmanız gerekir. "CurrentSprite? .removeAllActions" – Knight0fDragon

+0

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

+0

Ah evet teşekkürler! “MoveBlocks()” ın sonunda olduğu gibi bir for döngüsünü uyguladım ve söylediklerini yapıp çalıştım. Teşekkürler! Object-c yerine swift ile yapılanlar dışında bunun gibi eğiticileriniz var mı? – MathCoder

cevap

0

Biraz daha farklı düşünce, bunları fizik bedenleri olarak inşa edip diğer bloklarla temas kurarak eylemlerini "dondurmak" için kaldırır mısınız? Sadece bir düşünce.

+0

Aslında bunu düşünüyordum! Nasıl geçtiğini görmek için bir şeyler verebilirim! – MathCoder

+0

Bazı gerçekten iyi denetimleri alabilirsiniz: "func evalBorderContact (iletişim: SKPhysicsContact) { let conA = Int (contact.bodyA.categoryBitMask) let conB = Int (contact.bodyB.categoryBitMask) // case bottemEdge = 16 // durumda topEdge = 32 halinde CONB == 16 { contact.bodyA.applyImpulse (CGVectorMake (0, + 10)) } başka conA == 16 { contact.bodyB.applyImpulse (CGVectorMake (0 ise , +10)) '(Sadece bir snippet) –