Questions tagged «architecture»

代码的结构。有关游戏引擎内部设计的问题。

5
键盘输入系统处理
注意:由于API限制(SFML),我必须轮询而不是回调。对于缺少“体面”的头衔,我也表示歉意。 我想我有两个问题。如何注册我收到的输入,以及如何处理。 处理输入 我在说的是您已经注册了例如已经按下“ A”键的事实,以及如何从那里开始操作。 我看过整个键盘的排列,例如: bool keyboard[256]; //And each input loop check the state of every key on the keyboard 但这似乎效率很低。例如,您不仅将键“ A”耦合到“玩家向左移动”,而且还会每秒检查30-60次每个键。 然后,我尝试了另一个仅查找所需密钥的系统。 std::map< unsigned char, Key> keyMap; //Key stores the keycode, and whether it's been pressed. Then, I declare a load of const unsigned char called 'Quit' or …

2
如何避免编写Manager类?
我似乎一直在读,XxxManager在游戏引擎编程中使用样式类是一个坏主意,但是即使我尝试避免使用样式类,我也总是最终得到可以容纳所有参与者/实体/游戏世界位置并对其进行操作的东西。最终成为Manager另一个名字的if。 这真的是一个不好的模式吗?如果是这样,有哪些替代方案?

3
识别游戏引擎中的资产?
我想识别我已加载的资产,但是我不知道应该选择哪一个。有2个选项: 名称(字符串) 对于unordered_map(O(1)),这是最简单也最快的方法,但是比使用整数慢。 在代码中容易理解。 整数 最快的。 用代码无法理解。 我知道字符串不是那么安全或快速,但是那样不好,还是仅在AAA标题中算作不好?我可以使用整数来枚举枚举,但是如果我在运行时从文件加载场景,资产等,则不能使用枚举。如果这些整数是在运行时生成的,是否可以使这些整数可读? 我知道这个问题在互联网上有很多线索,但是我无法确定在什么情况下这很重要。

4
您如何允许在开发的后期阶段编写网络代码?
我目前正处于编写游戏的早期阶段,最终我希望在很多方面进行改进。 我该如何跳过编写网络代码的过程,却又很容易实现,即不必为了添加游戏而重写整个游戏。 我要记住什么? 我有一个组件模式,可以将物理/碰撞检测,游戏逻辑,数据类型和动画/渲染彼此分离。 如何编写没有实现任何网络代码但可以在本地测试的客户端和服务器? 我应该在客户端中做什么,然后在服务器中做什么?我是否应该假装自己已经完成网络代码,并在服务器和客户端之间发送消息并考虑到延迟等原因,即使没有延迟也是如此? 编辑:计划成为自上而下的RPG。我在想一个简单的多人游戏,在这里为朋友托管服务器,所以作弊并不是什么大问题(谁想和作弊的朋友一起玩?)。我仍然想采用“服务器永远是正确的”方法。 编辑2:我想我正在寻找一些关于我的思维定式的指针。我应该如何处理键盘输入,动画等,而不是立即应用所有效果/更改。嗯,毕竟,我可能需要适当地阅读网络知识,这是我希望通过制作某种可以在本地工作的网络框架来摆脱的东西。

2
如何为联网的实时游戏实现游戏状态快照系统?
我想创建一个简单的客户端-服务器实时多人游戏作为我的网络课程的一个项目。 我已经阅读了很多有关实时多人网络模型的文章,并且了解了客户端和服务器之间的关系以及滞后补偿技术。 我想做的事情类似于Quake 3网络模型:基本上,服务器存储了整个游戏状态的快照;在从客户端接收到输入后,服务器将创建一个反映更改的新快照。然后,它计算新快照和最后一个快照之间的差异,并将它们发送给客户端,以便它们可以同步。 在我看来,这种方法确实很可靠-如果客户端和服务器之间具有稳定的连接,则仅发送少量必需的数据以保持它们同步。如果客户端不同步,则也可以请求完整快照。 但是,我找不到实现快照系统的好方法。我发现很难摆脱单人编程架构,并思考如何以以下方式存储游戏状态: 所有数据与逻辑分离 可以计算游戏状态快照之间的差异 通过代码仍然可以轻松操纵游戏实体 快照类如何实现?实体及其数据如何存储?是否每个客户实体都有一个与服务器上的ID匹配的ID? 快照差异如何计算? 总的来说:游戏状态快照系统将如何实现?

