2017-01-10 4 views
0

Je prévois de réaliser un jeu d'arcade dans lequel l'écran est divisé en deux moitiés. Chaque arrière-plan de cette moitié peut varier chaque fois que le joueur commence la partie. Je voulais concevoir mes arrière-plans dans différents fichiers .sks, puis en charger aléatoirement deux dans mon GameScene en utilisant le SKReferenceNode par programmation.Problème d'utilisation de SKReferenceNode par programmation

Le problème est que la teneur en SKS est traité comme un SKScene, et donc il ne peut évidemment pas être ajouté comme enfant de ma scène:

class GameScene: SKScene { 
    override func didMove(to view: SKView) { 
     let upperBackground = SKReferenceNode(fileNamed: "Caribbeans")! 
     addChild(upperBackground) 
    } 
} 

Je me demande s'il y a un moyen de faire le compilateur traite mon SKReferenceNode comme un SKSpriteNode, mais l'essai de downcast ne fonctionne pas puisque SKReferenceNode et SKSpriteNode ne sont pas liés. Je sais que cela fonctionne chaque fois que je crée une scène sks plus grande, que je fais glisser deux SKReferenceNodes et que je place leurs références sur un seul fond, mais le problème est que je veux faire une sélection aléatoire de deux arrière-plans qui varient à chaque fois. donc je dois trouver un moyen de contourner ce problème par programme et non par l'éditeur de scène.

Des suggestions?

Répondre

0

Comme je l'ai mentionné dans un autre article, j'ai trouvé une solution de contournement.

Dans mon cas, j'ai remplacé le SKReferenceNode par un SKScene. Je me suis d'abord assuré que, dans ma scène .sks, tous les SKSpriteNodes étaient des enfants d'un nœud principal. Il ne doit pas nécessairement s'agir d'un lien direct, vous pouvez toujours respecter les hiérarchies de votre scène, mais il est important qu'à la fin de l'arborescence hiérarchique elles soient liées à un nœud, ce qui dans mon cas est le fond, mais ça peut aussi être un noeud vide.

enter image description here

Dans mon fichier GameScene je puis écrit le code suivant:

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

j'ai déclaré une variable en option SKNode. Puis, à l'intérieur de didMove (: à :), j'ai chargé mon fichier .sks dans une variable optionnelle SKScene(). J'ai ensuite défini SKNode comme le noeud principal, le noeud qui est le parent de tous les autres noeuds (dans mon cas: backgroundCaribbean). J'ai alors retiré mon mainNode de sa scène parente, alors j'ai mis à zéro la variable qui contenait la scène .sks, et seulement ensuite j'ai ajouté mon mainNode en tant qu'enfant de mon GameScene.