Questions tagged «architecture»

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

4
对于基于组件的体系结构,适当的粒度级别是多少?
我正在开发具有基于组件的体系结构的游戏。一个Entity拥有一组Component实例,每个实例都有一组Slot用于存储,发送和接收值的实例。工厂功能,例如Player具有所需组件和插槽连接的生产实体。 我正在尝试确定组件的最佳粒度。例如,现在Position,Velocity和Acceleration都是串联的独立组件。Velocity并且Acceleration可以轻松地重写为统一的Delta组件或Position,Velocity并且Acceleration可以与诸如Friction和Gravity组成整体Physics组件。 一个组件应该承担最小的责任(以大量的互连为代价),还是应该将相关组件组合为整体组件(以灵活性为代价)?我倾向于前者,但我可以使用第二种意见。

4
如何设计一种面向对象语言的游戏引擎?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 每当我尝试用任何面向对象的语言编写游戏时,我总是要面对的第一个问题(在考虑编写哪种游戏之后)是如何设计引擎。即使我正在使用现有的库或框架(例如SDL),我仍然发现自己必须为每个游戏做出某些决定,例如是否使用状态机来管理菜单,用于资源加载的类类型等。 什么是好的设计,将如何实施?需要进行哪些权衡以及它们的利弊?

5
如何设计AssetManager?
设计一个AssestManager来保存对游戏图形,声音等的引用的最佳方法是什么? 这些资产是否应该存储在键/值映射对中?即我要“背景”资产,并且地图返回相关的位图?有没有更好的办法? 具体来说,我在写一个Android / Java游戏,但答案可能很笼统。

4
“游戏对象”-和基于组件的设计
在过去的3-4年中,我一直在从事一些业余爱好项目。只是简单的2d和3d游戏。但是最近我开始了一个更大的项目。在过去的几个月中,Soo一直在尝试设计一个游戏对象类,该类可以作为我所有游戏对象的基础。因此,在进行了多次尝试和模子测试之后,我转向了Google,该公司迅速为我指出了一些GDC PDF和PowerPoint。现在,我试图掌握基于组件的游戏对象。 我知道引擎会创建一个游戏对象,然后附加不同的组件来处理诸如健康,物理,网络以及您所做的任何事情。但是我不明白的是,组件X如何知道Y是否更改了对象的状态。就像PhysicsComponent如何知道玩家是否还活着一样,因为健康状况由HealthComponent控制。HealthComponent如何播放“玩家死亡动画”? 我的印象是(在HealthComponent中)是这样的: if(Health < 0) { AnimationComponent.PlayAnimation("played-died-animation") } 但是话又说回来,HealthComponent如何知道附加的游戏对象是否附加了AnimationComponent?我在这里看到的唯一解决方案是 检查是否连接了AnimationComponent(在组件代码内部或在引擎侧) 有组件需要其他组件,但这似乎与整个组件设计相抗衡。 像HealthWithAnimationComponent,HealthNoAnimationComponent这样写,如此反复,似乎又与整个组件设计思想相抵触。

3
什么会导致ALT-TAB“烦人” /缓慢/毛躁?
这更多是一个开放式问题,但是我希望对如何避免该问题有一些深刻的了解。 在Windows上玩游戏时,我可能想按ALT-TAB键。有些游戏没有问题,另一些游戏却不那么容易:它们可能需要使用AGES才能切换回原来的状态。有些游戏甚至容易崩溃或出现怪异的行为,例如图形失真或声音不稳定。 我只是想知道是什么原因导致这种现象?这是DirectX还是OpenGL?是由于游戏在屏幕设置更改时“聪明”并缓存/清除缓存引起的吗?(我想我在按ALT-TAB键时确实会收到某种信号吗?) 我自己没有任何问题,但是我想知道要避免什么,哪种“聪明”的窍门可能会导致这种可怕的客户体验?

4
如何设计易于单元测试的游戏软件?
在游戏开发环境中使用像JUnit这样的测试框架是否可行?为了使游戏更具可测试性,您可以遵循哪些设计注意事项?可以/应该测试游戏的哪些部分,应该/必须将哪些部分留给人工测试? 例如,如果将游戏循环封装在一个函数中,似乎很难进行测试。我喜欢重构一个“更新”功能,该功能需要时间增量并向前推进游戏逻辑。这提供了一些有趣的技巧,例如通过提供虚假的,较慢的时间增量来降低游戏速度的功能。

