游戏开发

专业和独立游戏开发人员的问答

3
如何在基于块的2D游戏中实现遮挡照明?
我想要2D照明可以被游戏中的物体阻挡。我的游戏具有自顶向下的视图,所有游戏对象均由矩形描述。 假设我有一个10x10的世界,我在1x1处放置了一个灯光,并在该灯光周围放置了墙壁。我希望能够看到1x1的光源,但看不到其他任何地方,因为它被墙壁挡住了。 我听说过投射光线有效,但实际上如何运作?

3
GNU GCC是否用于AAA游戏?
GNU GCC是一种非常常见的编译器,但似乎几乎没有人将其用于AAA游戏之类的较大项目。对我来说,它的工作原理很好,从来没有问题。但是我想知道为什么所有AAA游戏似乎都使用商业编译器(例如Intel Studio)吗?为什么这有关系?GNU GCC还优化了所有系统的代码,而不是仅针对Intel的代码,所以为什么它们会困扰于诸如Intel Studio之类的东西?
11 c++  game-industry  c  mingw 

2
如何将key_callback与包装类实例相关联?
我正在尝试将我的GLFW3调用包装到一个类中: class WindowManager { private: GLFWwindow* window_; GLFWmonitor* monitor_; Keyboard* keyboard_; ... } 我正在尝试设置一个单例键盘类,该类收集执行期间的按键。在GLFW中,我可以设置一个key_callback超出类定义的函数(一个自由函数): WindowManager::WindowManager() { ... glfwSetKeyCallback(window_, key_callback); ... } // not a class function void key_callback(GLFWwindow* window, int key, int scan code, int action, int mods) { ... } 如何关联回调和WindowManager实例,以便设置keyboard_对象值?我不能使它key_callback成为成员函数,WindowManager因为那将是WindowManager类的成员,并且在C ++类的成员函数中,它们的名称会晃晃,因此该函数将不起作用。
11 c++  glfw 

2
我该如何使好人攻击只击中坏人,反之亦然?
我的游戏有许多不同类型的好人和许多不同类型的坏人。他们都将向对方发射弹丸,但我不希望任何对准都会发生意外附带损害。因此,坏人不应该打/伤害其他坏人,好人不应该打/伤害其他好人。 我想解决此问题的方法是通过使其Unit实例(这是javascript,btw)具有alignment可以为goodor 的属性bad。而且我只会让碰撞发生 class Attack boolean didAttackCollideWithTarget(target) return attack.source.alignment != target.alignment and collisionDetected(attack.source, target) 当然,这是伪代码。 但是我之所以问这个问题,是因为我觉得除了在Unit类中添加另一个属性之外,还有一种更优雅的方法来设计它。

