Existe-t-il un moyen de mettre en pool/mettre en cache SKReferenceNodes dans SpriteKit en utilisant Swift?Swift/SpriteKit - Un moyen de mettre en pool/cache SKReferenceNodes?
Je crée un jeu en utilisant l'éditeur de niveau visuel xCodes. Je crée différents fichiers .sks avec l'éditeur de niveau visuel que je suis en train d'appeler du code quand j'en ai besoin. Je les appelle en code parce que je les utilise pour créer des niveaux ou des obstacles aléatoires, donc je n'ai pas besoin que tout soit ajouté à la scène en même temps.
En ce moment je fais comme ça
Je crée une méthode init pour convaincre SKReferenceNodes de les initialiser avec des URL. Je fais ceci parce qu'il y a une sorte de bogue appelant SKReferenceNodes par le nom de fichier directement (https://forums.developer.apple.com/thread/44090). L'utilisation d'une telle extension rend le code un peu plus propre.
extension SKReferenceNode {
convenience init(roomName: String) {
let path: String
if let validPath = NSBundle.mainBundle().pathForResource(roomName, ofType: "sks") {
path = validPath
} else {
path = NSBundle.mainBundle().pathForResource("RoomTemplate", ofType: "sks")! // use empty roomTemplate as backup so force unwrap
}
self.init(URL: NSURL(fileURLWithPath: path))
}
}
et que dans mes scènes que je peux les créer et les ajouter comme si (environ toutes les 10 secondes)
let room = SKReferenceNode(roomName: "Room1") // will cause lag without GCD
room.position = ...
addChild(room)
Cela fonctionne ok mais je reçois un certain retard/bégayer lors de la création de ceux-ci Donc, j'utilise GCD pour réduire cela à pratiquement aucun bégaiement. Cela fonctionne bien mais je me demande si je peux précharger tous les fichiers .sks en premier.
J'ai essayé d'utiliser des tableaux pour cela, mais je reçois des plantages et cela ne semble pas fonctionner (je reçois également un message ajoutant déjà un nœud qui a un parent).
je tentais de les précharger comme tant à l'application lancement
let allRooms = [SKReferenceNode]()
for i in 0...3 {
let room = SKReferenceNode(roomName: "Room\(i)")
allRooms.append(room)
}
et que d'utiliser le tableau quand j'ai besoin aussi. Cela ne fonctionne pas cependant et je reçois un plantage en essayant d'utiliser le code comme ceci
let room = allRooms[0]
room.position =
addChild(room) // causes error/crash -> node already has parent
Quelqu'un at-il fait quelque chose de similaire? Existe-t-il un autre moyen de mettre en pool/mettre en cache ces nœuds de référence? Est-ce que j'ai râté quelque chose?
Salut, merci beaucoup pour votre réponse. Je viens de comprendre mes problèmes, je viens de poster une réponse maintenant. Merci encore pour vos efforts. – crashoverride777
Vous accueillir, merci aussi de partager votre expérience :) –
Merci beaucoup pour votre aide. – crashoverride777