3
如何将有限状态机连接到基于组件的体系结构?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 状态机似乎在基于组件的体系结构中造成有害的依赖关系。 具体来说,如何在状态机和执行与状态相关的行为的组件之间处理通信? 我在哪里: 我是基于组件的体系结构的新手。 我正在制作格斗游戏,尽管我认为这并不重要。我设想我的状态机将用于切换“蹲下”,“破折号”,“阻塞”等状态。 我发现这种状态管理技术对于基于组件的体系结构来说是最自然的系统,但是它与我读过的技术相冲突: 用于可变行为角色的动态游戏对象组件系统它建议所有组件都激活/停用通过不断检查激活条件来检查自己。 我认为像“跑步”或“步行”之类的动作在状态上是有意义的,这与此处接受的响应不同:https : //gamedev.stackexchange.com/a/7934 我发现这很有用,但是模棱两可:如何在基于组件的游戏架构中实现行为?它建议有一个单独的组件,其中仅包含状态机。但是,这需要在状态机组件和几乎所有其他组件之间进行某种耦合。我不明白该如何处理耦合。这些是一些猜测: A. 组件取决于状态机: 组件接收对状态机组件的引用getState(),该引用返回枚举常量。组件会定期进行自我更新,并根据需要进行检查。 B. 状态机取决于组件: 状态机组件接收对其监视的所有组件的引用。它查询他们的getState()方法以查看它们的位置。 C. 它们之间的某种抽象 使用事件中心吗?命令模式? D. 使用引用组件状态模式的单独状态对象。创建了单独的状态对象,这些状态对象激活/停用一组组件。状态机在状态对象之间切换。 我正在将组件视为方面的实现。他们在内部完成使该方面实现所需的一切。看起来组件应该独立运行,而不依赖其他组件。我知道一些依赖是必要的,但是状态机似乎要控制我的所有组件。

4
如何实现永不重启的测试世界?
我正在寻找有关如何执行以下操作的想法:我想用Java编写一个简单的“世界”。我可以先启动一个,然后在以后再添加新对象,以模拟/观察现有对象之间的不同行为。然后计划是在观看旧对象一段时间之后,对较新的对象进行编码,然后将其加载/放置到现有环境中。问题是,我不想在启动世界后就停止或重新启动它,我希望它运行几周,但我确实需要能够放入对象并重做/重写/删除/创建/更改它们的功能。随着时间的流逝,无需重启。这个世界可能像X / Y位置的100 x 100数组一样简单,并且可以使用平铺的图形用户界面直观地表示世界。我知道我需要某种滴答计时器流程来监视对象并为每个对象提供“行动的机会” 示例:我在星期一对World.java进行了编码,并使其运行。然后在星期二,我编写了一个名为Rock.java的新类(不会移动)。然后,我将它加载(或以某种方式放置)到这个已经运行的世界中(这只是将它随机放置在world数组中,并且永远不会移动)。然后在星期三,我创建一个名为Cat.java的新类,并将其放到世界中,再随机放置,但是这个新对象可以在世界范围内移动(在某个时间单位内),然后在星期四,我编写一个名为Dog的类。也可以四处移动的java,但如果它在邻居位置,则可以“作用于”另一个对象,反之亦然。 就是这个 我不知道我需要对实际的世界类进行编码才能知道如何检测/加载/跟踪未来(以及当前不存在)的对象。 关于如何使用Java进行此类操作的任何想法?

6
测试驱动开发在游戏开发中是否可行?
作为获得Scrum认证的人,我在开发系统时倾向于采用敏捷方法,甚至使用Scrum框架中的某些画布来管理我的日常工作。 此外,我想知道TDD是否可行? 如果我相信这个GD问题,那么TDD在游戏开发中没有多大用处。 为什么在游戏架构中不更多地使用MVC和TDD? 我来自工业编程,其中预算很大的大型项目需要完美无缺地工作,因为如果不对代码进行彻底的内部和外部测试,可能会导致灾难性的情况。 另外,遵循Scrum规则鼓励您在工作中按时完成工作,同时Scrum中的每个动作都必须按时完成!因此,我同意当他们在上面链接的问题中说停止尝试构建系统并开始编写游戏时。Scrum所说的就是这样,首先不要尝试构建完美的系统:在Sprint末期使它正常工作。然后,如果需要,在第二个Sprint中工作时重构代码! 我知道,如果不是所有负责游戏开发的部门都使用Scrum,那么Scrum变得毫无用处。但是,让我们考虑一下所有部门都使用Scrum的情况……我认为TDD可以编写无错误的代码,尽管您不想编写“完美”的系统/游戏。 所以我的问题是: TDD在游戏开发中是否可行?

