2016-04-01 26 views
0

eklerken "zaten ebeveynleri olan bir SKNode eklemeyi denedim" SpriteKit öğrenirken sırt ve ameliyattan kurtarma. Bu hatayı neden aldığımı anlamama yardımcı olmanıza yardımcı olduğunuz için teşekkür ederim.Swift SpriteKit - Joint

Zamanlayıcı üzerinden arayabileceğim hareketli bir "zombie1" var ve riotShield Sprite'i eklemeye çalışana kadar bir sorun olmadan ekran üzerinde hareket etmeden önce tekrar tekrar ortaya çıkıyor. Bunu yaptıktan sonra mümkün olan en kısa fonk 2 saat ve birinci riotShield denir olarak çöküyor zaten mevcutsa:

func addZ1ArmoredShield()  { 
    zombie1Mask = SKSpriteNode(texture: zombie1Texture) 
    var TextureAtlas = SKTextureAtlas() 
    var TextureArray = [SKTexture]() 
    TextureAtlas = SKTextureAtlas(named: "ZombieArmored") 
    for i in 1...TextureAtlas.textureNames.count{ 
     let Name = "armoredZombie_\(i)" 
     TextureArray.append(SKTexture(imageNamed: Name)) 
    } 
    zombie1 = SKSpriteNode(imageNamed: TextureAtlas.textureNames[0] as String) 
    zombie1.name = "monster" 
    zombie1.position = CGPointMake(globalVariables.skScene.frame.size.width + 50, CGFloat(randomStartPosition())) 
    let moveZombie1 = SKAction.moveToX(0, duration: spawnSpeed1() ) 
    let removeZombie1 = SKAction.removeFromParent() 
    let moveAndRemoveZombie1 = SKAction.sequence([moveZombie1, removeZombie1]) 
    zombie1.runAction(moveAndRemoveZombie1)  zombie1.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(TextureArray, timePerFrame: 0.1))) 

    zombie1.physicsBody = SKPhysicsBody(texture: zombie1MaskTexture, size: zombie1Mask.size) 
    zombie1.physicsBody!.dynamic = true 
    zombie1.physicsBody!.affectedByGravity = false 
    zombie1.physicsBody!.charge = 50 
    zombie1.physicsBody!.usesPreciseCollisionDetection = true 
    zombie1.physicsBody!.categoryBitMask = ColliderType.monster2HPContact.rawValue 
    zombie1.physicsBody!.contactTestBitMask = ColliderType.bulletContact.rawValue|ColliderType.bottemEdge.rawValue|ColliderType.topEdge.rawValue|ColliderType.monster2HPContact.rawValue|ColliderType.heroTop.rawValue 
    zombie1.physicsBody!.collisionBitMask = ColliderType.bottemEdge.rawValue|ColliderType.topEdge.rawValue 
    zombie1.physicsBody!.fieldBitMask = ColliderType.monsterContact.rawValue 
    zombie1.physicsBody!.mass = 2 
    zombie1.physicsBody!.allowsRotation = false 



    riotShield.name = "RiotShield" 
    riotShield.color = SKColor.blackColor() 
    riotShield.size = CGSizeMake(2, 25) 
    riotShield.position = CGPoint(x: (zombie1.position.x + 80 ), y: (zombie1.position.y + 40)) 
    riotShield.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(2, 25)) 
    riotShield.physicsBody!.categoryBitMask = ColliderType.riotShieldContact.rawValue 
    riotShield.physicsBody!.contactTestBitMask = ColliderType.bulletContact.rawValue 
    riotShield.physicsBody!.dynamic = true 
    riotShield.physicsBody!.affectedByGravity = false 
    riotShield.physicsBody!.usesPreciseCollisionDetection = true 


    let riotShieldJoint = SKPhysicsJointFixed.jointWithBodyA(zombie1.physicsBody!, bodyB: riotShield.physicsBody!, anchor: CGPoint(x: (zombie1.position.x + 10 ), y: zombie1.position.y + 10)) 




    globalVariables.currentScene.addChild(zombie1) 
    globalVariables.currentScene.addChild(riotShield) 
    globalVariables.currentScene.physicsWorld.addJoint(riotShieldJoint) 




}//end function 

