我最近开始使用 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 之后的所有参数都不是创建对象所必需的,并且它们都可以在以后通过方法调用进行更改。