3
纯函数式编程和游戏状态
在功能编程语言中,是否存在一种通用的技术来处理状态(通常)?每种(功能)编程语言都有解决全局状态的解决方案,但我想尽可能避免这种情况。 以纯功能方式的所有状态都是功能参数。因此,我需要将整个游戏状态(包含世界,玩家,位置,得分,资产,敌人等的巨大哈希图)作为要在给定输入或触发器上操纵世界的所有函数的参数。函数本身从游戏状态Blob中提取相关信息,对其进行处理,操纵游戏状态并返回游戏状态。但这似乎是解决这个问题的穷人解决方案。如果我将整个游戏状态放到所有函数中,那么与全局变量或命令式方法相比,对我没有任何好处。 我可以只将相关信息放入函数中,然后返回将为给定输入执行的操作。一个功能将所有动作应用于游戏状态。但是大多数功能都需要大量 “相关”信息。move()需要物体的位置,速度,碰撞图,所有敌人的位置,当前的健康状况……因此,这种方法似乎也不起作用。 所以我的问题是我该如何处理功能性编程语言中的大量状态-特别是对于游戏开发? 编辑:在Clojure中有一些用于构建游戏的游戏框架。部分解决此问题的方法是将游戏中的所有对象作为“实体”穿入并放入一个大袋子。一个吉甘特的主要功能是保持屏幕和实体和处理事件(:on-key-down,:on-init这个实体,...),然后运行主显示屏循环。但这不是我要寻找的干净解决方案。

2
使用实体ID系统有什么好处?
我目前正在阅读《编程游戏AI示例》一书。 该书提到为游戏中的每个实体分配唯一的ID号。通常,当实体A需要联系实体B时,A通过将B的ID号发送到EntityDatabase类来获取对B的引用。此类接收ID号并返回对实体的引用。 还可以从包含某些实体(主要游戏角色)的ID的文件中获取某些实体的ID号。 我的问题是:我为什么要这样做?为什么我不能直接使用引用?有时很难直接获得参考?使用ID系统是一种常见方法吗?是否有不使用ID的游戏? 我是游戏开发的新手。请说明使用实体ID系统的好处。优缺点。具体的例子会很棒。谢谢

3
极度困惑“恒定游戏速度最大FPS”游戏循环
我最近在Game Loops上阅读了这篇文章:http : //www.koonsolo.com/news/dewitters-gameloop/ 推荐的最后一种实现方式使我深感困惑。我不明白它是如何工作的,看起来像是一团糟。 我了解以下原则:以恒定的速度更新游戏,剩下的一切将使游戏尽可能多地渲染。 我认为您不能使用: 获取输入的25个报价 渲染游戏975次 方法,因为您将在第二部分的第一部分得到输入,这会感觉很奇怪吗?还是那是文章中正在发生的事情? 实质上: while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) 那怎么有效呢? 让我们假设他的价值观。 MAX_FRAMESKIP = 5 让我们假设next_game_tick,它是在初始化之后的瞬间分配的,在说主游戏循环之前... 500。 最后,由于我在游戏中使用SDL和OpenGL,并且仅将OpenGL用于渲染,因此假设GetTickCount()返回自调用SDL_Init以来的时间。 SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization. 资料来源:http : //www.libsdl.org/docs/html/sdlgetticks.html 作者还假设: DWORD next_game_tick = GetTickCount(); // GetTickCount() returns …