Ne anlamıyorum benim zombie1 gelip nasıl SKSpritenode ama gözlerimi bir örneğini oluşturur riotShield, aynı ebeveyne eklenmeye çalışılan tekil bir sprite olarak görülür. Bu hatayla ilgili bir sürü yazı okudum ve sanırım nedenini anlıyorum (bir örnek olarak eklenemeyen riotShield). Sadece iki sprite ve peynir altı suyu arasındaki farkı anlamıyorum, onları (benim) esasen aynı şekilde eklediğimde farklı davranıyorlar.

Verdiğiniz zamanı ve sağladığınız yardımı takdir ediyorum.

+0

Aynı düğümde yalnızca bir ebeveyn olabilir. Başka bir ana bilgisayara eklemeye çalışırsanız, bu çöküşü elde edersiniz ... Ayrıca, 'globalVariables' olayı gölgeli görünüyor :) – Whirlwind

+0

Teşekkür ederim, globalVariable, geçerli sahneyi işaret eder, böylece işlev her zaman hareketli grafiğe eklenir. seviye "sahne. Tek ebeveyn ile ilgili olarak, bu mantıklı, zombie1 ve bu konuda isyan çıkarmak arasındaki farkı tam olarak anlamıyorum. Zombie1'i sorun olmadan yüzlerce kez ekleyebilirim, ancak 2. isyan Kalkanı eklendiğinde, çöker. RiotShield'in neden ilk örnekle aynı ebeveyne uygulandığını biliyor musunuz, ancak zombie1 bunu yapmıyor mu? (Bu aptalca bir soru olsaydı üzgünüm. –

+0

Yani sahne her zaman sağ canlı mı? Eğer öyleyse, eklenen spritelar asla kaldırılmaz ve tekrar tekrar eklemeye çalıştığınızda, çökme olur. Böyle şeyler yapmak ama böyle bir sahne tutmak büyük olasılıkla iyi bir fikir değildir. Kaç sahneye sahipsiniz? – Whirlwind

cevap

0

Tek ana sorun ve "riotShield" düğümünü eklediğim yola baktığımda, SKSpritenode'un davranışını görünüşte değiştiren bir shapenode olarak kullandığım şeklini anladım.

Aşağıdaki gibi bir görüntü olarak riotShield ekleyerek, her şey çalıştı.

riotShield.name = "RiotShield" 
riotShield = SKSpriteNode(imageNamed: "riotShield1") 
riotShield.position = CGPoint(x: (zombie1.position.x + 80 ), y: (zombie1.position.y + 40)) 
riotShield.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(2, 25)) 
riotShield.physicsBody!.categoryBitMask = ColliderType.riotShieldContact.rawValue 
riotShield.physicsBody!.contactTestBitMask = ColliderType.bulletContact.rawValue 
riotShield.physicsBody!.dynamic = true 
riotShield.physicsBody!.affectedByGravity = false 
riotShield.physicsBody!.usesPreciseCollisionDetection = true 

Başka sorular gönderen ve yanıt veren herkese teşekkür ederiz.

+0

Oh I Sorunu şimdi bakın SKSpriteNode'u kullanmıyorsunuz (SKSpriteNode ise SKShapeNode gibi kullanamazsınız.) Çünkü riotShield bir sahnenin bir özelliğidir ve bu yöntemi birden çok kez çağırırsanız oyun çöküyor Şimdi çalışıyor çünkü "isyanı" yeniden başlatıyorsunuz her seferinde bu satır riotShield = SKSpriteNode (imageNamed: "riotShield1"). Önceki kodunuzda, zaten bir ebeveyn olan aynı hareketli grafiği ve dolayısıyla hatayı yeniden kullanıyordunuz. – Whirlwind

İlgili konular