C++ 游戏引擎开发
我将重新创建一个我不久前创建的游戏引擎。这一次我想把它做好,所以我对设计模式做了一些研究,并试图将各个部分组合起来以实现我的目标。游戏引擎的理念是简单,但同时我不想牺牲可用性 这是我的想法蓝图,如果您能看到任何缺点,尤其是在可扩展性方面,请告诉我:C++ 游戏引擎开发,c++,C++,我将重新创建一个我不久前创建的游戏引擎。这一次我想把它做好,所以我对设计模式做了一些研究,并试图将各个部分组合起来以实现我的目标。游戏引擎的理念是简单,但同时我不想牺牲可用性 这是我的想法蓝图,如果您能看到任何缺点,尤其是在可扩展性方面,请告诉我: class Object { public: string name; } class Object3D : public Object { public: int x; int y;
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);
}
<>目标语言是C++。< P>除非你使用哈希映射,否则字符串查找会很慢。此外,将对象添加到引擎后,您应该能够执行以下操作:
Engine->Draw();
Engine->AddObject(&c);
Engine->AddObject(&s);
将遍历添加到引擎中的所有对象并绘制它们
对象应具有虚拟绘制功能,Object2d和Object3d应覆盖该功能。然后引擎将循环遍历所有对象并调用draw
另一件事是,对于不同的类型,不应该需要add函数。您应该能够执行以下操作:
Engine->Draw();
Engine->AddObject(&c);
Engine->AddObject(&s);
它会想出如何处理它。您现在的方式要求引擎用户知道他们想要做什么,而它应该足够封装,您不需要这样做,但是足够开放,如果您想要做引擎不支持的事情,它不会妨碍您,您可以这样做,所以我会保留Lib2d和Lib3d访问器,尽管纯粹主义者会说封装被破坏了。首先,请阅读
要做到“正确”,唯一的办法就是把整个过程颠倒过来。在游戏中使用引擎后再制作引擎
第二。C++不是java。C++没有基数<代码>对象< /C>类,也不需要一个。不要试图将所有内容都放入继承层次结构中。如果每个对象都是多态的,那么您就是在削弱自己(例如,所有对象都必须通过引用或指针进行堆分配和传递,以避免切片,而这甚至不会使您的代码更清晰)
世界中的对象有一个位置。它不是一个。所以不要继承x,y,z
坐标。将它们放在一个坐标类中,该类可以作为成员添加到需要它的类中
字符串查找很慢,您需要处理字符串不唯一的情况。(如果我不小心添加了两个名为“cube”的对象,该怎么办
为什么不尽可能依赖普通的引用或指针呢
为什么我不能简单地执行Engine->Draw(c)
命令引擎绘制立方体
但事实上,最重要的一条建议是,不要试图编写一个收缩包装的游戏引擎供以后使用。你最终会达到现在的状态:需要“重写它,这次做对”。如果你想从中得到一些有用的东西,你需要从它的用例开始。首先编写游戏。完成后,你可以开始重构代码以分离引擎。这样,你就得到了一个有用的引擎。首先,试着不要将设计模式应用到问题上。阅读并讨论这类问题解决方案 第二,在编写引擎时,关注你将要做什么样的游戏是很重要的。因此,确定你将处理什么样的数据以及如何处理数据是绝对重要的 第三,当谈到游戏引擎开发时,我建议阅读Bitsquid博客,该博客目前正在撰写一些关于他们新引擎的有趣话题。我还建议尽可能多地观看/阅读Mike Acton,他是失眠症游戏的主要引擎架构。他经常建议你首先查看数据,然后围绕它将处理的数据类型开发引擎。这一个:是Mike Acton在引擎开发方面所做的一个有趣的基础演练 迈克·阿克顿的一般博客的链接是。我还建议阅读他们的许多主题,因为它们非常好而且有趣 关于您的代码,我看不出您需要继承结构的原因。为什么立方体是3d对象?为什么立方体从任何对象继承?立方体或长方体只是定义范围(或半范围)的3个浮点数当然。我建议你有一个对象,然后使用与立方体、长方体或正方形的HAS-a关系。失眠症学会有一些关于基于组件的游戏实体的主题,我建议你阅读:(我认为这是正确的链接) 软件开发的三大谎言:
classcube
)开头,除非您使用前缀来指示类型(classccube
)这个问题是100%个适合于我不能要求迁移的问题,因为你的C++是相当奇怪的。当创建对象时,通常会说<代码>立方体C<代码>,而不是<代码>立方体C;当指针在一个局部变量上传递指针时通常是坏的,因为指针在对象超出范围时是无效的。AH是的,好的捕获我的C++有点生疏,在PHP/Python中开发了一段时间。