1
我如何干净,优雅地处理类之间的数据和依赖关系
我正在研究SFML 2中的2d自上而下的游戏,需要找到一种优雅的方式来使一切正常工作并融合在一起。 请允许我解释一下。我有许多类都继承自抽象基础,该基础为所有类提供了draw方法和update方法。 在游戏循环中,我调用update然后在每个类上绘画,我认为这是一种非常常见的方法。我有瓷砖,碰撞,播放器和包含所有瓷砖/图像/纹理的资源管理器的类。由于SFML中输入的工作方式,我决定让每个类在其更新调用中处理输入(如果需要)。 到目前为止,我一直根据需要传递依赖关系,例如,在按下播放键时在玩家类中,我在碰撞类上调用了一个方法来检查玩家想要移动到的位置是否是碰撞,并且只有在没有碰撞的情况下才移动播放器。 这在大多数情况下都可以正常工作,但是我相信可以做得更好,但我不确定如何做。 现在,我需要执行一些更复杂的事情,例如:玩家能够走到地面上的某个物体,按一下键来捡起/掠夺它,然后它就会显示在库存中。这意味着需要发生一些事情: 在按键时检查播放器是否在可放物范围内,否则不要继续。 查找项目。 将项目上的精灵纹理从其默认纹理更新为“掠夺”纹理。 更新项目的碰撞:它可能已更改形状或已完全移除。 需要使用添加的项目更新库存。 我如何使一切交流?在我当前的系统中,我的类将超出范围,并且方法调用到处都是。我可以将所有类捆绑在一个大管理器中,并为每个类提供对父管理器类的引用,但这似乎只好一点。 任何帮助/建议将不胜感激!如果有什么不清楚的地方,我很乐于扩展。
12 c++  2d  architecture  sfml 

4
循环类依赖
有两个彼此需要的类是不好的设计吗? 我正在写一个小游戏,其中有一个GameEngine包含一些GameState对象的类。要访问几种渲染方法,这些GameState对象还需要了解GameEngine类-因此是循环依赖项。 您会称这个设计不好吗?我只是问,因为我不太确定,目前我仍然可以重构这些东西。
12 c++  architecture 