2
自动组织/智能库存系统?
在过去的一周中,我一直在使用Unity3D开发清单系统。最初,我在Design3的工作人员那里得到了帮助,但是直到我们分离路径才花了很短的时间,因为我真的不喜欢他们编写代码的方式,它完全没有OOP的味道。 我向前迈出了进一步的一步-物品占用多个插槽,先进的放置系统(物品会尽力找到最合适的位置),本地鼠标系统(鼠标被困在活动行李袋中)等。 这是我工作的演示。 我们希望在游戏中拥有一种自动组织功能-而不是自动排序。我们需要此功能,因为我们的库存将是“实时”的-不同于《生化危机1,2,3》等,您可以在其中暂停游戏并在库存中执行操作。现在想象一下,您的自我处于僵尸包围的稠密情况下,没有子弹,环顾四周,发现地面上附近有子弹,因此您去追捕它们并尝试将其捡起,但是它们却没有不适合!您查看您的库存,发现如果您重新组织一些物品,它将很合适!-现在的玩家-在那种情况下没有时间重组,因为他被僵尸包围了,如果他停下来并组织库存以腾出空间(实时记住库存,没有暂停),他会死掉的- 自动执行该操作会很好吗?-是的! (我相信这已经在《地牢围攻》之类的某些游戏中实现了,因此请确保它是可行的) 例如看这张照片: 是的,因此,如果您对问题进行自动排序,则会得到空格,但是这很糟糕,因为:1-昂贵:不需要完全排序操作即可释放这些空格,在第一张图片中,只需将红色项目滑到底部到最左边,您会得到与自动排序相同的空间。2-播放器很烦人:“ F告诉你重新订购我的东西吗?” 我不是在问“如何编写代码”,我只是在问一些指导,在哪里看,涉及什么算法?这和图和最短路径有关吗?我希望不要因为我没有设法继续我的大学学习而已:/即使是这样,只要告诉我,我就会学到相关的知识。 请注意,可能有不止一种解决方案。因此,我想我要做的第一件事就是弄清楚情况是否“可以解决”-如果我知道如何确定情况是否可以解决,那么我可以“解决”它。我只需要知道使其“可解决”的条件即可。而且我相信必须有一些算法/数据结构。 这是一张试图容纳1x3物品的多种解决方案的照片: 箭头仅显示一种解决方案,但是如果您看到的话,会发现多个解决方案。这就是我最终不自动排序而是找到解决方案并应用它的原因。 请注意,如果我花时间在上面,我会想出一种解决方法,但这并不是最好的方法,就像用脚而不是手握住车轮一样!XD或就像尝试解决需要数组的问题一样,但是您还不知道它们的存在!那么什么是正确的方法呢? 评论更新 @Stephen我真的不是Alogs中的专家,您提到了“背包”和@BlueRaja-Danny Pflughoeft提到了2D装箱算法。他们之间有某种联系/相同吗?-我仍然对应该如何处理感到困惑。 是的,我已经在使用“启发式”,但是我真的不知道我是:D它找到第一个可用的插槽,然后查看该项目是否适合该插槽。 我不知道是否可以根据商品的“体积”(我称为nSlotsRequired = nRowsReq * nColsRec)订购商品,因为例如您有一个2x2和1x4的商品,它们的体积相同,但是形状不同,对接下来的其余项目的处理方式会产生不同的影响。所以...:/ 我看了这个视频,我真的很喜欢完整的打包想法,但是我想知道如何处理它,因为库存是2D的。我什至不能确定垃圾箱的包装是这里的关键,因为,确实可以有一个以上的袋子,但是在我们的游戏中,它只能是一个袋子。因此,仅需在“一个”袋子中放入物品即可。因此,该视频中的示例(管道和总线)与我的问题并不完全匹配。还看了一些关于背包的事情,我没有看到“价值”与我的物品/库存有何关系,但我猜“重量”与体积大是一样的,不确定。

3
如何在JavaScript中实现分支对话?
我正在用JavaScript开发一种非常基本的视觉新颖游戏。我是一个初学者,所以我这样做只是为了娱乐和学习,由于计划不周,当您进入对话分支时遇到了一些问题。 目前,我将游戏脚本保存在一个字符串变量中,并使用诸如“#〜”之类的标签将每个场景分解成较小的数组,以便游戏脚本如下所示: var script = "Hello World!#~How are you today?" var gameText = script.split("#~"); //gameText[0]= Hello World! 这对于线性事物非常有用,但是我应该如何处理对话框树中的分支?这种方法似乎非常复杂,因为我必须确切知道每条路径的长度,然后如果我需要更改任何内容,那将是一件令人头疼的事情。 如何以更简单的方式做到这一点?我希望使用香草JavaScript,因为我希望该游戏可以与Web Run Time一起使用。

3
如何修复物理引擎中“弹出”或抖动的对象?
我有一个简单的物理引擎,可以通过直接校正重叠物体的位置(现在仅是圆形)来解决碰撞,而不仅仅是更改速度或施加脉冲。仅在影响已解决后或在集成过程中才更改速度。 我遇到的问题是,在对象堆中,顶部对象在堆底部的对象上施加了过多的压力(隐式存在,算法中没有压力建模),这导致它们被推过地板,等等 我想通过按其y坐标对对象进行排序来解决此问题,因此可以从下至上解决冲突。但是现在,引擎显示了实际上应该处于静止状态的对象的奇怪弹出行为(请参阅gif) 不只是提供源代码,这可能是什么?

