Questions tagged «architecture»

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

3
为什么教程使用不同的方法进行OpenGL渲染?
http://www.sdltutorials.com/sdl-opengl-tutorial-basics http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/ 这两个教程使用完全不同的方法来获得几乎相同的结果。第一种使用类似的东西glBegin(GL_QUADS)。第二个使用vertexBufferObjects基于GLEW的着色器之类的东西。但是结果是一样的:您获得了基本形状。 为什么存在这些差异? 第一种方法似乎更容易理解。复杂的第二种方法的优点是什么?

7
在哪里可以找到良好(井井有条)的游戏代码示例?[关闭]
在哪里可以找到良好(井井有条)的游戏代码示例?我希望我能学到一些组织技巧。书中的大多数示例都太简短了,为简洁起见,省略了很多细节。我对如何对变量和方法进行分组特别感兴趣,以便其他程序员可以知道在代码中查找的位置。例如,顶部的初始化程序,然后是输入的方法,然后是更新视图的方法。 我不在乎特定的语言,只要它的OOP。我看过《雷神之锤2》和《雷神之锤3》的源代码,但它们都是C语言,对于获取有关组织对象的技巧没有太大帮助。 那么,您看到一些好的资料了吗?任何使您说“哇,井井有条”的代码指针都很棒。

9
硬编码内容为什么不好?
我知道大多数游戏都将对话文本存储在文件中,但是我也看到一些基于文本的游戏实际上将内容(地图,选择,可能的玩家命令,故事文本)编程到了游戏代码中。 我可以想到一些原因,但是什至是文字游戏也将所有内容都保留在程序外部的文件中的主要原因是什么? 实现细节之间的区别不大,包括以流行的XML格式保存内容,解析内容,然后根据从XML文件创建的变量渲染地图/显示文本,以及完全放弃XML文件。它们都以输出到屏幕的字符串结尾。区别不只是符号吗? 有些游戏甚至在代码中包含图形(ASCII艺术?)。我知道这是不对的,我可以猜测出它不好的一些原因,但也不知道为什么这是主要原因。 将大多数内容包含在程序外部非常受欢迎。甚至矮人要塞也不使用实际的ASCII字符,而是将ASCII字符的图像加载到内存中。 我主要问这个问题,因为创建,解析和使用XML文件有点像PITA。您知道...与仅使每个唯一的地牢(内容)成为自己的类的懒惰选择相比。

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()函数?还是在全球宣布?还是我完全想不到的其他解决方案? 当几个类需要访问相同的数据时,应在哪里声明数据?

8
我应该避免使用对象继承来开发游戏吗?
使用Unity开发游戏时,我更喜欢OOP功能。我通常创建一个基类(大多是抽象的),并使用对象继承将相同的功能共享给其他各种对象。 但是,我最近听到某人的消息,必须避免使用继承,而应该改用接口。所以我问为什么,他说:“对象继承当然很重要,但是如果有很多扩展对象,类之间的关系就深深地耦合了。 我使用的是一个抽象基类,像WeaponBase和创建如特定的武器类Shotgun,AssaultRifle,Machinegun类似的东西。有这么多优点,我真正喜欢的一种模式是多态。我可以将子类创建的对象当作基类一样对待,这样可以大大减少逻辑并使其更可重用。如果需要访问子类的字段或方法,则回退到子类。 我不想定义字段相同,在不同的类,常用的像AudioSource/ Rigidbody/ Animator和很多我这样定义成员字段的fireRate,damage,range,spread等等。同样在某些情况下,某些方法可能会被覆盖。因此,在这种情况下,我使用的是虚拟方法,因此基本上可以使用父类中的方法来调用该方法,但是如果子级中的逻辑不同,则可以手动覆盖它们。 因此,是否应将所有这些东西当作坏习惯丢弃?我应该改用接口吗?

