Я недавно начал работать над небольшой игрой для собственного удовольствия, используя Microsoft XNA и C #. Мой вопрос касается разработки игрового объекта и объектов, которые его наследуют. Я собираюсь определить игровой объект как нечто, что можно отобразить на экране. Поэтому для этого я решил создать базовый класс, который будут наследоваться всеми остальными объектами, которые будут отображаться, под названием GameObject. Код ниже - класс, который я сделал:
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
}
Я исключил дополнительные методы, такие как вращение, перемещение и рисование объекта. Теперь, если бы я хотел создать другой объект, например, корабль, я бы создал класс Ship, который бы наследовал GameObject. Пример кода ниже:
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
}
Опять же, я пропустил какие-либо дополнительные методы, специфичные для Корабля, такие как запуск ракеты. Считаете ли вы, что такой дизайн хорош, или его нужно как-то улучшить или полностью изменить? Кажется, что конструкторы для дочерних классов грязные, но, возможно, это единственный способ сделать это. Я никогда не делал ничего подобного, и мне интересно, ухожу ли я с пути.
Спасибо всем, кто оставил ответ. Все они были очень полезны. Похоже, что существует общее мнение, что лучше всего изменить его на использование шаблона MVC. Я собираюсь посмотреть дальше, как именно это сделать. Я также удалю большинство конструкторов и у меня будет только один конструктор, потому что все аргументы после modelResource не нужны для создания объекта, и все они могут быть изменены позже с помощью вызовов методов.