1
如何通过网络保持数据结构同步?
语境 在我正在开发的游戏中(一点点点击的图形冒险),游戏世界中发生的几乎所有事情都由动作管理器控制,该动作管理器的结构有点像: 因此,例如,如果检查对象的结果使角色打招呼,走了一下然后坐下,我只需生成以下代码: var actionGroup = actionManager.CreateGroup(); actionGroup.Add(new TalkAction("Guybrush", "Hello there!"); actionGroup.Add(new WalkAction("Guybrush", new Vector2(300, 300)); actionGroup.Add(new SetAnimationAction("Guybrush", "Sit")); 这将创建一个新的操作组(上图中的整行)并将其添加到管理器中。所有组的并行执行,但动作内各组链接在一起,使得第二一个只有第一个完成之后开始。当组中的最后一个动作完成时,该组将被销毁。 问题 现在,我需要在网络上复制此信息,以便在多人游戏会话中,所有玩家都可以看到同一件事。序列化各个动作不是问题。但是,在联网方面,我绝对是初学者,我有几个问题。为了简化讨论,我认为我们可以将动作管理器组件抽象为简单的: var actionManager = new List<List<string>>(); 如何继续使所有播放器之间的上述数据结构的内容保持同步? 除了核心问题之外,我还涉及其他一些问题(即,上述同一问题的所有可能含义): 如果我使用服务器/客户端体系结构(其中一个玩家同时充当服务器和客户端),并且其中一个客户端产生了一组操作,那么他应该将它们直接添加到管理器中,还是只发送请求到服务器,这又将命令每个客户端添加该组? 丢包之类的呢?游戏是确定性的,但我认为客户执行的动作顺序中的任何差异都可能导致世界状态不一致。我该如何防范此类问题? 如果我一次添加太多操作怎么办,这不会引起连接问题吗?有什么缓解的办法吗?

4
面向对象的OpenGL
我使用OpenGL已经有一段时间了,并且阅读了大量的教程。除了它们中的许多仍在使用固定管道这一事实外,它们通常会将所有的初始化,状态更改和绘制都放在一个源文件中。对于教程的有限范围来说,这很好,但是我很难确定如何将其扩展到完整的游戏。 如何将OpenGL的使用跨文件分割?从概念上讲,我可以看到拥有一个仅将内容渲染到屏幕上的渲染类的好处,但是诸如着色器和灯光之类的东西将如何工作?我应该为灯光和着色器之类的课程设置单独的类吗?

2
我会为事件处理程序疯狂吗?我的设计是否走错了路?
我想我已经决定我真的很喜欢事件处理程序。我可能会因分析瘫痪而受苦,但是我担心会使我的设计变得笨拙,或者在我的设计决策中遇到其他无法预料的后果。 我的游戏引擎目前使用平移式高架摄像机进行基本的基于Sprite的渲染。我的设计看起来像这样: 场景处理程序 包含实现SceneListener接口的类的列表(当前仅限于Sprites)。每个刻度调用一次render(),并发送onCameraUpdate(); 消息发送给SceneListeners。 InputHandler 每个刻度轮询一次输入,然后将简单的“ onKeyPressed”消息发送给InputListeners。我有一个Camera InputListener,它包含一个SceneHandler实例并触发updateCamera();。基于输入的事件。 AgentHandler 每个刻度一次在任何代理(AI)上调用默认操作,并将检查堆栈中是否有已注册的任何新事件,并根据需要将它们分配给特定的代理。 因此,我有一些基本的Sprite对象,它们可以在场景中移动并使用基本的转向行为进行移动。我已经开始进行碰撞检测了,这是我不确定我的设计方向是否正确的地方。拥有许多小型事件处理程序是一种好习惯吗?我想我必须要实现某种CollisionHandler。 我会更好地使用一个更统一的EntityHandler来处理一个类中的AI,碰撞更新和其他实体交互吗?还是只是实现许多不同的事件处理子系统就可以了,它们会根据事件类型将消息传递给彼此?我是否应该编写一个仅负责协调所有这些子事件处理程序的EntityHandler? 我意识到在某些情况下,例如我的InputHandler和SceneHandler,它们是非常特定的事件类型。我的游戏代码很大一部分都不关心输入,而很大一部分则不关心纯粹在场景渲染中发生的更新。因此,我感到孤立那些系统是合理的。但是,我要问的是专门针对游戏逻辑类型事件的问题。

2
正确的方法来抽象XBox控制器
我有一个XBox360控制器,我想将其用作应用程序的输入。 我无法解决的是通过接口公开此内容的最佳实践方法。 在幕后,处理控制器的类依赖于轮询按钮状态。 我最初尝试了一些链接: Event ButtonPressed() as ButtonEnum 这里ButtonEnum是ButtonRed,ButtonStart等... 这是有一点限制的,因为它仅支持按钮按下,不支持按住/模式(按两次,等等)。 下一个想法是简单地向应用程序公开按钮状态,例如 Property RedPressed as Boolean Property StartPressed as Boolean Property Thumb1XAxis as Double 这是非常灵活的方法,但实际上它会迫使应用程序投入过多工作,并且需要应用程序进行轮询-如果可能的话,我更喜欢事件驱动。 我考虑添加多个事件,例如: Event ButtonPressed(Button as ButtonEnum) Event ButtonPressedTwice(Button as ButtonEnum) Event ButtonHeldStart(Button as ButtonEnum) Event ButtonHeldEnd(Button as ButtonEnum) 但这似乎有些笨拙,并且在“绑定按钮”屏幕上确实很痛苦。 有人可以给我指出处理控制器输入的“正确”方法。 注意:我在实现接口的类中使用SlimDX。这使我可以非常轻松地读取状态。任何可以解决我的问题的替代方案也将受到赞赏

2
有关XNA游戏架构的问题
因此,我终于开始玩XNA了,并一直在制作2D游戏(我从iOS上开发它的朋友那里得到了很多美术资产) 许多事情似乎很容易做到,而且开箱即用,但是由于大多数文献(例如,我买的书)对2D的关注都不多,所以我一头雾水。 对于以下问题的任何澄清或指向更多信息,我将不胜感激: 游戏服务的意义是什么?我了解将对象注册为服务的全部习惯,以便任何其他GameComponent都可以抢占它,但是如何击败这个问题却仅仅是使其成为公共的还是静态的?例如,我的书建议在Game.cs类中注册SpriteBatch对象。我不确定将其简单地设置为公共/静态是多么可取,因为无论如何应该只存在一个Game实例(单个)? 我对何时应该从GameComponent或RenderableGameComponent继承感到困惑。我正在尝试遵循管理器/控制器的设计,以便所有实体都由一个管理器创建/拥有,其他事物也一样。我目前有每个Manager / Controller都继承自GameComponent,但是如何让Game对象拥有所有Manager并手动调用它们的更新并绘制呢? 我注意到初始化是在 ContentLoad()之前调用的,我发现这很烦人,因为在我的Initialize中我想创建一些实体(即Sprite,Player等),但是我无法为其加载它们由于尚未调用SpriteSheets或Textures,因此尚未进行调用。我可能是初始化不正确,还是人们只是在ContentLoad中进一步分配纹理? 那些似乎是我最大的“ WTF ”,不是很了解

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.