Questions tagged «c++»

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

6
2D游戏中的对象应该渲染吗?
我正在制作不是基于图块的2D街头霸王般的游戏。通常人们建议将实体提供给渲染它们的渲染器,而不是渲染它们自己,但是看起来反函数更好, 为什么一个比另一个更好? 谢谢
16 c++  rendering 

2
有关游戏架构/设计模式的建议
我一直在研究2D RPG,有一段时间了,我发现自己做出了一些糟糕的设计决定。特别是有些事情引起了我的问题,所以我想知道其他人过去曾使用或将采用哪种设计。 作为一点背景,我从去年夏天的业余时间开始研究它。我最初使用C#进行游戏,但是大约3个月前,我决定切换到C ++。自从我大量使用C ++以来,我一直想对C ++有所了解,并且认为像这样的有趣项目将是一个很好的动力。我一直在广泛使用boost库,并且一直在将SFML用于图形,将FMOD用于音频。 我写了很多代码,但是我正在考虑废弃它并重新开始。 这是我关注的主要领域,并希望就其他人已解决或将要解决的正确方法获得一些意见。 1.周期性依赖 当我做在C#中的比赛中,我并没有真的要这个担心,因为它不是一个问题存在。转向C ++,这已经成为一个相当大的问题,让我觉得我可能设计不正确。我真的无法想象如何解耦我的班级,仍然让他们做我想要的事情。以下是依赖链的一些示例: 我有一个状态效果课。该类有许多方法(应用/取消应用,刻度线等)将其效果应用于角色。例如, virtual void TickCharacter(Character::BaseCharacter* character, Battles::BattleField *field, int ticks = 1); 每当角色受到状态影响时,都会调用此函数。它可用于实现诸如Regen,Poison等的效果。但是,它也引入了对BaseCharacter类和BattleField类的依赖。自然,BaseCharacter类需要跟踪当前对它们起作用的状态影响,因此这是周期性的。《战地风云》需要跟踪战斗方,并且该方类别有一个引入了另一个周期性依赖关系的BaseCharacters列表。 2-活动 在C#中,我大量使用了委托来勾勒角色,战场等事件(例如,当角色的健康状况发生变化,状态更改,状态效果被添加/删除时,都有一个委托。 )和战场/图形组成部分将与这些代表挂钩,以增强其效果。在C ++中,我做了类似的事情。显然,没有直接等效于C#委托的东西,所以我创建了如下代码: typedef boost::function<void(BaseCharacter*, int oldvalue, int newvalue)> StatChangeFunction; 在我的角色课上 std::map<std::string, StatChangeFunction> StatChangeEventHandlers; 每当角色的状态更改时,我都会迭代并调用地图上的每个StatChangeFunction。虽然有效,但我担心这是做事的不好方法。 3-图形 这是大事。它与我正在使用的图形库无关,但更多是概念上的。在C#中,我将图形与很多类结合在一起,我知道这是一个糟糕的主意。这次我想做到这一点,所以尝试了另一种方法。 为了实现我的图形,我将游戏中与图形相关的所有图形想象为一系列屏幕。即有一个标题屏幕,一个角色状态屏幕,一个地图屏幕,一个清单屏幕,一个战斗屏幕,一个战斗GUI屏幕,基本上,我可以根据需要将这些屏幕彼此叠加以创建游戏图形。无论活动屏幕是什么,都拥有游戏输入。 我设计了一个屏幕管理器,可以根据用户输入推送和弹出屏幕。 例如,如果您在地图屏幕上(平铺地图的输入处理程序/可视化器)并按下了“开始”按钮,则会向屏幕管理器发出呼叫,将主菜单屏幕推到地图屏幕上并标记地图屏幕无法绘制/更新。播放器将在菜单中导航,这将酌情向屏幕管理器发出更多命令,以将新屏幕推送到屏幕堆栈上,然后在用户更改屏幕/取消按钮时弹出它们。最后,当播放器退出主菜单时,我将其弹出并返回到地图屏幕,将其标记为要绘制/更新并从那里去。 战斗画面会更加复杂。我将有一个屏幕作为背景,一个屏幕使战斗中的每个参加者形象化,以及一个屏幕来使战斗的UI形象化。UI将挂接到角色事件中,并使用这些事件来确定何时更新/重绘UI组件。最后,每一次具有可用动画脚本的攻击都将在弹出屏幕堆栈之前调用一个附加层来对其自身进行动画处理。在这种情况下,每一层都始终标记为可绘制和可更新,并且我得到了一堆处理我的战斗图形的屏幕。 尽管我还无法使屏幕管理器正常工作,但我认为可以花一些时间。我的问题是,这是否完全值得?如果这是一个糟糕的设计,我想在投入太多时间制作我需要的所有屏幕之前先了解一下。您如何为游戏建立图形?
16 c++  architecture  rpg 