1
延期贴花正常问题
我一直在研究延迟贴花系统。到目前为止,我已经完成了投影部分,这意味着我可以单击场景中的某些东西,它将正确地将贴图投影到对象的表面上。 我希望添加到此系统中的其他几项内容:普通裁剪和普通映射贴花。正常剪裁是当我丢弃延伸锐角的片段时。在这里看到。解决此问题的一种方法是,丢弃G缓冲区中的法线与贴花法线之间存在较大差异的片段。这将需要读取G缓冲区的正常纹理。 为了进行贴图法线贴图,我需要将贴图的法线(来自法线贴图)与G缓冲区的法线混合。需要写入G缓冲区的常规纹理。 我希望很明显,为了支持这两个功能,我需要在同一着色器通道中读取和写入普通纹理。可悲的是,这是未定义的行为,所以我想知道是否还有其他方法可以实现这些功能。

4
炸弹人的极致
我正在开发Bomberman游戏的克隆,并且正在尝试不同类型的AI。首先,我使用A *在状态空间中进行搜索,现在我想使用Minimax算法尝试其他方法。我的问题是我发现假定的每位minimax选手都在交替。但是在Bomberman中,每个玩家都同时做出一些动作。我认为我可以为一个游戏滴答生成所有可能的状态,但是在有四个玩家和5个基本动作(4个动作和炸弹放置)的情况下,它在游戏树的第一级给出5 ^ 4个状态。该值将随着下一个级别的增长呈指数增长。我想念什么吗?有什么方法可以实现它,还是应该使用完全不同的算法?谢谢你的建议
11 ai 

5
有没有办法使诸如MMORPG的动态世界水平扩展?
想象一下,一个拥有500多个播放器的开放世界,其数据更改速度高达20个更新/播放器/秒。上一次我在类似的MMORPG中工作时,它使用SQL,因此很笨拙,无法始终查询数据库。而是将所有播放器作为C ++对象从数据库加载到内存中并使用它们。也就是说,它是垂直缩放的。可以使该服务器水平扩展吗?是否有一个旨在同时支持该数量的更新的数据库?

1
管理图形状态和组件?
在处理图形时,我经常倾向于做很多过早的优化。我一直尝试遵循一些原则: 使D3D组件的数量最少。(渲染状态,缓冲区,着色器等) 仅在绝对必要时绑定组件。(尚未绑定,等等。) 尽可能专门化组件。(仅设置必要的BindFlags等) 这导致我构建非常复杂的包装器来管理创建的组件和当前管道状态。这不仅消耗了我宝贵的开发时间,还增加了另一层复杂性。 最糟糕的是:我什至不知道这一切是否值得麻烦。 我的一些优化考虑因素可能已经在较低级别上实现,而我只是在复制它们,从而浪费了CPU时间。由于对性能的影响可以忽略不计,因此其他考虑可能完全没有必要。 所以我的问题是: 以上哪些准则有效,我应在多大程度上遵循这些准则? GPU如何处理状态变化? 如果我更改了一个从未使用过的状态会怎样?(处于活动状态时,不会进行抽奖。) 绑定各种不同组件的实际性能损失是什么? 还应考虑哪些其他性能方面的考虑? 请不要只是告诉我,在达到实际极限之前,我不应该关心性能。从实践的角度来看,这显然是正确的,但我主要对该理论感兴趣。我不知何故需要抵制建立最佳图形框架的冲动,而且我认为我通常无法通过“过早的优化讲座”来做到这一点。 管理组件 我目前正在使用SlimDX作为托管包装用C#编写DirectX 11应用程序。这是一个非常低级的包装器,而我当前的抽象是基于它的。 使用Direct3D抽象时,有一些明显的优势。设置环境,加载着色器,设置常量和绘制网格更加简单,并且使用的代码更少。而且,由于它管理着大多数组件的创建和处理,因此它们可以在任何地方自动重用,而且我几乎完全避免了内存泄漏。 您通常如何管理所有图形组件和资源? 您能否推荐任何与下面的示例类似的托管包装器? 这是我当前实现的一个示例。我对界面非常满意。它具有足够的灵活性来满足我的需求,并且易于使用和理解: // Init D3D environment var window = new RenderForm(); var d3d = new Direct3D(window, GraphicsSettings.Default); var graphics = new GraphicsManager(d3d.Device); // Load assets var mesh = GeometryPackage.FromFile(d3d, "teapot.gp"); var …

