J'espère que ces divagations clarifieront ma question - je comprendrais totalement si elles ne le font pas, alors faites-le moi savoir si c'est le cas, et j'essaierai de me clarifier.
Rencontrez BoxPong , un jeu très simple je fait pour se familiariser avec le développement de jeux orienté objet. Faites glisser la boîte pour contrôler le ballon et collecter des objets jaunes.
Faire BoxPong m'a aidé à formuler, entre autres, une question fondamentale: comment puis-je avoir des objets qui interagissent entre eux sans avoir à «appartenir» les uns aux autres? En d'autres termes, existe-t-il un moyen pour les objets de ne pas être hiérarchisés, mais plutôt de coexister? (Je vais entrer dans les détails ci-dessous.)
Je soupçonne que le problème des objets coexistant est un problème courant, alors j'espère qu'il existe un moyen établi de le résoudre. Je ne veux pas réinventer la roue carrée, donc je suppose que la réponse idéale que je recherche est "voici un modèle de conception qui est couramment utilisé pour résoudre votre type de problème."
Surtout dans des jeux simples comme BoxPong, il est clair qu'il y a, ou devrait y avoir, une poignée d'objets coexistant au même niveau. Il y a une boîte, il y a une balle, il y a un objet de collection. Tout ce que je peux exprimer dans des langages orientés objet, bien que - ou du moins il semble - ce sont des relations HAS-A strictes . Cela se fait via des variables membres. Je ne peux pas simplement commencer ball
et le laisser faire, j'ai besoin qu'il appartienne en permanence à un autre objet. Je l' ai mis en place afin que le principal objet de jeu a une boîte, et la boîte à son tour , a une balle, et a un compteur de score. Chaque objet possède également unupdate()
, qui calcule la position, la direction, etc., et j'y vais de la même manière: j'appelle la méthode de mise à jour de l'objet de jeu principal, qui appelle les méthodes de mise à jour de tous ses enfants, et ils appellent à leur tour les méthodes de mise à jour de tous leurs enfants. C'est la seule façon dont je peux voir pour créer un jeu orienté objet, mais je pense que ce n'est pas la manière idéale. Après tout, je ne penserais pas exactement à la balle comme appartenant à la boîte, mais plutôt comme étant au même niveau et interagissant avec elle. Je suppose que cela peut être réalisé en transformant tous les objets de jeu en variables membres de l'objet de jeu principal, mais je ne vois pas cela résoudre quoi que ce soit. Je veux dire ... en laissant de côté le désordre évident, comment y aurait-il un moyen pour le ballon et la boîte de se connaître , c'est-à-dire d'interagir?
Il y a aussi le problème des objets qui ont besoin de passer des informations entre eux. J'ai un peu d'expérience dans l'écriture de code pour la SNES, où vous avez accès à pratiquement toute la RAM tout le temps. Supposons que vous vous faites un ennemi personnalisé pour Super Mario World , et que vous souhaitez qu'il supprime toutes les pièces de Mario, puis stockez simplement zéro pour adresser 0DBF $, pas de problème. Il n'y a pas de limitations empêchant les ennemis d'accéder au statut du joueur. Je suppose que j'ai été gâté par cette liberté, car avec C ++ et autres, je me demande souvent comment rendre une valeur accessible à d'autres objets (ou même globaux).
En utilisant l'exemple de BoxPong, que faire si je voulais que la balle rebondisse sur les bords de l'écran? width
et height
sont des propriétés de la Game
classe,ball
d'y avoir accès. Je pourrais transmettre ces types de valeurs (soit par le biais de constructeurs ou des méthodes où elles sont nécessaires), mais cela me fait juste penser à de mauvaises pratiques.
Je suppose que mon principal problème est que j'ai besoin d'objets pour se connaître, mais la seule façon dont je peux voir cela est une hiérarchie stricte, ce qui est laid et peu pratique.
J'ai entendu parler de "classes d'amis" sur C ++ et je sais un peu comment elles fonctionnent, mais si elles sont la solution finale, alors comment se fait-il que je ne vois pas de friend
mots - clés répandus partout dans chaque projet C ++, et comment le concept n'existe pas dans toutes les langues POO? (Il en va de même pour les pointeurs de fonction, dont je viens d'apprendre récemment.)
Merci d'avance pour les réponses de toute nature - et encore une fois, s'il y a une partie qui n'a pas de sens pour vous, faites-le moi savoir.