7
模拟游戏世界中大量实体的绝佳方法
假设您有一个游戏,其中有许多实体(许多)服务于某些功能,但并非总是需要或需要在每个框架中都考虑所有这些功能。我正在研究的具体问题是存在一个包括器官在内的人体的详细模拟。 在游戏中,每个生物都有自己的身体,身体分成较小的部分(躯干,腿等),有时这些部分包含器官,这些器官在体内发挥特定的功能。器官的当前用途或作用是未知的。毕竟,动物可能肚子空了,因此不需要消化任何东西。当您在世界上拥有许多生物时,检查或模拟每个帧中的每个对象将是非常荒谬的,而且成本很高。因此,我正在考虑一种巧妙地区分需要更新的对象和不需要更新的对象的方法。 我想出的似乎是至少可以的解决方案。它创建了一个简单的队列/堆栈(本质上是每个元素在读取后即被删除;顺序无关紧要),称为“注意堆栈”,其中需要模拟的对象驻留在该堆栈中。需要注意的对象将简单地放在堆栈上或由其他对象放在那里。这些对象可能会实现带有Simulate()函数的简单接口。 应用于我之前的消化示例,这将意味着: 玩家从清单中选择要吃的东西(假设是面包),并将其放入角色的口中,然后将口放到注意堆栈中。在下一帧中,将嘴从堆栈中取出,并调用其Simulation()函数。由于是嘴巴,因此在这里模拟咀嚼是合理的。这可能会持续几帧,在此过程中,嘴巴会不断将自身放到烟囱上,直到它决定可以吞咽食物为止。在这种情况下,嘴巴将嚼过的面包放进胃中(我知道它不会直接进入胃中,但是为了简化起见,食管被省去了),然后也将其放到注意堆栈中。在下一帧中,开始消化过程的模拟。其余的必要器官等等。 可以预见的问题是空转对象。熟睡的动物就是一个很好的例子。可以通过将熟睡的动物放在堆栈上并每次检查是否需要唤醒来完成上述操作,但这似乎很浪费,因为这是唯一要做的事情。为了使闲置对象更有效率,我计划添加一种时间表,以存储要在特定时间执行的作业。如果动物入睡,它将按照该时间表进行工作,该时间表将在动物入睡后的一定时间内进行。然后,这项工作将负责将熟睡的动物再次放到注意堆栈中。现在,您可以说不在注意力集中的睡眠动物可能会因为没有模拟AI而错过被某物攻击的机会, 现在,老实说,由于缺乏经验,我不知道这是否可以完美解决该问题。我接近可用的东西了吗?通常这是如何完成的,或者有人有什么建议或更好的解决方案?

3
什么是标准C#/ Windows Forms游戏循环?
当用C#编写使用原始 Windows窗体和某些图形API包装器(如SlimDX或OpenTK)的游戏时,应如何构建主游戏循环? 规范的Windows窗体应用程序的入口点看起来像 public static void Main () { Application.Run(new MainForm()); } 同时可以做到一些什么是挂钩neccessary 的各个事件Form类,这些事件没有提供明显的地方放的码位进行不断定期更新游戏逻辑对象或开始和结束渲染帧。 这种游戏应该使用什么技术来实现类似于规范的游戏 while(!done) { update(); render(); } 游戏循环以及最小的性能和GC影响?

9
从头开始-如果我重新发明方向盘,这是一个错误吗?
通常,每当我想开始游戏时,我都会认为它具有良好的渲染基础架构和从头开始的更好的游戏循环。我通常不想使用现有的引擎。其背后的原因是我想自己实现它以学习知识。 但是许多博客和开发人员表示,重新发明轮子不是一个好选择。 我想念什么吗?

11
替代游戏状态系统?
据我所知,大多数游戏都有某种“游戏状态系统”,可以在不同的游戏状态之间进行切换。这些可能是“ Intro”,“ MainMenu”,“ CharacterSelect”,“ Loading”和“ Game”之类的东西。 一方面,将它们分成一个状态系统是完全有意义的。毕竟,它们是完全不同的,否则将需要包含在大的switch语句中,这显然很混乱。它们肯定由国家系统很好地代表。但是同时,我查看了“游戏”状态,想知道这种状态系统方法是否存在问题。因为就像房间里的大象。这是巨大且显而易见的,但没人质疑游戏状态系统的方法。 对我来说,“游戏”与“主菜单”处于同一级别似乎很愚蠢。但是,没有办法打破“游戏”状态。 游戏状态系统是最好的方法吗?是否有一些更好的技巧来管理“游戏状态”?有一个介绍电影的状态并听其进入的介绍状态,然后是在资源管理器上循环的加载状态,然后是实际上可以完成所有工作的游戏状态,这可以吗?这对您来说似乎也不平衡吗?我想念什么吗?

