J'ai essayé de mettre en œuvre une architecture simple objet de jeu à base de composants en utilisant Objective-C, bien le long des lignes de l'article 'Evolve Your Hierarchy' par Mick Ouest. A cette fin, j'ai utilisé avec succès quelques idées comme décrit dans l'article 'Objective-C Message Forwarding' par Mike Ash, c'est-à-dire en utilisant la méthode -(id)forwardingTargetForSelector:
.architecture jeu à base de composants C-OBJ et le transfert des messages
La configuration de base est J'ai une classe GameObject conteneur, qui contient trois instances de classes de composants comme variables d'instance: GCPositioning, GCRigidBody et GCRendering. La méthode -(id)forwardingTargetForSelector:
renvoie le composant qui répondra au sélecteur concerné, déterminé à l'aide de la méthode -(BOOL)respondsToSelector:
.
Tout cela, en quelque sorte, fonctionne comme un charme: Je peux appeler une méthode sur l'instance gameobject dont la mise en œuvre se trouve dans l'un des composants, et il fonctionne. Bien sûr, le problème est que le compilateur donne des avertissements "ne peut pas répondre à ..." pour chaque appel. Maintenant, ma question est, comment puis-je éviter cela? Et spécifiquement en ce qui concerne le fait que chaque instance de GameObject aura un ensemble de composants différent? Peut-être un moyen d'enregistrer des méthodes avec les objets conteneurs, sur un objet par objet? Tels que, puis-je créer une sorte de -(void)registerMethodWithGameObject:
méthode, et comment ferais-je cela? Maintenant, il peut ou peut ne pas être évident que je suis assez nouveau à Cocoa et Objective-C, et juste à cheval, fondamentalement, et tout cela peut être très étranger ici. Bien sûr, bien que j'aimerais beaucoup connaître une solution à mon problème spécifique, toute personne qui voudrait expliquer une façon plus élégante de le faire serait également la bienvenue.
très apprécié, -Bastiaan
Malheureusement je pense que les avertissements resteront, puisqu'ils sont techniquement corrects. Le compilateur ne peut pas déterminer si votre objet répondra réellement ou non, sauf si une méthode correspondante est déclarée dans l'interface. Cela dit, vous pourriez être en mesure de lancer votre GameObject à 'id' pour l'éviter (moche) ou désactiver l'avertissement comme une option de configuration (moche). :/ –
Voir la réponse de bbum à cette question très similaire: http://stackoverflow.com/questions/2259012/avoiding-compiler-warnings-when-doing-message-forwarding. Fondamentalement: déclarez une catégorie sur votre classe et placez les méthodes transférées dans cette catégorie. – Felixyz