Questions tagged «c++»

C ++是一种静态类型化,自由格式,多范例,已编译的通用编程语言。

6
让游戏资源睁开眼睛是不专业的吗?
在经历了复杂的API和基本上让我筋疲力尽的zip文件之后,我在打包资源方面仍然遇到问题,我以为我也可以将游戏用人眼可见的资源打包在一个简单的文件夹中。 那会不专业吗?就个人而言,我什至从未见过游戏能够做到这一点,这基本上意味着玩家可以编辑游戏中他想要的任何东西,例如进入map1.txt并在某处添加X来创建墙或更改玩家精灵。到MS PAINT中的小马。
43 c++  assets 



5
游戏中的演员应该负责吸引自己吗?
我对游戏开发非常陌生,但对编程却不是。 我(再次)使用JavaScript的canvas元素在玩Pong类型的游戏。 我创建了一个Paddle具有以下属性的对象... width height x y colour 我也有一个Pong具有诸如...的属性的对象 width height backgroundColour draw()。 该draw()方法当前正在重置canvas,这就是出现问题的地方。 如果Paddle对象具有draw()负责其绘制的方法,或者draw()该Pong对象的负责负责其演员的绘制(我认为这是正确的术语,如果我不正确,请更正我)。 我发现在Paddle实例化两个对象Player和时,绘制自身会很有利Enemy。如果在没有Pong的draw(),我需要两次写类似的代码。 最佳做法是什么? 谢谢。

6
我们如何解决2D游戏中大视频存储需求?
我们如何解决2D游戏中大视频存储需求? 我们正在开发使用Allegro C / C ++的2D游戏(Factorio),并且随着游戏内容的增加,我们面临视频存储需求增加的问题。 目前,我们收集了有关将首先使用的图像的所有信息,尽可能地裁剪所有这些图像,并尽可能紧密地将它们组织成大图册。这些地图集存储在视频内存中,视频内存的大小取决于系统限制。目前,它通常是2张图像,最高可达8192x8192,因此它们需要256Mb至512Mb的视频内存。 这个系统对我们来说非常不错,因为通过一些自定义优化以及拆分渲染和更新线程,我们能够以60 fps的速度在屏幕上绘制成千上万的图像。我们在屏幕上有许多对象,因此允许大缩放是一项关键要求。由于我们要添加更多内容,因此视频内存要求会出现一些问题,因此该系统无法容纳。 我们想要尝试的一件事是拥有一张包含最常见图像的地图集,而第二幅则作为缓存。图像将根据需要从内存位图移到那里。这种方法有两个问题: 从内存位图到视频位图的绘制速度非常缓慢。 在Allegro中,除了主线程之外,无法使用视频位图,因此实际上是不可用的。 这是我们还有的一些其他要求: 游戏必须是确定性的,因此性能问题/加载时间永远不能改变游戏状态。 游戏是实时的,并且很快也会成为多人游戏。我们需要不惜一切代价避免甚至最小的结结巴。 游戏的大部分是一个连续的开放世界。 该测试包括批量绘制1万个精灵,大小从1x1到300x300,每种配置几次。我在Nvidia Geforce GTX 760上进行了测试。 当源位图在各个位图之间没有变化时(图集变体),视频位图到视频位图的绘制每个子图花费0.1us。大小没关系 视频位图到视频位图图形,而源位图在图形之间切换(非图集变体),每个子图形花费0.56us;大小也没关系。 内存位图到视频位图的绘制确实令人怀疑。从1x1到200x200的大小每个位图要花0.3us,所以速度并不是那么慢。对于较大的尺寸,时间开始急剧增加,201x201的时间为9us,291x291的时间为3116us。 使用Atlas可将性能提高5倍以上。如果我有10ms的渲染时间,则使用Atlas将每帧限制为100000个精灵,如果没有它,则限制为20000个精灵。这将是有问题的。 我还试图找到一种方法来测试阴影的位图压缩和1bpp位图格式,但是我无法找到在Allegro中执行此操作的方法。


7
如何实现可热交换的C ++模块?
快速的迭代时间是开发游戏的关键,在我看来,这比花哨的图形和具有大量功能的引擎更重要。难怪许多小型开发人员选择脚本语言。 能够暂停游戏并修改资产和代码,然后继续并立即使更改立即生效的Unity 3D方式对此非常有用。我的问题是,有人在C ++游戏引擎上实现了类似的系统吗? 我听说有些真正的超高端引擎确实可以,但是我对找出是否有办法在本土引擎或游戏中做到这一点更感兴趣。 显然会有折衷方案,而且我无法想象您可以在游戏暂停期间重新编译代码,重新加载代码并在各种情况下或在每种平台上工作都可以。 但是,对于AI编程和简单级逻辑模块来说,这也许是可能的。我似乎并不想在短期(或长期)项目中做到这一点,但我很好奇。
39 c++  hot-reload 