3
查看两个体素是否互连的算法
我正在寻找以下问题的良好算法:给定3D体素网格(可能为空或填充),如果我选择两个不相邻的体素,我想知道它们是否通过以下方式相互连接其他体素。 例如(为了说明2D的情况),其中#是实心正方形: 1 2 3 a # # # b # # c # # # 如果我选择a3和c3,我想尽快确定它们是否已连接;如果在a3和c3之间存在通过填充像素的路径。(当然,实际情况是在3D体素网格中。) 我已经研究了泛洪算法和路径查找算法,但不确定如何选择。两者都执行不必要的工作:洪水填充会尝试填充所有体素,但这不是必需的。寻路算法通常与寻找最短路径有关,这也是不必要的。我只需要知道,如果有是一个路径。 我应该使用什么算法? 编辑:根据评论,我认为应该添加以下内容:体素的内容事先未知,并且还需要算法来检测是否删除(清空)体素是否会导致该组体素破裂分成两个或更多个较小的组。

1
如何获得中途变色的光?
我想到创建光源和一些彩色窗口。现在,窗户是半透明的。我怎样才能做到,当光线(例如纯白色)射到玻璃上并继续穿过玻璃时,却将颜色更改为与通过的玻璃相同的颜色? 我知道这里描述的效果可以通过在窗口“彩色”侧使用区域灯来伪造,但是如果我只想拥有一个白点灯怎么办?
11 opengl  lighting  color 

2
XNA / MonoGame的便携式缓冲键盘输入?
作为一个初步的解决方案,我目前在C#/ XNA游戏项目中使用Nuclex框架来缓冲键盘输入。可悲的是,nuclex依赖于SlimDX.Directinput.dll,因此据我所知只能在Windows操作系统下使用。但是,我使用MonoGame定位其他平台(Linux,OSX等),因此我正在寻找一种可移植的方式来集成所有平台上的缓冲键盘输入。有没有?

2
重播-存储和定时
我正在从事赛车游戏,只是实现了一个幽灵精灵来重播过去的比赛。我使用物理引擎,经过大量阅读后得出的结论是,存储重影数据以进行重放的最佳方法是在给定的时间点记录汽车的位置和旋转,例如此处所述:https:// gamedev。 stackexchange.com/a/8380/26261。 但是,在重播期间找到这些时间点的一种好方法是什么?一个示例是具有以下数据的记录: time: +3.19932 (seconds since race start) position: 180,40 (position at that time) rotation: 30.4 (rotation at that time) 但是我有几个问题: 重新播放时,不太可能再次达到3.19932的确切时间点-更有可能的是,我的时间点大约是3.1,必须找到最接近的匹配记录。插值时,即使是上下最接近的匹配。听起来效率很低,很费时间吗? 我可以在哪个列表结构中存储这些记录以供以后重播?数组?难道不是说比赛时间越长,匹配特定时间记录的搜索时间会增加吗? 我应该为时间点使用哪个频率?每个帧都是-我猜想是过大了,相反,我应该保存,即每第n帧并在它们之间进行插值,这使存储问题在2中更加困难。 那么这个想法甚至是正确的方法吗?如果是,我如何有效地存储和检索数据?请注意,我通常希望使用上面的数据结构,而不是确定性的游戏状态和记录用户输入等。 谢谢你的帮助! 编辑:我意识到我应该描述我使用的环境:iPhone的Cocos2D。有一种方法update:(ccTime)delta。理想情况下,每1/60秒调用一次此方法,但不能保证- delta是自上次游戏结束以来经过的实际时间,并且可能多于或少于1/60。我想用这种方法存储当前的游戏状态。

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.