游戏与游戏引擎?

时间:2011-02-12 23:39:43

标签: c++

我想知道是否有人可以告诉我游戏和游戏引擎如何适应游戏开发。具体来说,我的意思是,游戏引擎实际上没有游戏。那么基本上我不清楚的是,游戏开发者是否构建了一个引擎,然后创建一个继承引擎的新类,从而成为游戏?

例如:

class ShooterGame : public Engine
{
};

所以基本上我不清楚游戏代码在引擎中的位置。

8 个答案:

答案 0 :(得分:24)

游戏与实际游戏引擎之间的区别在于架构。游戏逻辑特定于一个游戏,而游戏引擎是可以重复使用的东西。就像操作系统为应用程序提供实用程序一样,游戏引擎对游戏代码也是如此。

游戏引擎通常会有不同的API:

  • 加载音频,纹理,3D模型等多媒体数据
  • 提供游戏循环并触发由用户输入引起的各种事件
  • 网络
  • 图形渲染和使用光照,粒子效果或凹凸贴图使游戏看起来很漂亮的各种技术
  • 音频
  • 人工智能
  • 允许定义游戏规则,游戏玩法和游戏逻辑的API

大多数游戏开发者都不会编写自己的游戏引擎。这将是太多的工作。相反,他们将重用他们公司拥有的游戏引擎或许可一个。对于第一人称射击游戏,id Software和Unreal是两种流行的选择。

一旦他们拥有引擎,他们就必须开始编写代码来制作游戏。这是使用游戏引擎提供的API完成的。例如,Valve使开发人员使用C ++。如果你想要一个怪物,你可以扩展出Entity类,并定义这个怪物在该基类中的行为。

我建议您阅读各种游戏引擎提供商提供的文档和教程。请记住,有些游戏被归类为“mods”,有些则归为“总转化次数”。通常,mod不会改变游戏的引擎,并且总转换可以向游戏引擎添加或移除重要特征。

以下是我建议的几个来源:

答案 1 :(得分:4)

实际上,我无法区分引擎和框架之间的区别。这只是两个不同的名字。

奇怪的是,游戏引擎完全是关于客户端的,似乎你不需要服务器框架,而纯套接字就足够了。

但现实并非如此,至少应该有一些像rails或django这样的框架来简化你的服务器开发。在可伸缩性,广播和其他领域,不要看到游戏服务器比Web开发更难。

有一个名为smartfox服务器的商业解决方案,以及一个名为pomelo framework的新开源解决方案,我试过两个,pomelo要好得多。 pomelo.netease.com就是它的家。

答案 2 :(得分:1)

它还取决于引擎的“级别”。 我的意思是,引擎是如何从某种游戏风格中抽象出来的。可能会有一些小东西,例如专注于FPS的引擎,可以针对室内区域,室外区域以及高速飞行而优化。因此,即使引擎可能无法锁定游戏,某些游戏类型也会更容易实现某些引擎。

但如上所述,游戏不会继承引擎,它可能会更多地利用它的功能,你可能会将组件附加到它的现有组件上。或者扩展属于引擎的组件。

class CoolDiscoLight : public Engine::Light
{
};

...
//and somewhere in the source

"CoolDiscoLight cdl = new CoolDiscoLight etc..."

EngineInstance.AddLight(cdl);
...

更可能的事实是,只需从光线延伸并重载正确的功能,光线就可以被水平编辑器等访问,所以你根本不会通过光源创建它们。

答案 3 :(得分:0)

游戏引擎通常会考虑可以拔出的代码,而无需更改自己的游戏。

就像已经说过的那样,你如何使用引擎的代码取决于它自己的引擎。

通常,您将从引擎库中实例化类并使用它们。你这样做的方式将取决于引擎。

有些可能会提供更多功能,而有些功能则集中在模块上。

通常,完整的游戏引擎只会将各种子引擎绑定在一起,例如处理实际绘图到屏幕的图形引擎。用于模拟游戏世界的物理引擎。 UI和菜单的UI引擎。一个处理有事情的网络引擎。

“游戏引擎”可能会直接内置这些组件,或者它可能只是包装另一个引擎/库,以便您以与引擎其余部分类似的方式使用它。

答案 4 :(得分:0)

  

游戏开发者是否构建引擎,然后创建一个新类   继承自成为游戏的引擎?

这取决于。大多数时候,开发人员会使用现有的游戏引擎,但有时他们不会因为不存在想要的效果。