3
当几个类需要访问相同的数据时,应在哪里声明数据?
我有一个使用C ++编写的基本2D塔防游戏。 每个地图都是从GameState继承的单独的类。地图将逻辑和绘图代码委托给游戏中的每个对象,并设置数据(例如地图路径)。在伪代码中,逻辑部分可能看起来像这样: update(): for each creep in creeps: creep.update() for each tower in towers: tower.update() for each missile in missiles: missile.update() 对象(爬行,塔和导弹)存储在指针矢量中。这些塔必须能够进入蠕变矢量和导弹矢量,以制造新的导弹并确定目标。 问题是:我在哪里声明向量?它们是否应该是Map类的成员,并作为参数传递给tower.update()函数?还是在全球宣布?还是我完全想不到的其他解决方案? 当几个类需要访问相同的数据时,应在哪里声明数据?

1
如何创建对玩家和敌人有反应的粒子?
我目前正在使用自己的游戏引擎制作游戏,该引擎是用C ++编写的,并且使用的是最新的Directx SDK。 该游戏是一款自上而下的太空射击游戏(具有非常有趣的变化),我希望玩家能够飞过这种星云。我真的想尝试并钉牢好几百种微粒,使其在飞入它们的过程中从玩家飞船中移出时产生良好的触感。有点像粒子如何在XBLA上的《 Geomtry Wars》中移出播放器。 在C ++方面,我是一位经验丰富的程序员。但是,我不知道如何开始实现这种效果。有没有人想提出任何很棒的想法或设计选择?随意回答您喜欢的任何深度。
38 c++  directx  particles 

