2016-04-03 33 views
3

Uzun 2d seviyem var, bu yüzden daha fazla .sks dosyasına bölüyorum. Sürükle ve bırak ile Sahne düzenleyicide onlara katılabileceğim "GameScene" var. SKReferenceNodes oluşturur. Bunu başarı ile yaptım. Ama bu parçaları kodda ihtiyaç duyulduğunda tembel bir şekilde yüklemek istiyorum (iyi uygulama olduğu söyleniyor). Bunun üzerinde başarısızım.SKReferenceNode'u programsal olarak ekleyin

if let nextPart = SKReferenceNode(fileNamed: "Scene2_city2") { 
     if self.childNodeWithName("Scene2_city2") == nil { 
      self.addChild(nextPart) 
     } 
    } 

"Scene2_city2" .sks dosyanın adıdır ve ayrıca dosya içindeki Sahne adı:

Bu kodun belli bir parçasıdır. kod çalıştırma

bir hata alıyorum: Ben eklemeden önce ben ilk kontrol çünkü

*** Terminating app due to uncaught exception 'Cant add body, already exists in a world', reason: 'Cant add body type: representedObject:[ name:'Scene2_city2' frame:{{-0, -0}, {1024, 768}} anchor:{0, 0}], already exists in a world'

Bu, çok garip.

Soru: SKReferenceNode'u SKScene'e program aracılığıyla nasıl eklemeliyim?

DÜZENLEME: İşte bitbucket üzerinde simple example project. Musluk için referans sahne eklendi.

+0

Herhangi bir şanstan bahsettiğiniz konuyu yeniden üretebilecek ve repo'yu Github'a yükleyebilecek en az örnekle yapabiliyorsanız, muhtemelen daha iyi bir cevabı alacaksınız. – Whirlwind

+0

Ayrıca, yaşadığınız şeylerle aynı değil, ancak okumaya değer olabilir çünkü bu, gördüğünüz aynı hatayla ilgilidir: https://forums.developer.apple.com/thread/19583, http: //stackoverflow.com/questions/21745797/skphysicsbody-malloc-error ... Muhtemelen daha fazla iş parçacığı vardır, bunun hakkında StackOverflow üzerinde birkaç tane daha gördüm. – Whirlwind

+0

Bilgi için teşekkürler. Ben aynı hataları yaptığımı sanmıyorum. İşte [basit örnek proje] (https://bitbucket.org/sirljan/referencenodetest) bitbucket üzerinde. – jendan

cevap

6

Bir geçici çözüm buldum, URL yöntemini kullanarak SKReferenceNode oluştururken hiçbir sorun olmadığını ortaya çıkıyor. Örneğin :

let path = NSBundle.mainBundle().pathForResource("SpaceShip", ofType: "sks") 
let spaceShip = SKReferenceNode (URL: NSURL (fileURLWithPath: path!)) 
addChild(spaceShip) 

Biraz araştırma yaptılar ve şimdi opsiyonel döner fileNamed kullanılarak SKReferenceNode oluştururken bu 7.2.1 karşı 7.3.1'de görüntülenir.Ne zaman unwrapped SKScene olsun, tabii ki bir çocuk olarak varolan bir sahneye eklemeye çalışırsanız hatalar atmak olacaktır.

hızlı 7,3 ​​Test projesini Apple forumunda benim yazı başvurulan https://github.com/cocojoe/SKReferenceNodeIssue/tree/workaround

Bildirim eklendi. Bir ay önce, geçmiş deneyimlerden bir hata raporu aldım. Bunların incelenmesi biraz zaman alabilir.

2

Düğüm sahnenin hiyerarşisinde olup olmadığını kontrol ettiniz. Bu hata, fizik dünyasıyla ilgilidir ve sahneye zaten bir düğümün eklenmiş olması ile ilgisi yoktur.

Şahsen SKReferenceNode kullanarak söylediklerinizi yeniden oluşturamadım, ancak bu muhtemelen şu anki kurulumunuzun tam olarak farkında olmadığımdan kaynaklanıyor.

override func didMoveToView(view: SKView) { 

     let sprite = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 20, height: 20)) 
     let sprite2 = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 20, height: 20)) 

     sprite.position = CGPoint(x:frame.midX, y:frame.midY) 
     sprite2.position = CGPoint(x:frame.midX, y:frame.midY + 100) 

     let sharedPhysicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: -10, height: -10)) 

     sprite.physicsBody = sharedPhysicsBody 
     sprite2.physicsBody = sharedPhysicsBody 

     addChild(sprite) 
     addChild(sprite2) 
    } 

