游戏引擎开发

时间:2010-08-05 03:31:51

标签: c++

我将重新创建一个我创建的游戏引擎。这次我想做得对,所以我对设计模式进行了一些研究,并尝试将各个部分组合在一起以实现我的目标。游戏引擎的想法很简单,但与此同时我不想牺牲可用性。

以下是我所想的蓝图,请告诉我你是否能看到任何垮台,尤其是可扩展性:

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 ++。

4 个答案:

答案 0 :(得分:6)

首先,阅读this

“正确”执行此操作的唯一方法是将过程颠倒过来。在游戏中使用

后,启动引擎

二。 C ++不是Java。 C ++没有基类Object类,也不需要它。不要试图将所有内容都放入继承层次结构中。如果每个对象都是多态的,那么你就会陷入困境(一切都必须通过引用或指针传递,并通过引用或指针传递,以避免切片,例如,它甚至不会使你的代码更清晰)

世界中的对象具有位置。它不是一个。所以不要继承x, y, z坐标。将它们放在一个坐标类中,该坐标类可以作为成员添加到需要它的类中。

字符串查找很慢,并且您需要处理字符串不唯一时的情况。 (如果我不小心添加两个名为“cube”的对象,该怎么办。

为什么不尽可能地依赖普通引用或指针?

为什么我不能简单地Engine->Draw(c)告诉引擎绘制立方体?

但实际上,最重要的建议是,不要尝试编写一个收缩包装的游戏引擎供以后使用。你最终会到达现在的位置:需要“重写它,这次是正确的”。如果你想得到一些有用的东西,你需要从它的用例开始。先写游戏。完成后,您可以开始重构代码以将引擎分开。这样,您最终得到了一个工作的引擎

答案 1 :(得分:2)

除非您使用哈希映射,否则字符串查找速度很慢。除了将对象添加到引擎后,您应该可以执行以下操作:

Engine->Draw();

将遍历添加到引擎中的所有对象并绘制它们。

Object应具有虚拟Draw功能,Object2d和Object3d应覆盖该功能。然后引擎将遍历所有对象并调用它们。

另一件事是您不需要为不同类型添加添加功能。您应该可以执行以下操作:

Engine->AddObject(&c);
Engine->AddObject(&s);

它将弄清楚如何处理它。你现在拥有它的方式就是要求引擎的用户知道他们想要做什么,而它应该被封装得足以让你不需要,但是要足够开放以至于它不会妨碍你想要做一些不受引擎支持的事情,所以我会保留Lib2d和Lib3d访问器,尽管纯粹主义者会说封装被破坏了。

答案 2 :(得分:2)

  1. 我很确定你应该使用浮点数代替对象坐标的整数。使用浮动,您可以以任何帧速率运行游戏。有了整数就会有问题。
  2. 理想情况下,类名称应以大写字母(class Cube)开头,除非您使用前缀来指示类型(class CCube)。
  3. (最重要的一个)在创建对象层次结构之前,您应该知道要创建什么。想象一下游戏关卡,想一想对象是什么,对它们进行分类,然后尝试制作层次结构。你不需要为所有东西创建一个类(也许你甚至不需要一个复杂的层次结构,也许你可以在不使用继承的情况下编写完整的东西),但你应该能够在你写作时想象最终产品码。除非您需要,否则不要引入新概念。没错,看起来你不知道自己想做什么,现在很少有类可能完全不适合最终产品。

答案 3 :(得分:0)

首先,尽量不要将设计模式放在问题上。关于这类解决方案,请阅读http://realtimecollisiondetection.net/blog/?p=44http://realtimecollisiondetection.net/blog/?p=81

其次,重要的是你要看一下你在编写引擎时会做什么样的游戏。因此,列出您将要处理的数据类型以及如何处理这些数据是绝对有意义的。

第三,在游戏引擎开发方面,我建议您阅读Bitsquid博客http://bitsquid.blogspot.com/,该博客目前正在撰写有关其新引擎的一些有趣主题。我还建议尽可能多地观看/阅读Mike Acton,他是Insomniac Games的主要引擎架构。他经常建议您先查看数据,然后根据它将处理的数据来开发引擎。这一个:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-189-multicore-programming-primer-january-iap-2007/lecture-notes-and-video/embed17/是Mike Acton关于发动机开发的一个有趣的地面基础。

Mike Acton的一般博客链接是http://www.insomniacgames.com/blogcast/blog/mike_acton。我还建议阅读他们的很多主题,因为它们非常好而有趣。

关于您的代码,我认为没有必要为什么需要继承结构。为什么立方体是3d对象?为什么Cube会继承任何东西? Cube或Box只是3个浮点数,用于定义它的范围(或半范围)。我建议您有一个对象,然后使用HAS-A关系到立方体或方框或方块。 Insomniac有一些关于基于组件的游戏实体的主题,我建议你阅读它:http://www.insomniacgames.com/assets/filesadynamiccomponentarchitectureforhighperformancegameplay.pdf(我认为这是正确的链接)。

软件开发的三大谎言: http://www.insomniacgames.com/blogcast/blog/all_categories/1500756