4
C ++中的实体/组件系统,如何发现类型并构造组件?
我正在使用C ++构建实体组件系统,希望遵循Artemis的风格(http://piemaster.net/2011/07/entity-component-artemis/),因为组件主要是数据包,包含逻辑的系统。我希望利用这种方法的以数据为中心的优势,并构建一些不错的内容工具。 但是,我遇到的一个难题是如何从数据文件中获取一些标识符字符串或GUID,并使用该标识符或实体来构造实体的组件。显然,我可以拥有一个大型解析函数: Component* ParseComponentType(const std::string &typeName) { if (typeName == "RenderComponent") { return new RenderComponent(); } else if (typeName == "TransformComponent") { return new TransformComponent(); } else { return NULL: } } 但这真的很丑。我打算经常添加和修改组件,并希望构建某种ScriptedComponentComponent,以便您可以在Lua中实现组件和系统以进行原型设计。我希望能够编写一个从某个类继承的BaseComponent类,也许将其扔进几个宏中以使一切正常工作,然后使该类可在运行时实例化。 在C#和Java中,这将非常简单,因为您获得了不错的反射API来查找类和构造函数。但是,我正在用C ++进行此操作,因为我想提高自己在该语言中的熟练程度。 那么用C ++如何做到这一点呢?我已经阅读了有关启用RTTI的信息,但似乎大多数人对此保持警惕,尤其是在我只需要将其用于对象类型的子集的情况下。如果在那里需要定制的RTTI系统,该从哪里开始学习编写一个系统?

5
在2D中,如何有效地找到最接近点的对象?
我有一个相当大的游戏引擎,我想要一个功能来查找最接近的点列表。 我可以简单地使用勾股定理找到每个距离并选择最小距离,但这需要对所有距离进行迭代。 我也有一个碰撞系统,从本质上讲,我将对象变成较小网格上的较小对象(有点像小地图),并且只有在相同网格空间中存在对象时,我才检查碰撞。我可以这样做,仅增大网格间距以检查紧密度即可。(而不是检查每个对象。)但是,这将需要在我的基类中进行其他设置,并使本已混乱的对象杂乱无章。这值得么? 是否可以使用一些有效且准确的方法来根据点和大小的列表来检测哪个对象最接近?
35 c++  2d  algorithm  vector  picking 

9
如何为C ++游戏创建保存文件?
我正在为视频游戏编程课程的决赛编写代码,我想知道如何为我的游戏创建保存文件,以便用户可以玩,然后稍后再回来。任何想法如何做到的,我之前做过的每件事都是单运行程序。

1
实体系统的缓存效率如何?
最近,我已经做了大量关于实体系统的阅读,以在我的C ++ / OpenGL游戏引擎中实现。我经常听到称赞的关于实体系统的两个主要好处是 由于不必纠缠复杂的继承层次结构,因此可以轻松地构造新类型的实体,并且 缓存效率,这让我很难理解。 当然,理论很简单;每个组件都连续存储在一块内存中,因此关心该组件的系统可以遍历整个列表,而不必在内存中跳转并杀死缓存。问题是我真的无法想到实际可行的情况。 首先,让我们看一下组件的存储方式以及它们之间的相互引用。系统需要能够使用多个组件,即渲染系统和物理系统都需要访问变换组件。我已经看到许多解决此问题的可能实现,但没有一个能很好地实现。 您可以让组件存储指向其他组件的指针,或者指向存储实体的指针的实体的指针。但是,一旦您将指针添加到组合中,您就已经失去了缓存效率。您可以确保每个组件数组都为'n'个大数组,其中'n'为系统中存在的实体数量,但是这种方法浪费内存。这使得很难向引擎中添加新的组件类型,但是仍然会浪费缓存效率,因为您要从一个数组跳到另一个数组。您可以交错实体数组,而不是保留单独的数组,但是您仍然在浪费内存。使得添加新组件或系统的成本高得惊人,但是现在有了使所有旧级别失效并保存文件的额外好处。 所有这些都假定在列表,每一帧或每笔价格变动中对实体进行线性处理。实际上,情况并非如此。假设您使用扇形/门户渲染器或八叉树来执行遮挡剔除。您也许可以在一个扇区/节点内连续存储实体,但是无论您是否喜欢它都将四处走动。然后,您将拥有其他系统,它们可能更喜欢以其他顺序存储的实体。在开始使用AI LOD之前,AI可以将实体存储在一个很大的列表中。然后,您需要根据与玩家之间的距离或其他一些LOD指标来拆分该列表。物理学将要使用该八叉树。脚本无关紧要,无论如何,它们都需要运行。 我可以看到在“逻辑”(例如ai,脚本等)和“世界”(例如渲染,物理,音频等)之间拆分组件,并分别管理每个列表,但是这些列表仍然必须彼此交互。如果AI不能影响用于实体渲染的变换或动画状态,则AI是没有意义的。 实体系统在现实游戏引擎中如何“高效缓存”?也许有一种混合方法,每个人都在使用而不是谈论,例如将实体全局存储在数组中并在八叉树中引用它?

3
尝试捕获或ifs在C ++中进行错误处理
是在游戏引擎设计中广泛使用了例外还是使用纯if语句更可取?例如,例外: try { m_fpsTextId = m_statistics->createText( "FPS: 0", 16, 20, 20, 1.0f, 1.0f, 1.0f ); m_cpuTextId = m_statistics->createText( "CPU: 0%", 16, 20, 40, 1.0f, 1.0f, 1.0f ); m_frameTimeTextId = m_statistics->createText( "Frame time: 0", 20, 20, 60, 1.0f, 1.0f, 1.0f ); m_mouseCoordTextId = m_statistics->createText( "Mouse: (0, 0)", 20, 20, 80, 1.0f, …

5
游戏架构/设计问题-在避免全局实例的同时构建高效的引擎(C ++游戏)
我对游戏体系结构有一个疑问:使不同组件相互通信的最佳方法是什么? 如果这个问题已经被问了一百万遍,我真的很抱歉,但是我找不到任何与我正在寻找的信息完全相同的信息。 我一直在尝试从头开始构建游戏(如果需要的话,请使用C ++),并观察了一些开源游戏软件的灵感(超级玛丽纪事报,OpenTTD等)。我注意到许多此类游戏设计在整个地方使用全局实例和/或单例(用于渲染队列,实体管理器,视频管理器等)。我试图避免使用全局实例和单例,并构建一个尽可能松散耦合的引擎,但是由于我对有效设计的缺乏经验,我遇到了一些障碍。(此项目的部分动机是解决这个问题:) 我已经建立了一个设计,其中有一个主要GameCore对象,该对象的成员类似于我在其他项目中看到的全局实例(即,它具有一个输入管理器,一个视频管理器,一个GameStage控制所有实体和游戏玩法的对象)对于当前加载的任何阶段等)。问题在于,由于一切都集中在GameCore对象中,所以我没有一种简单的方法来使不同的组件相互通信。 例如,以《超级玛丽纪事》为例,每当游戏的某个组件需要与另一个组件进行通信时(即,一个敌对对象想要将其自身添加到要在渲染阶段绘制的渲染队列中),它只会与全局实例。 对我来说,我必须让我的游戏对象将相关信息传递回该GameCore对象,以便该GameCore对象可以将该信息传递给需要它的系统的其他组件(即:对于上述情况,每个敌人对象会将其渲染信息传递回GameStage对象,对象将收集所有信息并将其传递回GameCore,然后依次将其传递给视频管理器进行渲染)。这确实感觉像是一个非常可怕的设计,而我正试图考虑一个解决方案。我对可能的设计的想法: 全局实例(Super Maryo Chronicles设计,OpenTTD等) 让GameCore对象充当中间对象,所有对象都通过该中间人进行通信(上述当前设计) 为组件提供指向它们将要与之交谈的所有其他组件的指针(即,在上面的Maryo示例中,敌人类将具有一个与之交谈的视频对象的指针) 将游戏分为子系统-例如,在对象中具有管理器对象,以GameCore处理子系统中对象之间的通信 (其他选项?...。) 我以为上面的选项4是最好的解决方案,但是我在设计它时遇到了一些麻烦……也许是因为我一直在考虑使用全局变量的设计。感觉就像我正在处理当前设计中存在的相同问题,并在每个子系统中以较小的比例复制它。例如,GameStage上面描述的对象为此在某种程度上做了尝试,但是该GameCore对象仍然参与该过程。 有人可以在这里提供任何设计建议吗? 谢谢!
28 c++  architecture 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.