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.
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
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. –
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