Проектирование игровых объектов - PullRequest
10 голосов
/ 07 октября 2008

Я недавно начал работать над небольшой игрой для собственного удовольствия, используя 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 не нужны для создания объекта, и все они могут быть изменены позже с помощью вызовов методов.

Ответы [ 11 ]

1 голос
/ 08 октября 2008

В зависимости от того, как часто будут вызываться конструкторы, вы можете рассмотреть возможность сделать все дополнительные параметры обнуляемыми и просто передать им нулевое значение, когда они не имеют значений. Мессье создает объекты, меньше конструкторов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...