Recientemente comencé a trabajar en un pequeño juego para mi propio entretenimiento, usando Microsoft XNA y C#. Mi pregunta es sobre el diseño de un objeto del juego y los objetos que lo heredan. Definiré un objeto de juego como algo que se puede representar en la pantalla. Así que para esto, decidí hacer una clase base que heredarán todos los demás objetos que se necesitarán representar, llamada GameObject. El código siguiente es la clase que hice:Diseño de Game Objects
class GameObject
{
private Model model = null;
private float scale = 1f;
private Vector3 position = Vector3.Zero;
private Vector3 rotation = Vector3.Zero;
private Vector3 velocity = Vector3.Zero;
private bool alive = false;
protected ContentManager content;
#region Constructors
public GameObject(ContentManager content, string modelResource)
{
this.content = content;
model = content.Load<Model>(modelResource);
}
public GameObject(ContentManager content, string modelResource, bool alive)
: this(content, modelResource)
{
this.alive = alive;
}
public GameObject(ContentManager content, string modelResource, bool alive, float scale)
: this(content, modelResource, alive)
{
this.scale = scale;
}
public GameObject(ContentManager content, string modelResource, bool alive, float scale, Vector3 position)
: this(content, modelResource, alive, scale)
{
this.position = position;
}
public GameObject(ContentManager content, string modelResource, bool alive, float scale, Vector3 position, Vector3 rotation)
: this(content, modelResource, alive, scale, position)
{
this.rotation = rotation;
}
public GameObject(ContentManager content, string modelResource, bool alive, float scale, Vector3 position, Vector3 rotation, Vector3 velocity)
: this(content, modelResource, alive, scale, position, rotation)
{
this.velocity = velocity;
}
#endregion
}
He dejado de lado los métodos adicionales que hacen cosas tales como rotar, mover y dibujar el objeto. Ahora, si quisiera crear otro objeto, como un barco, crearía una clase Ship, que heredaría GameObject. Código de muestra a continuación:
class Ship : GameObject
{
private int num_missiles = 20; // the number of missiles this ship can have alive at any given time
private Missile[] missiles;
private float max_missile_distance = 3000f; // max distance a missile can be from the ship before it dies
#region Constructors
public Ship(ContentManager content, string modelResource)
: base(content, modelResource)
{
InitShip();
}
public Ship(ContentManager content, string modelResource , bool alive)
: base(content, modelResource, alive)
{
InitShip();
}
public Ship(ContentManager content, string modelResource, bool alive, float scale)
: base(content, modelResource, alive, scale)
{
InitShip();
}
public Ship(ContentManager content, string modelResource, bool alive, float scale, Vector3 position)
: base(content, modelResource, alive, scale, position)
{
InitShip();
}
public Ship(ContentManager content, string modelResource, bool alive, float scale, Vector3 position, Vector3 rotation)
: base(content, modelResource, alive, scale, position, rotation)
{
InitShip();
}
public Ship(ContentManager content, string modelResource, bool alive, float scale, Vector3 position, Vector3 rotation, Vector3 velocity)
: base(content, modelResource, alive, scale, position, rotation, velocity)
{
InitShip();
}
#endregion
}
Una vez más, he omitido cualquier método adicional específico de la nave, como disparar un misil. ¿Crees que este tipo de diseño es bueno o debería mejorarse de alguna manera o cambiarse por completo? Parece que los constructores de las clases para niños son desordenados, pero tal vez esa sea la única forma de hacerlo. Nunca he hecho algo como esto y me pregunto si estoy muy lejos de la pista.
Gracias a todos los que han dejado una respuesta. Todos fueron muy útiles. Parece haber un consenso general de que cambiarlo para usar un patrón MVC sería lo mejor. Voy a profundizar en exactamente cómo hacer eso. También eliminaré la mayoría de los constructores y tendré solo un constructor, porque todos los argumentos posteriores a modelResource no son necesarios para crear el objeto, y todos pueden cambiarse más tarde a través de llamadas a métodos.
@NM: +1, aquí, ¡aquí hay menos constructores más propiedades! – user7116