2
设计基于组件的游戏
我正在写一个射击游戏(例如1942年,经典的2D图形),我想使用基于组件的方法。到目前为止,我考虑了以下设计: 每个游戏元素(飞艇,弹丸,加电,敌人)都是一个实体 每个实体都是一组可以在运行时添加或删除的组件。例如位置,雪碧,健康,IA,损坏,边界框等。 这个想法是飞艇,弹丸,敌人,威能不是游戏类。实体仅由其拥有的组件定义(并且可以随时间变化)。因此,玩家飞艇从Sprite,Position,Health和Input组件开始。上电有Sprite,Position,BoundingBox。等等。 主循环管理游戏“物理”,即组件之间如何交互: foreach(entity (let it be entity1) with a Damage component) foreach(entity (let it be entity2) with a Health component) if(the entity1.BoundingBox collides with entity2.BoundingBox) { entity2.Health.decrease(entity1.Damage.amount()); } foreach(entity with a IA component) entity.IA.update(); foreach(entity with a Sprite component) draw(entity.Sprite.surface()); ... 组件在主C ++应用程序中进行了硬编码。实体可以在XML文件中定义(lua或python文件中的IA部分)。 主循环对实体并不太在意:它仅管理组件。该软件设计应允许: 给定一个组件,获取它所属的实体 给定一个实体,获取类型为“ type”的组件 …

3
C ++中的有限状态机
因此,我已经阅读了很多有关使用FSM进行游戏状态管理的知识,例如FSM是什么,以及使用堆栈或状态集构建状态。我经历了所有这些。但是,我一直坚持为此目的编写一个经过精心设计的FSM 实际实现。具体而言,一个人如何干净地解决状态之间的转换问题(一个状态应该如何使用其他状态的数据),等等。有没有人有使用C ++设计或编写实现的技巧,或者还有更好的代码示例?

2
延迟着色渲染器中用于几何传递的常见渲染优化技术是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我一直在使用OpenGL 3和C ++(以及用于窗口管理的glfw)开发游戏引擎。到目前为止,我已经取得了进步,完成了除声音实体和优化之外的大部分工作。该引擎使用延迟着色,因此由于延迟着色本身是普通GPU的累赘过程,因此我想尽可能地优化渲染过程。 当前系统由一个场景组成,其中包含一个渲染器,并且当前世界和世界将实体和照明实体分开std::vectors。 因此,基本上每次场景被调用时->render(),它都会调用渲染器,将世界作为参数传递,并从世界中获取实体迭代器,将其吸引到FBO,然后通过照明实体进行第二遍。而且我认为这还不够。 即使实体不在屏幕空间中,我当前的算法也会遍历所有内容。我正在考虑一种优化当前渲染算法的方法,使其仅针对可见对象调用API函数,那么优化此类渲染器的常用技术有哪些?