6
用户友好但仍然灵活的基于组件的实体系统有哪些设计?
我对基于组件的实体系统感兴趣已有一段时间了,并阅读了无数文章(Insomiac游戏,相当标准的Evolve Your Hierarchy,T-Machine,Chronoclast ...等)。 它们似乎都在某种东西的外部具有结构: Entity e = Entity.Create(); e.AddComponent(RenderComponent, ...); //do lots of stuff e.GetComponent<PositionComponent>(...).SetPos(4, 5, 6); 而且,如果您引入了共享数据的概念(这是到目前为止我所见过的最好的设计,因为这并不是在所有地方都复制数据) e.GetProperty<string>("Name").Value = "blah"; 是的,这非常有效。但是,它并不是最简单的读写方法。感觉很笨拙,而且对您不利。 我个人想做这样的事情: e.SetPosition(4, 5, 6); e.Name = "Blah"; 当然,获得这种设计的唯一方法是回到Entity-> NPC-> Enemy-> FlyingEnemy-> FlyingEnemyWithAHatOn这种设计试图避免的层次结构。 有没有人看到这种组件系统的设计既灵活又保持了用户友好性?就此而言,设法以一种很好的方式解决(可能是最困难的问题)数据存储? 用户友好但仍然灵活的基于组件的实体系统有哪些设计?

3
如何避免游戏引擎中的硬编码
我的问题不是编码问题;它通常适用于所有游戏引擎设计。 您如何避免硬编码? 这个问题比看起来要深得多。假设,如果您要运行一个加载操作所需文件的游戏,如何避免load specificfile.wad在引擎代码中说些类似的话?另外,加载文件时,如何避免load aspecificmap in specificfile.wad说呢? 这个问题几乎适用于所有发动机设计,并且应该对尽可能少的发动机进行硬编码。做到这一点的最佳方法是什么?

3
矮人要塞的命令排序体系结构
实现AI命令排序系统的最优雅的方法是什么?例如,在矮人堡垒中,当您标记一个森林区域进行砍伐时,矮人将按照以下顺序进行操作: 去树上 砍树 将木材运送到库存中 去另一棵树 等等.. 我已经有一个不起作用的堆栈命令。从空闲状态到到达树的目标图块的1。 我担心的是,当我创建更多这样的订单时,这会变得混乱吗: 造房子 去储存 将木材带到建筑面积 回到库存 将石头带到建筑面积 动画建筑精灵 种植 去储存 将种子带到农场 酿造 去储存 使植物静止 动画酿造精灵 所以我的问题是,如何实现矮人堡垒之类的命令排序系统并同时避免使用意大利面条式代码?我需要研究任何数据结构吗?我需要将命令序列放在单独的xml文件中吗?

3
游戏引擎和数据驱动设计
我听说过数据驱动设计,并且已经进行了一段时间的研究。因此,我阅读了几篇文章以了解这些概念。 文章之一是由Kyle Wilson撰写的数据驱动设计。正如他所描述的,在我看来,应将应用程序代码(即,用于控制诸如存储器,网络等资源的代码)和游戏逻辑代码分开,并且游戏逻辑代码应由外部数据源驱动。在这一点上,我可以想象开发人员将编写某种游戏编辑器,以接受有关游戏中对象的外部数据(例如角色信息,武器信息,地图信息...)。场景设计将由程序员编写的自定义语言/工具编写脚本,以使游戏设计师在游戏对象之间创建交互。游戏设计师将使用现有/自定义脚本语言编写游戏脚本,或使用拖放工具创建游戏世界。我能想到的工具方法示例是World Editor,它通常与Bliizard的游戏一起打包。 但是,另一篇文章反对使用数据驱动设计,即反对数据驱动设计的案例。作者建议不要让数据来驱动游戏设计,因为开发游戏会花费更多时间,因为游戏设计师会承担编程的重担。取而代之的是,将有一个游戏程序员可以从草图设计中自由编程游戏,并在游戏编程完成后由游戏设计师进行验证。他称这是程序员驱动的。我对这种方法的看法与我以前使用的方法类似:游戏逻辑是应用程序本身,与上述想法相适应,应用程序是游戏编辑器,实际游戏是基于该工具设计的。 对我来说,第一种方法似乎更合理,因为游戏组件可用于许多项目。使用第二种方法反对数据驱动的设计,游戏代码仅属于该游戏。这就是为什么我认为魔兽争霸拥有如此多的游戏类型,例如原始的魔兽争霸和各种自定义地图,以及其中最著名的一种:DOTA实际上定义了一种新的游戏类型。因此,我听说人们称World Editor为游戏引擎。游戏引擎应该是这样吗? 因此,在所有这些之后,我只想验证我对这些想法(数据驱动,程序员驱动,脚本编写等)的理解是否存在缺陷?