我尝试了很多不同的游戏引擎。他们中的大多数都表现得像这样:

  1. 通过扩展其基本实体的类来定义精灵和声音元素
  2. 为便于管理而定义组
  3. 为IO和精灵之间的互动定义房间或世界
  4. 编写常用函数中的逻辑,如“update()”(该函数将按帧调用)
  5. 修改程序的入口以进入第一个“房间”或“世界”(可以是菜单)
  6. 因此,游戏引擎主要负责定义屏幕应如何在中间层显示,而开发人员无需担心will there be too many sprites loading outside the view-port?When I press a key, where should the callback be located?等问题,“它们是实体吗?相撞?“但注重游戏的更高层逻辑。

答案 5 :(得分:0)

我一直在寻找游戏创作帮助,并发现引擎是整个游戏的基础,就像玩家创建更容易以及自定义图形和物理或类似项目。你还需要考虑你打算做的下几场比赛,并使用引擎在你已经为你构建的游戏中构建很少。

如果你想了解游戏引擎是什么,那么如果功能或想要在这里构建一个引擎是怎么回事。

  • GLFW - 用于打开OpenGL窗口。这是一个很棒的小C库 几乎可以打开窗户。这很棒,因为 这不用担心。

  • GLEW - 管理OpenGL扩展。如果你要做OpenGL,那真的没有解决这个问题。

  • Lua - 脚本。虽然我的游戏还没有使用它,但它几乎是业界脚本的首选语言 快速虚拟机实现。

  • Protobuf - 管理外部状态。你可以在这里找到它的文档。缺点 这是你可以在任何你通常使用XML的地方使用protobuf。

  • Qt - 用于标准容器和字符串操作。你不需要使用整个Qt库集,只需要使用QtCore库。这给了 您可以访问QList(std :: vector),QHash(优化的std :: map),QString (具有多个编码支持的std :: string)和许多其他 好吃的东西。你应该采用它的部分原因是因为 文档非常棒。

  • GLM - 数学库。如果您只想在游戏中使用数学,那么这就是您的库。

  • freetype-gl - 文本渲染。它是一个用于在OpenGL中渲染文本的编写良好的库,您可以这样做 更糟糕的是。

  • libRocket - 基于HTML和CSS的GUI库。当你只想在屏幕上显示一个用户界面时,这很棒,但如果你想要的话会有问题 添加动画。

查找列表here

对于引擎来说,这些都是很好的想法,只需将图书馆组合起来,然后根据你自己构建的引擎构建游戏,如果你没有一支优秀的团队,你需要花一些时间才能完成。此外,我已阅读此列表和许多其他人,这是最好的2d列表。此外,您不需要构建引擎UI,因为您只需要引擎的基础知识并为每个游戏构建单独的项目。这是如何正确的。

  • Engine.h
    • enginepart1.h
    • enginepart2.h
    • enginepart3.h(等)

(对于引擎使用.h而不是.cpp,因为你不能引用engine.cpp但你可以引用engine.h) 在构建之后

  • Game.cpp
    • gameresources.h(资源包括引用Engine.h)
      • gamepart1.h
      • gamepart2.h(等)

以这样的方式构建引擎但不是100%这样才是最佳的

  • 框架:数学,随机,效用,资产,网络,窗口,图形,音频......
  • 玩家:AbstractPlayer,得分,输入,碰撞,反应,技能,库存......
  • 地图:AbstractMap,Area,Town,NPC,...
  • Enemy:AbstractEnemy,Creep,Boss,BaseAI,FuzzyAI,......
  • 状态:IntroScreen,MainMenu,LoginScreen,Game,PauseMenu,...
  • 界面:按钮,文字,输入框,......

找到此here

像这种

一样构建它
  • 框架:数学,随机,效用,资产,网络,窗口,图形,音频......
  • 实体/角色:玩家,敌人NPC,友善NPC,BaseAI ......
  • 地图:地图/关卡编辑器(如果需要),地图对象(可以放在这里),特殊地图功能,......
  • 状态控制:简介屏幕,主菜单,逻辑画面,游戏状态,暂停菜单,...
  • 界面:按钮,文字,输入框,......

答案 6 :(得分:0)

它经常喜欢这个

class ShooterGame
{
  Engine anEngine;
  public void Run();///run the world here
};

答案 7 :(得分:-1)

是的,他们说的是什么。我补充说,游戏引擎通常是为一种游戏风格而设计的。飞行模拟器的需求与Quake非常不同。像Oblivion这样的游戏正在将这些需求合并在一起,所以很快就不会出现这种情况。