Bu kod şu anda alıyorsanız hata ile kilitlenmesine: İki düğümler bu gibi aynı SKPhysicsBody örneğine işaret eğer

Bu hata ortaya çıkabilir. Bu yüzden aynı SKPhysicsBody'yi bir yere veya başka bir şeye benzediğini kontrol edin ve bunu çözeceksiniz.

+0

Cevabınız için teşekkürler. [Basit proje] 'ye bakın (https://bitbucket.org/sirljan/referencenodetest). – jendan

+0

@jendan Bu proje benim için çökmez. – Whirlwind

+0

SKReferenceNode, muslukta eklenir. Sağdaki gri alan yerine yeşilimsi görünmelidir. Dokunduğunuzda sizin için kilitlenmiyorsa, Xcode'un hangi sürümlerini kullanıyorsunuz? Bunu [thread] (https://forums.developer.apple.com/thread/44090) 'da buldum. – jendan

1

Aynı sorunu yaşıyorum. Ben SKReferenceNode (fileNamed kullanırsanız :) Ben

'vücut eklemek zaten dünyada var Cant'

Bu gibi görünüyor hatayı olsun bir scene.sks dosyada mevcut bir sprite yeni bir hareketli grafik oluşturmak için Fizik ile ilgili olmalı ve nesne addChild ile sahneye eklendiğinde ortaya çıkar. Fizik bedenini sıfırlayacaksanız hata gider. gibi bir şey:

let newBox = SKReferenceNode(fileNamed: "Box") 
newBox?.physicsBody = nil 
newBox?.position = location 
addChild(newBox!) 

İlginç olan hata fizik seçenek hiçbiri ayarlandığında bile görünmesidir. Yukarıdaki çözüm bu durumda çalışır, ancak fizik bedeninizi kaybedersiniz.

Benim için işe yarayan bir şey, bir kaynak nesne olarak kullanmak üzere bir nesne oluşturmaktı ve bir kopyasını oluşturmak için skNode.copy() öğesini kullanıyordu.

0

Sizi fizik sigortasını sıfırlamaya zorlamayan başka bir geçici çözüm buldum.

Benim durumumda SKReferenceNode'u bir SKScene ile değiştirdim.

İlk olarak .sks sahnesinde tüm SKSpriteNodes öğelerinin bir ana düğümün çocukları olduğundan emin oldum. Doğrudan bir bağlantı olmak zorunda değilsiniz, yine de sahnenizin hiyerarşilerine saygı duyabilirsiniz, ancak "hiyerarşi ağacının" sonunda onlar benim durumumda arka plan olan bir düğümle bağlantılı olmaları önemlidir, fakat Ayrıca boş bir düğüm de olabilir.

class GameScene: SKScene { 
    var mainNode: SKNode? = nil 
    override func didMove(to view: SKView) { 
     var mySksScene = SKScene(fileNamed: "Caribbeans") 
     mainNode = upperBackground?.childNode(withName: "backgroundCaribbean") 
     mainNode?.removeFromParent() 
     mySksScene = nil 
     addChild(mainNode) 
    } 
} 

İlk opsiyonel SKNode değişkeni ilan: Benim GameScene dosyasında

enter image description here

Sonra aşağıdaki kodu yazdım. Sonra, didMove (: to :) içinde .Sks dosyasını isteğe bağlı bir SKScene() değişkenine yükledim. Daha sonra SKNode'u ana düğüm olarak, diğer tüm düğümlerin (ki benim durumumda: backgroundCaribbean) ebeveynleri olan düğüm olarak ayarladım. Sonra ana sayfamı ana sahnesinden kaldırdım. Daha sonra, .sks sahnesini içermekte olan değişkeni geçersiz kılacak şekilde ayarladı ve daha sonra anaMode'umu GameScene'im Çocuk olarak ekledim.

İlgili konular