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中开发了一段时间。