5
在基于组件的系统中上电
我才刚刚真正开始着手基于组件的设计。我不知道这样做的“正确”方法是什么。 这是场景。玩家可以装备盾牌。盾牌被绘制为气泡围绕玩家,它具有单独的碰撞形状,并减少了玩家从区域效果中受到的伤害。 在基于组件的游戏中如何设计这样的盾牌? 让我感到困惑的是,屏蔽罩显然具有三个与之关联的组件。 减少伤害/过滤 一个精灵 对撞机。 更糟的是,不同的防护罩变体可能具有更多的行为,所有这些行为都可能是以下因素: 提高玩家的最大健康度 健康再生 弹丸变形 等等 我在想这个吗?盾牌应该只是超级组件吗? 我真的认为这是错误的答案。因此,如果您认为这是要走的路,请解释一下。 盾牌应该是自己的实体来跟踪玩家的位置吗? 这可能使实施损害过滤变得困难。这也模糊了附加组件和实体之间的界线。 屏蔽是否应该是容纳其他组件的组件? 我从未见过或听到过这样的消息,但也许很常见,但我还不够深入。 盾牌应该只是添加到播放器中的一组组件吗? 可能还有一个额外的组件来管理其他组件,例如,这样它们就可以作为一个组全部删除。(偶然地留下减少伤害的部分,这很有趣)。 对于具有更多组件经验的人来说,还有其他明显的东西吗?


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

2
有没有办法以程序方式产生一个世界的历史?
我发现这里的图表代表了一个人在一个虚构的世界中1800年的文化历史,对此我颇有兴趣。 就世界设计而言,这种东西似乎在游戏开发中具有强大的应用。 看起来他是手工绘制的。我感兴趣的是查看是否有一种以编程方式创建这种图表的方法。 如果您负责从随机值生成上述样式的图表,您将如何处理?您是否会考虑任何特定的数据结构或算法?

3
如何在MMO游戏中处理大量拾音器
Minecraft之类的游戏或任何带有拾音器的MMO游戏如何处理它们? 假设您每次挖掘地形时都会产生3滴“污垢”。假设每个项目都有每帧计算的旋转动画。如果全世界的取件数量非常高,那么对于给定服务器中的客户端而言,这将是无用的大量帧开销,因为很可能其中许多取件项距离您仅光年。 所以我认为您只需要在接近本地玩家的拾音器上“做东西”,但这仍然意味着我必须检查每一帧是否有其他拾音器项目足够近以至于必须开始动画。 我的实际问题是:其他MMO如何解决此问题?

3
如何在RPG游戏中处理多个故事线索?
我设计了一款具有多个故事线索的RPG游戏,这意味着,根据用户的选择,某些事情可能会或可能不会发生,您可以通过多种方式实现同​​一件事,结局可能会有所不同等等。 我实现了一个简单的决策引擎,该引擎运行良好,但存在一个巨大缺陷,当您做出决定时,故事会立即受到您的决定的影响,这意味着您无法做出会在不久的将来影响您的决定。这是因为故事像树形结构中的分支一样展开,并且始终需要知道下一个节点。在幕后,决策是使用队列来实现的:每个节点都知道上一个节点和下一个节点(或者如果它是一个决策节点,它将等待用户输入以设置下一个节点) 我看到很多具有复杂决策引擎的游戏,但我想知道它们是如何制作的?是否有使事情变得真正简单的特殊设计?有没有人做过类似的事情,可以给我提示如何解决这个问题? 更新1: 一个重要方面是设法以某种方式保持故事代码独立,以便可以从外部文件操纵它。我计划将其用作引擎,因此即使可能的选择也必须来自外部文件。该代码必须是完全抽象的。 另外,我对设计解决方案感兴趣,这是一种很好的解决方案,其他人是如何做到或做到的。
26 architecture  rpg 

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.