我将重新创建一个我创建的游戏引擎.这次我想做得对,所以我对设计模式进行了一些研究,并尝试将各个部分组合在一起以实现我的目标.游戏引擎的想法很简单,但与此同时我不想牺牲可用性.
这是我正在思考的蓝图,让我知道你是否能看到任何垮台,尤其是可扩展性:
class Object
{
public:
string name;
}
class Object3D : public Object
{
public:
int x;
int y;
int z;
}
class Object2D : public Object
{
public:
int x;
int y;
}
class cube : public Object3D
{
cube() : x(0), y(0), z(0), name("cube") {}
}
class square
{
...
}
int main()
{
SGL Engine(paramters);
c = cube();
s = square();
Engine->Lib3D->AddCube(&c, "cube");
Engine->Lib2D->AddSquare(&s, "square");
Engine->Input->keyboard(&kbevent);
while(Engine->running())
{
if (x)
Engine->Draw("cube");
else
Engine->Draw("square");
}
}
void kbevent(event-paramteres)
{
if (key.up)
engineptr->objects["cube"]->move(x,y);
}
Run Code Online (Sandbox Code Playgroud)
目标语言是C++.
首先,阅读本文.
"正确"做到这一点的唯一方法就是将过程颠倒过来.在游戏中使用引擎后制作引擎.
第二.C++不是Java.C++没有基Object类,也不需要基类.不要试图将所有内容都放入继承层次结构中.如果每个对象都是多态的,那么你就会陷入困境(例如,一切都必须通过引用或指针传递,并通过引用或指针传递,以避免切片,甚至不会使你的代码更清晰)
世界上的一个物体有一个位置.它不是一个.所以不要继承x, y, z坐标.将它们放在一个坐标类中,该坐标类可以作为成员添加到需要它的类中.
字符串查找很慢,并且您需要处理字符串不唯一时的情况.(如果我不小心添加两个名为"cube"的对象,该怎么办?
为什么不尽可能地依赖普通引用或指针?
为什么我不能简单Engine->Draw(c)地告诉引擎绘制立方体?
但实际上,最重要的建议是,不要试图编写一个收缩包装的游戏引擎供以后使用.你将最终到达现在的位置:需要"重写它,这次做得对 ".如果你想得到一些有用的东西,你需要从它的用例开始.先写游戏.完成后,您可以开始重构代码以将引擎分开.这样的话,你最终与发动机的工作原理.