J'ai donc enfin pu jouer avec XNA et jouer avec la création d'un jeu 2D (j'ai un tas d'actifs artistiques d'un ami qui l'a développé sur iOS)
Beaucoup de choses semblent faciles à faire et sortent de la boîte, mais je suis perplexe pour un tas de choses car la plupart de la littérature (les livres que j'ai achetés par exemple) ne font pas trop attention à la 2D.
J'apprécierais vraiment toute clarification ou être pointé vers plus d'informations sur les quêtes suivantes:
Quel est l'intérêt d'un Game Service? Je comprends tout l'idiome de l'enregistrement d'un objet en tant que service afin que tout autre GameComponent puisse le saisir, mais comment cela se fait-il simplement en le rendant public ou statique? Par exemple, mon livre recommandait d'enregistrer l'objet SpriteBatch dans la classe Game.cs. Je ne sais pas comment cela est préférable à simplement le rendre public / statique car il ne devrait y avoir qu'une seule instance de Game de toute façon (singleton)?
Je ne sais pas quand je dois hériter de GameComponent ou RenderableGameComponent. J'essaie de suivre une conception de gestionnaire / contrôleur, de sorte que toutes les entités sont créées / détenues par un seul gestionnaire et les mêmes pour d'autres choses. J'ai actuellement chaque gestionnaire / contrôleur hérité de GameComponent, mais comment cela se fait-il que l'objet Game possède tous les gestionnaires et appelle manuellement la mise à jour sur eux et dessine?
J'ai remarqué que Initialize est appelé avant ContentLoad (), j'ai trouvé cela ennuyeux car dans mon Initialize, c'est là que j'aimerais créer certaines de mes entités (c'est-à-dire Sprite, Player, etc.), mais je ne peux pas leur donner leurs données chargées SpriteSheets ou Textures depuis l'appel à les charger n'a pas encore eu lieu. Suis-je peut-être en train d'initialiser incorrectement ou est-ce que les gens attribuent simplement la texture plus bas dans ContentLoad?
Celles-ci semblent être mon plus grand " WTF " de ne pas vraiment comprendre
la source
SpriteBatch.Draw
est spécifiée en coordonnées de pixels de texture par rapport au coin supérieur gauche de la texture (ou du rectangle source, si vous en utilisez un).public
/static
properties. Pourquoi? Testabilité. Il est presque impossible de changer les choses avec l'approche de la propriété, alors que c'est trivial si tout est initialisé avec unIServiceProvider
qui peut être rempli de tout ce dont la classe a besoin par votre méthode de test. Cela évite également la nécessité d'instancier l'Game
objet lui-même dans votre test, ce qui devient très rapidement désordonné.Game
objet. Il se trouve qu'ils sont simplement accessibles via des interfaces qui sont poussées dansGame.Services
lesquelles sont ensuite transmises à tout pour obtenir à nouveau ce dont elles ont besoin.Pour votre première question, je dois admettre que je ne connais pas vraiment la réponse réelle. Je suppose que ce serait pour la même raison que le singleton est généralement un mauvais modèle de conception. Je vous renvoie à une citation de ce lien :
Pour votre deuxième question, je suppose que l'utilisation de composants comme celui-ci serait plus utile si vous suiviez une approche basée sur les composants à la place, comme si vous aviez une liste de
Sprite
composants qui sauraient comment se dessiner et se mettre à jour au lieu d'un gestionnaire qui sait mettre à jour et dessiner chaque sprite. Je suis d'accord, ça sonne pareil mais je préfère une conception basée sur les composants parce que j'aime vraiment l'approche orientée objet qu'elle a.Pour votre troisième question, oui, vous devez charger n'importe quelle forme de contenu (ressources, polices, etc.) dans la méthode LoadContent. En ce qui concerne l'initialisation, vous créez généralement l'objet Player dans la fonction Initialize, puis chargez son contenu dans LoadContent .. Ou vous pouvez simplement tout faire dans LoadContent si vous le souhaitez.
la source