1
*调用* =(或* =调用*)是否比编写单独的函数(对于数学库)要慢?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为话题成为Game Development Stack Exchange。 4年前关闭。 我有一些矢量类,其算术函数如下所示: template<typename T, typename U> auto operator*(const Vector3<T>& lhs, const Vector3<U>& rhs) { return Vector3<decltype(lhs.x*rhs.x)>( lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z ); } template<typename T, typename U> Vector3<T>& operator*=(Vector3<T>& lhs, const Vector3<U>& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; …

1
如何从实体组件系统游戏引擎中的cpu缓存中受益?
我经常阅读ECS游戏引擎文档,这是明智使用cpu缓存的良好架构。 但是我不知道如何从cpu缓存中受益。 如果将组件保存在连续内存中的数组(或池)中,则只有在顺序读取组件的情况下,才是使用cpu缓存BUT的好方法。 当我们使用系统时,它们需要实体列表,这些列表是具有特定类型组件的实体列表。 但是这些列表以随机的方式而不是顺序地提供了组件。 那么如何设计ECS以最大化缓存命中率呢? 编辑: 例如,物理系统需要具有RigidBody和Transform组件的实体的实体列表(有一个RigidBody池和一个Transform组件池)。 因此,其更新实体的循环将如下所示: for (Entity eid in entitiesList) { // Get rigid body component RigidBody *rigidBody = entityManager.getComponentFromEntity<RigidBody>(eid); // Get transform component Transform *transform = entityManager.getComponentFromEntity<Transform>(eid); // Do something with rigid body and transform component } 问题在于,entity1的RigidBody组件可以在其池的索引2处,而entity1的Tranform组件在其池的索引0处(因为某些实体可以具有某些组件,而其他组件不能具有其他组件,并且是因为添加/删除了实体/组件)。 因此,即使组件在内存中是连续的,也会随机读取它们,因此它将有更多的缓存未命中,不是吗? 除非有一种方法可以预取循环中的下一个组件?

1
程序星场发生器
是否有人知道任何程序生成星场的代码? 理想情况下,我希望它是基于物理学的,这样我就可以拥有逼真的行星和卫星。最好的方法是使用C ++,开源并与Ogre3d兼容。 如果没有可用的内容,我不害怕编写大学论文中的代码。

4
(c ++)游戏的日志记录库
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Game Development Stack Exchange 的主题。 12个月前关闭。 我知道很多日志库,但没有测试很多。(GoogleLog,Pantheios,即将推出的boost :: log库...) 在游戏中,尤其是在远程多人游戏和多线程游戏中,日志记录对于调试至关重要,即使最终删除所有日志也是如此。 假设我正在制作需要日志(多人游戏,多线程和/或多进程)的PC游戏(而不是控制台),并且我有充分的理由寻找要记录的库(例如,我没有时间或对我为自己的情况正确写出自己的能力不自信)。 假设我需要: 性能 易于使用(允许流式传输或格式化或类似的操作) 可靠(不要泄漏或崩溃!) 跨平台(至少Windows,MacOSX,Linux / Ubuntu) 您会推荐Wich日志库吗? 目前,我认为boost :: log是最灵活的一种(您甚至可以远程登录!),但是性能更新不佳:是为了高性能,但尚未发布。Pantheios通常被引用,但是我在性能和用法上没有比较点。我已经使用我自己的lib很长时间了,但是我知道它不能管理多线程,所以即使它足够快,它也是一个大问题。Google Log似乎很有趣,我只需要对其进行测试,但是如果您已经比较了这些库和更多库,那么您的建议可能会有用。 游戏通常对性能要求很高,但调试起来很复杂,因此最好了解在我们特定的情况下具有明显优势的日志记录库。

1
我如何知道正在使用多少视频卡内存?
我想以编程方式在运行时确定程序正在使用多少视频卡内存。具体来说,我想知道如何在使用OpenGL的Windows机器上执行此操作,但也对在其他平台上执行此操作的方法感兴趣。 我知道有一些实用程序可以向我显示程序运行时的内存使用情况,但是我希望能够从我的代码中查询该信息。
15 opengl  c++  windows  c 

5
如何摆脱“缺少DLL”的问题?
我使用Visual C ++ 2015和OpenGL制作了一些游戏。当我在计算机上运行它时没有问题,但是当我在其他计算机上运行它时,它表明缺少某些DLL。我想知道如何确保下次不会发生这种情况,我应该考虑些什么,以便避免文件丢失的问题?

4
如何加载球形行星及其区域?
我正在设计一个部分由行星探索组成的游戏。我想为它们使用伪随机生成,当我不得不加载它们而不是存储每个细节的时候,从定义的种子重新生成,这会太繁琐。因此,我将随机种子和玩家所做的修改(如果有)存储在文件中。 玩家必须能够从轨道上看到行星(细节水平非常低,然后下降到地面,缓慢增加他/她着陆区域的细节水平,并从另一侧卸下超出玩家视野的行星。 如果必须在平坦的地面上进行操作,则可以使用正方形块系统轻松进行操作。但是这里的问题是行星几乎是球体。 那么,在精确点附近加载地面细节(起伏和接地物体)的最佳方法是什么? 我虽然已经提出了两种解决方案,但是两者都有一个弱点: 1.将球切成正方形块。 一旦玩家离地面足够近,我只需要从他/她的位置改善最接近的正方形的细节即可。 如果这还不够,当玩家在地面上或真的离地面很近时,我仍然可以在子正方形中切割每个正方形以进行加载。 但是,正如您在图片上看到的那样,如果玩家尝试着陆,那将是一个问题:正方形变成非常细长的矩形,甚至最后一行都变成三角形,此外还要加载很多东西,一代似乎会扭曲。 2.从二十面体开始。 在这里,我可以在玩家靠近时增加围绕他的位置的三角形镶嵌。 但是我不知道如何将三角形定位成比玩家的位置更近。我听说笛卡尔坐标在这种情况下可能有用,但我不知道如何使用它们。 我正在使用C ++ / OpenGL,所以这里要生成和加载的主要是表示表面浮雕和颜色/纹理的顶点。

3
使用OpenGL从头开始编写游戏引擎[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 6年前关闭。 我想从头开始编写我的游戏引擎,以供学习之用,先决条件是什么,该怎么做?您向我推荐什么编程语言和东西?另外,如果您有不错的文章和书籍,那也将很棒。提前致谢! 我的编程语言和工具是: C / C ++仅使用C会好吗? 蟒蛇 的OpenGL 吉特 广东发展银行 我想从中学到什么: 核心游戏引擎 渲染/图形 游戏玩法/规则 输入(键盘/鼠标/控制器等) 在渲染/图形中: 3D 底纹 灯光 纹理化
15 c++  c 


1
使用GLSL 330版实现Skybox
我正在尝试让Skybox使用OpenGL 3.3和GLSL 330版。 我在网络上的任何地方都找不到完整的现代OGL skybox教程,因此我对一个较旧的版本进行了现代化(使用glVertexAttribPointer()而不是gl_Vertex用于顶点等)。它主要在工作,但是有两个主要细节: 天空盒更像天空三角形,纹理严重扭曲和拉伸(它们应该是星场,我在黑色背景上看到线条)。我99%确信这是因为我没有完全正确移植旧教程。 这是我的Skybox类: static ShaderProgram* cubeMapShader = nullptr; static const GLfloat vertices[] = { 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, …
14 c++  opengl  glsl  cubemap  skybox 

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.