Así que finalmente pude jugar con XNA y he estado jugando para hacer un juego en 2D (tengo un montón de recursos artísticos de un amigo que lo desarrolló en iOS)
Parece que muchas cosas son fáciles de hacer y salen de la caja, sin embargo, me quedo perplejo por un montón de cosas, ya que la mayoría de la literatura (los libros que compré, por ejemplo) no prestan demasiada atención al 2D.
Realmente agradecería cualquier aclaración o que me indiquen más información sobre las siguientes búsquedas:
¿Cuál es el punto de un servicio de juego? Entiendo todo el lenguaje de registrar un objeto como un servicio para que cualquier otro GameComponent pueda agarrarlo, sin embargo, ¿cómo funciona esto simplemente haciéndolo público o estático? Por ejemplo, mi libro recomendó registrar el objeto SpriteBatch en la clase Game.cs. No estoy seguro de cómo es preferible hacerlo simplemente público / estático, ya que de todos modos solo debería haber una instancia de Juego (singleton).
Estoy confundido sobre cuándo debería heredar de GameComponent o RenderableGameComponent. Estoy tratando de seguir un diseño de Administrador / Controlador, de modo que todas las entidades sean creadas / poseídas por un solo administrador y lo mismo para otras cosas. Actualmente tengo cada Administrador / Controlador heredado de GameComponent, sin embargo, ¿cómo supera esto que el objeto Juego posea a todos los Administradores y llame manualmente a la actualización sobre ellos y dibuje?
Noté que Initialize se llama antes de ContentLoad (), encontré esto molesto ya que en mi Initialize es donde me gustaría crear algunas de mis entidades (es decir, Sprite, Player, etc.), sin embargo, no puedo darles su carga SpriteSheets o Textures ya que la llamada para cargarlos aún no se ha producido. ¿Tal vez estoy inicializando incorrectamente o la gente simplemente asigna la textura más abajo en ContentLoad?
Esos parecen ser mi mayor " WTF " de no entender realmente
fuente
SpriteBatch.Draw
se especifica en coordenadas de textura-píxel en relación con la esquina superior izquierda de la textura (o rectángulo de origen, si usa uno).public
/static
propiedades. ¿Por qué? Testabilidad Es casi imposible cambiar las cosas con el enfoque de propiedad, mientras que es trivial si todo se inicializa con unIServiceProvider
método que se puede rellenar con cualquier cosa que la clase necesite mediante su método de prueba. También evita la necesidad de crear una instancia delGame
objeto en su prueba, lo que se vuelve desordenado muy rápidamente.Game
objeto. Simplemente se accede a ellos a través de interfaces que se insertanGame.Services
y luego se pasan a todo para obtener de nuevo lo que necesitan.Para su primera pregunta, debo admitir que realmente no sé la respuesta real. Supongo que sería por la misma razón por la cual singleton es generalmente un mal patrón de diseño. Te referiré a una cita de este enlace :
Para su segunda pregunta, supongo que usar componentes como este sería más útil si siguiera un enfoque basado en componentes , como si tuviera una lista de
Sprite
componentes que sabrían cómo dibujar y actualizarse en lugar de un administrador que sabe cómo actualizar y dibujar cada sprite. Estoy de acuerdo, suena igual pero prefiero un diseño basado en componentes porque realmente me gusta el enfoque orientado a objetos que tiene.Para su tercera pregunta, sí, debe cargar cualquier forma de contenido (activos, fuentes, etc.) en el método LoadContent. En cuanto a la inicialización, normalmente crearía el objeto Player dentro de la función Initialize y luego cargaría su contenido dentro de LoadContent ... O simplemente puede hacerlo todo dentro de LoadContent si lo desea.
fuente