Questions tagged «architecture»

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

12
如何确保一段代码只运行一次?
我有一些代码只想运行一次,即使触发该代码的情况可能会多次发生。 例如,当用户单击鼠标时,我要单击事物: void Update() { if(mousebuttonpressed) { ClickTheThing(); // I only want this to happen on the first click, // then never again. } } 但是,使用此代码,每当我单击鼠标时,事物都会被单击。我怎样才能使它发生一次?

2
如何在Unity的检查器中编辑键值对(例如字典)?
我有一个正在创建的咒语系统,原理如下: 每个咒语都是一个自主的预制件。它包含具有某些属性(基本损坏,持续时间...)的脚本,可以在检查器中对其进行修改。 我有一个Spell枚举,列出了代码中所有可能的咒语,用于游戏逻辑 当我想施放法术时,我需要能够获得该法术的预制件以实例化它并读取其信息。 每个演员(无论是玩家还是敌人)都需要列出该咒语的可能动画 我尝试实现的问题是: 为了列出每个演员的动画,我可以使用Dictionary<Spell, Animation>,但是检查器不支持字典,这使得很难轻松地编辑多个演员类型。 我需要一些方法来轻松地从相应的枚举中访问拼写预制件。在这里我也可以使用字典,但是我只能在检查器中引用预制件,而不能在代码中引用,这意味着我将无法填充此字典 我正在寻找一种将我的咒语枚举轻松关联到相应的预制件和动画的方法

4
为什么MMORPG仍然使用多台服务器?
MMORPG,一些英雄联盟甚至是《星际争霸2》之类的MOBA通常会迫使您选择服务器。通常,它们是美国,欧盟和东南亚国家/地区(MMORPG),每个地点都有很多。我可以看到几年前这是必须的,但是现在随着AWS和类似产品的问世,它们使您可以无缝地扩展“服务器能力”,为什么还需要单独的服务器? 我的思路是这样的(以《星球大战:旧共和国》为例):-您始终处在一个星球上,与其他星球是孤立的“实例”。-如果一个星球上的人数过多,SW:TOR会创建一个新的世界实例,并将玩家放置在那里。-如果您离开世界/切换实例,则会显示一个加载屏幕 那么,为什么游戏不能为这个星球创建一个实例。这个执行个体(只有这个执行个体)在您的资料库中拥有您目前的资料,并管理x个播放器。x-50播放器进入该实例后,将启动一台新服务器,并在该实例上生成新的人员。保留50个位置以切换到您的组等。 在所有三个主要区域都可能有一个实例来将等待时间保持在较低的水平,但是如果您可以忍受140ms的延迟,那它将允许您仍然与SEA等其他玩家一起玩(这仍然没什么大不了的)。 无论何时切换实例或前往另一个世界,当前服务器都会将所有数据提供给下一台服务器,从而确保您不需要一个大型的集中式数据库。您仍然可以定期获取更新以进行分析。 当您注销或服务器失去连接时,然后可以将数据传输到针对存储数据进行了优化的海量数据库中。然后可以优化实例服务器以实现高吞吐量。 是否有任何特定原因无法解决?我还有其他问题吗?
18 architecture  mmo 

7
我需要一个Point和一个Vector对象吗?还是仅使用Vector对象表示一个点就可以了?
在构造与朋友一起开发的引擎组件时(出于学习目的),我对此产生了疑问。 最初,我们有一个Point构造函数,如下所示: var Point = function( x, y ) { this.x = x; this.y = y; }; 但是他们开始向其中添加一些Vector数学,他们决定将其重命名为Vector2d。 但是现在,有些方法(至少在我看来)有点令人困惑,例如下面的方法,这些方法用来做一行: //before the renaming of Point to Vector2, the parameters were startingPoint and endingPoint Geometry.Line = function( startingVector, endingVector ) { //... }; 我应该为Point对象创建特定的构造函数,还是将点定义为向量没有问题? 我知道矢量具有大小和方向,但是我看到很多人使用矢量来表示对象的位置。

6
Vector3应该继承Vector2吗?
我创建了几个类别Vector2(X&Y)和Vector3(X,Y,Z),但我不知道是否进行Vector3继承Vector2,还是重新实现成员变量m_x和m_y一次?双方的优缺点是什么(继承与重新定义)。 编辑:我正在使用C ++(VS2010)。
18 c++  architecture 

3
MVC(模型-视图-控制器)游戏引擎体系结构-是或否?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我正在阅读一本很棒的书《Game Coding Complete》,该书强烈建议使用MVC(模型-视图-控制器)方法,并具有三个关键层: 游戏应用层 游戏逻辑 游戏画面 在我看来,这种方法似乎对移动计算机游戏来说是一个过大的杀伤力。 请问您对此有何看法?即使增加了模块之间所需的额外通信,实现这种体系结构是否值得?此设计是否会消耗大量CPU能量,以致最终结果会比未实现时慢得多?

4
我该如何避免在整个代码中出现一次性标记和检查?
考虑一个纸牌游戏,例如《炉石传说》。 有成百上千种卡片可以做各种各样的事情,其中​​有些甚至对于一张卡片来说都是独一无二的!例如,有一张牌(称为Nozdormu)可将玩家回合减少到仅15秒! 当您具有如此广泛的潜在影响时,如何在整个代码中避免幻数和一次性检查?如何避免PlayerTurnTime类中的“ Check_Nozdormu_In_Play”方法?以及如何组织代码,使得当您添加更多效果时,您无需重构核心系统即可支持以前从未支持过的东西?

5
游戏对象应该如何相互了解?
我发现很难找到一种组织游戏对象的方法,以使它们是多态的,但同时又不是多态的。 这是一个示例:假设我们希望所有对象都到update()和draw()。为此,我们需要定义一个GameObject具有这两个虚拟纯方法的基类,并让多态性起作用: class World { private: std::vector<GameObject*> objects; public: // ... update() { for (auto& o : objects) o->update(); for (auto& o : objects) o->draw(window); } }; 应该使用update方法来处理特定类对象需要更新的任何状态。事实是每个对象都需要了解周围的世界。例如: 地雷需要知道是否有人与它发生碰撞 士兵应知道另一支队伍的士兵是否在附近 僵尸应该知道半径内最近的大脑在哪里 对于被动交互(如第一个交互),我认为碰撞检测可以使用来将在特定情况下发生碰撞的操作委托给对象本身on_collide(GameObject*)。 其他大多数信息(如其他两个示例)都可以通过传递给该update方法的游戏世界来查询。现在,世界不再根据对象的类型来区分对象(它将所有对象存储在一个多态容器中),因此理想world.entities_in(center, radius)情况下返回的是的容器GameObject*。但是,当然,该士兵不希望攻击其团队中的其他士兵,而僵尸也不会处理其他僵尸。因此,我们需要区分行为。解决方案可能是以下几种: void TeamASoldier::update(const World& world) { auto list = world.entities_in(position, eye_sight); for (const auto& e : list) …
18 c++  architecture 

3
如何在实体系统中编码UI / HUD?
我想我已经得到了亚当·马丁(t-machine)启发的实体系统的想法。我想开始在下一个项目中使用它。 我已经知道实体,组件和系统的基本知识。我的问题是如何处理UI / HUD。例如,任务窗口,技能窗口,角色信息窗口等。您如何处理UI事件(例如,按下按钮)?这些是不需要每帧都进行处理的东西。目前,我正在使用MVC编写UI,但我认为这与实体系统不兼容。 我读过,实体系统嵌入在更大的OOP中。我不知道UI是否在ES之外。我该如何处理?

1
如何为级别中定义的对象实现持久状态?
我正在开发2D Metroidvania,它由一系列相互关联的关卡组成,可以重新访问。 每个级别都由Tiled TMX文件表示,在该文件中,我指定了生成不同sprite类的各种对象的位置(例如,敌人,拾取器,控制杆等)。开始新游戏,加载已保存的游戏或更改级别时,我的游戏循环遍历相应的TMX文件并生成该级别中的所有对象。 我通过以下方式处理级别更改:如果Player对象与对象相交Portal,change_map()则调用一种方法,该方法加载新地图(与相交的门户相关联的地图)并将玩家定位在新地图上的适当位置。 我的某些对象具有一些状态,希望通过更改级别以及保存和退出游戏来保持这些状态。例如,如果玩家解锁门,并且门的状态属性设置为“打开”,则我希望玩家返回时将门打开。我想要类似的东西,可以将其设置为左或右,以及其他各种对象。此外,玩家有时会收集一些我不想在玩家重新访问该区域时重生的物品。 因此,我的问题是如何处理这种持久性? 我正在使用Python,尽管我认为您可以从中抽象出来。

4
如何设计可以组合的多种不同攻击类型?
我正在制作一个自上而下的2D游戏,并且我想拥有很多不同的攻击类型。我想使攻击变得非常灵活和可组合,就像以撒的绑定的工作方式一样。这是游戏中所有收藏品的清单。为了找到一个好的例子,让我们看一下Spoon Bender项目。 汤匙弯机使艾萨克能够射出归巢的眼泪。 如果您查看“协同作用”部分,就会发现它可以与其他收藏品结合使用,从而产生有趣而直观的效果。例如,如果将其与“内眼 ” 结合使用,则“将使Isaac能够一次发射多幅归巢镜头”。这是有道理的,因为内眼 使艾萨克三杆 设计这样的东西的好架构是什么?这是一个蛮力解决方案: if not spoon bender and not the inner eye then ... if spoon bender and not the inner eye then ... if not spoon bender and the inner eye then ... if spoon bender and the inner eye then ... 但这很快就会失去控制。设计这样的系统的更好方法是什么?

6
您实际上使用图表来建模游戏吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我的意思主要是UML,但是任何可行的方法都是可行的。那么-您实际上是使用UML /其他图表或其他方法为游戏建模吗?我在大学时曾学习过有关使用UML进行建模的课程,这似乎比实际收益要付出更多的努力,但是我意识到这可能只是因为我从未创建过一个庞大的复杂IT系统。那么值得吗?通常哪种图/方法通常*是最好的? *当然,很多时候需要选择具体工具来解决具体问题,但也许有一些模式。 编辑:我忘记了一件重要的事情- 在实现东西之前还是之后创建图表?我的意思是-当一个人设计和实现某些东西时,通常会改变主意,或者出现意想不到的事情,而又不得不进行更改,有时甚至是重大更改,而在已经很复杂的图中进行更改似乎与在代码本身中一样无望。

4
一个人如何拯救一个程序世界?
我最近读过关于如何创建程序世界的信息,但是如何保存一个程序世界? 在Terraria或Minecraft之类的游戏中,用户可以自由修改地形,但不能从初始种子重新创建该世界。使用什么技术来保存程序化但可修改的世界?

4
游戏引擎:在架构上实现脚本支持的一种不错的方式?
我正在开发一个简单的游戏引擎(如果重要的话,请使用C#),但我想不出足够好的体面的方法来实现架构方面的脚本。 这是一种简单的基于回合的策略,带有用于战斗的自定义,独立于逻辑的动画。它具有用于系统/低级内容的全局体系结构层,最重要的是,两个主要模块-逻辑和游戏视图物-使用事件管理器进行通信。 事实是,我真的很想让脚本同时影响与游戏逻辑相关的内容(更改单位参数等)和与游戏视图相关的内容,例如用于战斗的特殊动画/对话可能取决于某些脚本触发器。 (说实话,理想情况下,我希望脚本控制游戏流程,只将核心机制/图形留给逻辑/视图,但是我对此并不陌生,所以我不确定现在是否可以这样做) 我一直在想三个选择: 只是让脚本保留在逻辑中,但让它了解游戏的图形方面。但这会使逻辑/视图划分非常模糊,不是吗? 将脚本编写为一个单独的模块,该模块将使用同一事件管理器与其他模块交换事件。但是,我想这需要非常小心事件同步,并且还要向管理器中添加大量事件类型。(仍然,个人最爱) 首先将脚本编写为模块,这样它就可以直接影响/调用逻辑/视图的功能。这允许固有地更广泛的功能,但要以某种方式破坏整个事件交换方案的代价,并且担心脚本即使在实际上不应该破坏的情况下也可能破坏东西。 因此,我既无法决定其中之一,也无法想出插入脚本模块的更好方法...有任何建议或有用的链接吗? 谢谢! ps感谢您移植问题,不知道有专门针对gamedev的部分

1
如何在面向对象的编程中应用面向数据的设计?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我已经阅读了很多有关面向数据的设计(DOD)的文章,并且我理解它,但是我不能在设计时就牢记DOD的面向对象的编程(OOP)系统,我认为我对OOP的教育正在阻碍我。我应该如何融合两者?目的是在幕后使用DOD时拥有一个良好的OOP界面。 我也看到了这一点,但并没有太大帮助:https : //stackoverflow.com/questions/3872354/how-to-apply-dop-and-keep-a-nice-user-interface
17 c++  architecture 

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.