4
如何在基于组件的游戏架构中实现行为?
我开始在游戏中实现玩家和敌人的AI,但是对于如何在基于组件的游戏架构中最好地实现这一点感到困惑。 假设我有以下玩家角色,可以固定,奔跑和挥舞剑。玩家可以从静止状态和奔跑状态都转变为挥剑状态,但是随后必须完成挥杆,然后才能继续站立或奔跑。在挥杆过程中,玩家无法走动。 如我所见,我有两种实现方法: 创建一个包含所有播放器逻辑的AI组件(与实际组件分离或嵌入为Pla​​yerAIComponent)。我可以轻松地执行状态限制,而无需在组成播放器实体的各个组件之间创建耦合。但是,AI组件无法分解。例如,如果我有一个只能站立,四处走动或只能四处走动并偶尔挥舞剑的敌人,那么我必须创建新的AI组件。 将行为分解为各个组件,每个组件标识一个特定状态。然后,我得到一个StandComponent,WalkComponent和SwingComponent。为了执行过渡规则,我必须耦合每个组件。SwingComponent必须在挥杆期间禁用StandComponent和WalkComponent。当我有一个只会站着的敌人,偶尔会挥舞剑时,我必须确保SwingComponent仅在存在Walkwalk时将其禁用。尽管这允许更好的混合和匹配组件,但是当每次添加依赖项时,它都可能导致可维护性的噩梦,但必须更新现有组件以更好地满足依赖项对角色的新要求。 理想的情况是,设计人员可以通过将组件拖到容器中来构建新的敌人/玩家,而无需触摸任何一行引擎或脚本代码。尽管我不确定是否可以避免脚本编码,但我想使其尽可能简单。 总结一下:我应该将所有AI逻辑分解为一个组件,还是将每个逻辑状态分解为单独的组件,以更轻松地创建实体变量? 编辑:我怀疑我对第一种和第二种情况的含义有些困惑。我试图在下图中解释它。 注意各个状态与实体之间的关系。在第一种情况下,会在将AI组件放入实体之前对其进行预先构建。设计人员只能从程序员提供的一组独特的AIComponent中进行选择。第二种情况具有与其他组件相同级别的不同状态。设计人员现在可以创建具有唯一AI的实体,而无需程序员的干预。 问题是,这是在基于组件的实体中构建AI的仅有的两个选择吗?如果是的话,什么将提供最大的灵活性?

2
在2D游戏中实现相机/视口
将相机/视口实现到2D游戏的最实用方法是什么? 我读过,应该存储对象的世界位置而不是相对于屏幕的位置? 现在的情况: 我实现了一个简单的2D游戏,从XML文件加载对象和关卡。当前,级别XML文件如下所示: <map> <tile obj="ground" x="0" y="555" /> <tile obj="ground" x="16" y="555" /> <tile obj="ground" x="32" y="555" /> ... </map> 所有对象都有一个二维矢量“位置”,将其当前位置存储在屏幕上。 我想要的是: 图片中: 相机为800x600或640x480 块和精灵为16x16像素。 世界大小可能有所不同 坐标可能应该相对于世界而不是相对于屏幕进行标准化? 视口相对于播放器x,y的位置,并在播放器到达相机死区时移动(类似于此视频)。 我问的是伪示例/文章,但是如果您需要了解我在开发中使用的东西:SDL和C / C ++。
20 c++  2d  architecture  camera 

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.