2017-08-24 4 views
0

J'ai lu sur les fonctions de compartimentation à utiliser dans un jeu, que je fais (en utilisant la conception des composants d'entité). Ma question concerne la façon de mettre en œuvre cela.Game design + fonctions de réconciliation à travers les scènes dans

Ce jeu utilise plusieurs scènes. A travers ces scènes, je trouve que j'ai écrit du code qui fait en grande partie la même chose plusieurs fois (par exemple un code pour animer un personnage).

Je vois quelque chose comme ceci:

func animateCharacter() { 

} 

... plusieurs fois dans différents fichiers associés à chaque scène.

Quelle est la manière correcte d'écrire une fonction une fois dans une scène, puis de la partager dans les autres scènes? Y a-t-il un moyen de le faire?

Répondre

0

Il se trouve que ce problème a été réglé quand je GameKit correctement mis en œuvre (par exemple en utilisant un contrôleur de vue sur plusieurs scènes). Quelqu'un dans un commentaire précédent m'a aidé à le faire, après quoi j'ai fait toutes les autres sous-classes de scènes d'une scène initiale, et utilisé la fonction dans la classe d'origine.

0

Si la fonction animateCharacter anime un nœud particulier, vous pouvez l'inclure dans la sous-classe de ce nœud.

class CharacterNode: SCNNode { 
    func animateCharacter() { 
     // ... 
    } 
} 

Ensuite, peu importe la scène dans laquelle vous vous trouvez, vous pouvez appeler cette méthode sur le nœud.

myCharacterNode.animateCharacter() 

Si vous voulez partager ce comportement entre plusieurs sous-classes de nœuds différentes, vous pouvez utiliser des protocoles. (Vous pouvez également utiliser l'héritage traditionnel avec tous les nœuds animables héritant de certaines superclasses, mais vous avez mentionné que vous vouliez utiliser à la place une conception entité-composant.)

Déclarez d'abord le protocole qui définit les méthodes et les propriétés à partager.

protocol Animatable { 
    func animateCharacter() 
} 

Puis dans une extension que vous pouvez fournir une implémentation par défaut:

extension Animatable where Self: SCNNode { 
    func animateCharacter() { 
     // default implementation here 
    } 
} 

Pour rendre vos objets conformes à ce protocole et à adopter ce comportement, ajoutez leur conformité dans une extension.

extension CharacterNode: Animatable {} 
extension OtherCharacterNode: Animatable {} 
+0

J'essaie de le partager entre les fichiers SKScene (comme dans différents fichiers qui gèrent le code pour diverses scènes). – illuminatedtype

+0

Une bonne pratique consiste à essayer d'obtenir du code hors de vos scènes et dans des objets plus spécifiques. Si votre code est actuellement au niveau de la scène, il existe probablement un moyen de le refactoriser. S'il doit être au niveau de la scène pour une raison quelconque, vous pouvez simplement créer une sous-classe de scène qui implémente la fonction, et toutes les autres scènes hériteront de cette scène. – nathan