Questions tagged «design-patterns»

设计模式是在软件设计中给定上下文中对常见问题的通用可重用解决方案。

8
为什么在游戏架构中不更多地使用MVC和TDD?[关闭]
首先,我不会看大量的游戏资源,也不会以游戏的方式构建游戏。 但是,由于试图在Web应用程序中采用“企业”编码实践,查看游戏源代码严重伤害了我的头脑:“这种视图逻辑与业务逻辑的关系是什么?这需要重构……重构,重构,重构也是如此吗? ” 这让我很担心,因为我将要开始一个游戏项目,而且我不确定尝试对mvc / tdd的开发过程是否会阻碍我们或为我们提供帮助,因为我看不到很多使用此功能的游戏示例或在社区中推动更好的建筑实践。 以下是一篇有关原型游戏的精彩文章的摘录,尽管对我而言,这似乎正是许多游戏开发人员在编写正式游戏代码时似乎使用的态度: 错误四:构建系统而不是游戏 ...如果您发现自己从事的工作无法直接推动自己前进,请就此停下来。作为程序员,我们倾向于尝试将代码泛化,使其变得优雅并能够处理各种情况。我们发现痒痒非常难,不会刮伤,但是我们需要学习如何做。我花了很多年才意识到,这与代码无关,而与最终发布的游戏有关。 不要编写精美的游戏组件系统,不要完全跳过编辑器,而将状态硬编码到代码中,避免数据驱动,自解析,XML疯狂,而只需编写该死的东西。 ...尽可能快地在屏幕上获取内容。 而且永远不要使用参数“如果我们花一些额外的时间并以正确的方式进行操作,我们可以在游戏中重用它”。永远 是因为游戏(大多)是面向视觉的,所以有意义的是代码将在视图中占很大的比重,因此将内容移到模型/控制器中所获得的任何好处都非常少,所以为什么要打扰? 我听到过这样的论点,即MVC引入了性能开销,但是在我看来这是过早的优化,在担心MVC开销(例如渲染管道,AI算法,数据结构)之前,还有更多重要的性能问题需要解决遍历等)。 关于TDD也是一样。我很少看到游戏使用测试用例,但这可能是由于上述设计问题(混合视图/业务)以及难以测试视觉组件或依赖概率结果的组件(例如,在物理模拟中运行)造成的。 )。 也许我只是看错了源代码,但是为什么我们看不到游戏设计中采用的更多“企业”实践呢?游戏的需求真的有如此大的不同吗?还是人/文化问题(例如,游戏开发者来自不同的背景,因此具有不同的编码习惯)?

9
在游戏开发中有用的编程设计模式有哪些?[关闭]
我有几本关于“设计模式”的书,并且阅读了一些文章,但是无法直观地指出哪种编程设计模式对游戏开发有用。 例如,我有一本名为《 ActionScript 3》(带有设计模式)的书,其中详细介绍了几种设计模式,例如“模型视图控制器”,“单例”,“工厂”,“命令”等。 作为对此不熟悉的人,我无法弄清楚其中哪一个有用,或者实际上,如果其中任何一个是我应该学习并尝试使用的设计模式。也许还有我什至不知道的其他针对游戏编程的设计模式? 如果您有在游戏开发中使用某种设计模式的经验,我很想听听。如果有理由说明使用它的原因,代码示例或在线资源也将非常有帮助。目前,我对ActionScript 3和C ++实现最感兴趣,但是一定可以从任何语言的经验和示例中受益。 谢谢!

5
如何避免GameManager神物?
我刚刚阅读了有关构建游戏代码的问题的答案。这让我想知道普遍存在的GameManager类,以及它在生产环境中如何经常成为问题。让我描述一下。 首先,有原型。没有人会在乎编写出色的代码,我们只是尝试运行一些东西,以查看游戏玩法是否合计。 然后是一个绿灯,为了清理事物,有人写了一个GameManager。可能真的要抱一堆GameStates,也许要存储一些GameObjects,没什么大不了的。可爱的小经理。 在预生产的和平领域中,游戏的状态很好。编码人员有适当的睡眠时间,并且有很多想法可以使用出色的设计模式来构建事物。 然后开始生产,很快就会有紧要关头。均衡饮食早已一去不复返了,错误跟踪器正在解决问题,人们感到压力很大,游戏必须在昨天发布。 在那个时候,通常,这GameManager是一个很大的混乱(保持礼貌)。 原因很简单。毕竟,编写游戏时,嗯......所有的源代码实际上是在这里管理的游戏。只需在中已添加了GameManager所有其他内容的位置添加此额外功能或错误修正,就很容易了。当时间成为问题时,就无法编写单独的类,也不能将此巨型管理器拆分为子管理器。 当然,这是一个经典的反模式:上帝对象。这是一件坏事,要合并的痛苦,要维持的痛苦,要理解的痛苦,要转变的痛苦。 您有什么建议可以防止这种情况发生? 编辑 我知道怪罪命名。当然,创建一个GameManager类并不是一个好主意。但同样的事情可以发生在一个干净的GameApplication或者GameStateMachine或GameSystem那最终被管道胶带喜爱的一个项目的结束。不管命名如何,您都可以在游戏代码中的某个位置找到该类,但现在它只是一个雏形:您还不知道它将变成什么样的怪物。所以我不期待“怪罪命名”的答案。我想要一种防止这种情况发生的方法,一种编码架构和/或一个团队可以遵循的流程,因为他们知道这将在生产中的某个时刻发生。放弃一个月的错误修正和最新功能真是太糟糕了,因为所有这些现在都在一个庞大的无法维护的经理中。

6
什么时候是考虑性能的最佳时间?
我来自软件开发背景。在软件开发周期中,我们通常专注于功能和工作产品。在开发结束时,我们开始优化代码并提高性能。 现在的问题是,我们是否需要考虑游戏开发中每行代码的性能? 这样做我觉得我们错过了设计模式和简洁的代码。我想知道游戏开发行业是否有最佳实践方法?

5
游戏中的演员应该负责吸引自己吗?
我对游戏开发非常陌生,但对编程却不是。 我(再次)使用JavaScript的canvas元素在玩Pong类型的游戏。 我创建了一个Paddle具有以下属性的对象... width height x y colour 我也有一个Pong具有诸如...的属性的对象 width height backgroundColour draw()。 该draw()方法当前正在重置canvas,这就是出现问题的地方。 如果Paddle对象具有draw()负责其绘制的方法,或者draw()该Pong对象的负责负责其演员的绘制(我认为这是正确的术语,如果我不正确,请更正我)。 我发现在Paddle实例化两个对象Player和时,绘制自身会很有利Enemy。如果在没有Pong的draw(),我需要两次写类似的代码。 最佳做法是什么? 谢谢。

9
在Unity中,如何正确实现单例模式?
我看过一些视频和教程,这些视频和教程主要用于Unity中创建单例对象GameManager,它们似乎使用了不同的方法来实例化和验证单例。 是否有一种正确的或更确切的首选方法? 我遇到的两个主要示例是: 第一 public class GameManager { private static GameManager _instance; public static GameManager Instance { get { if(_instance == null) { _instance = GameObject.FindObjectOfType<GameManager>(); } return _instance; } } void Awake() { DontDestroyOnLoad(gameObject); } } 第二 public class GameManager { private static GameManager _instance; public static GameManager Instance …


3
团队如何防止覆盖源文件中的工作?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Game Development Stack Exchange 的主题。 4年前关闭。 在我看来,有一种可能性,例如由多个人同时处理游戏引擎时,如何防止覆盖? 假设开发者一在工作,Audio.cpp而开发者二也在工作Audio.cpp,这在大型团队中通常如何进行管理以应对覆盖?(换句话说,要阻止开发人员2打开文件,直到开发人员1完成)
26 project-management  version-control  teamwork  java  2d  collision-detection  vector  collision-resolution  unity  directx  directx11  directx10  xna  ios  monogame  windows-phone-8  xamarin  design-patterns  oop  xna  collision-detection  collision-resolution  bounding-boxes  rotation  collision-detection  mathematics  javascript  algorithm  separating-axis-theorem  xna  2d  monogame  image  xna  directx  graphics  performance  opengl  2d  3d  c++  directx11  unity  c#  scale  c#  xna  collision-detection  collision-resolution  leaderboards  scoring  glsl  srgb  tilemap  three.js  tiled  unity  physics  xml  dialog-tree  xna  c#  .net  opengl  lwjgl  vbo  physics  graphics  procedural-generation  simulations  water  opengl  java  textures  lwjgl  frame-buffer  unity  unity  2d  collision-detection  collision-resolution  trigonometry  java  android  libgdx  xna  c#  frame-rate  c++  unreal-4  procedural-generation  java  graphics  lwjgl  slick  c++  software-engineering 

1
为什么我总是要考虑创建和使用对象池,而不是即时实例化新对象?
我已经多次(从最佳实践的角度)了解过这种模式: 内存分配:始终考虑创建和使用对象池,而不是即时实例化新对象。这将有助于减少内存碎片,并减少垃圾收集器的工作。 但是,我不知道这实际上意味着什么。我该如何实施? 例如,我可以实例化一个GameObject使用InstantiateUnity 的方法吗? Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity); 不鼓励这种用法吗?还有什么意思?

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这样写,如此反复,似乎又与整个组件设计思想相抵触。

2
如何在两个游戏状态之间进行插值?
创建在两个更新状态之间插值所有对象位置的系统的最佳模式是什么? 更新将始终以相同的频率运行,但是我希望能够以任何FPS渲染。因此,无论每秒帧数是低于还是高于更新频率,渲染都将尽可能平滑。 我想将1帧更新为从当前帧到将来帧的将来插值。这个答案有一个讨论此操作的链接: 半固定或全固定时间步长? 编辑:如何在插值中使用最近和当前速度?例如,仅使用线性插值,它将在位置之间以相同的速度移动。我需要一种方法来对两点之间的位置进行插值,但是要考虑到插值在每个点的速度。这对于诸如粒子效果之类的低速率模拟将很有帮助。

9
如何创建用户友好的魔术咒语系统?
我正在设计一个带有魔咒系统的小型2D自上而下的开放世界生存式游戏。到目前为止的工作方式: 玩家在游戏开始时收到“ wand” 当玩家遇到新物品和敌人时,他们会获得咒语来帮助他们使用这些物品/击败那些敌人 我遇到的问题是设计一种施放咒语的方法。刚开始,我只是将不同的咒语绑定到0-10键,但是很快咒语的数量就淹没了它,还存在一个问题:较低级别的咒语在后期游戏中没有使用,但仍然绑定到最有用的键上。 那么,制作用户友好的咒语广播系统的最佳方法是什么?如果需要,我可以检查魔术在游戏中的工作方式。 编辑:只是为了澄清,我正在为PC实时开发,其拼写类型和目的存在很大差异,尽管此问题应适用于所有平台。

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

2
如何根据对象是什么设计上下文菜单?
我正在寻找“右键单击选项”行为的解决方案。 基本上,当右键单击游戏时,游戏中的所有项目都可以根据对象的不同显示一组选项。 右键单击不同情况的示例: 库存:头盔显示选项(装备,用途,掉落,描述) 银行:头盔显示选项(Take 1,Take X,Take All,Description) 楼层:头盔显示选项(“乘车”,“在这里行走”,“描述”) 显然,每个选项都以某种方式指向执行所说内容的特定方法。这是我要解决的问题的一部分。对于单个项目有这么多的潜在选项,我如何以不至于太混乱的方式设计班级? 我曾考虑过继承,但是这可能会很漫长,而且链条可能很大。 我已经考虑过使用接口,但这可能会限制我一点,因为我无法从Xml文件加载项目数据并将其放入通用的“ Item”类中。 我将期望的最终结果基于一个名为Runescape的游戏。可以在游戏中右键单击每个对象,并根据其位置以及位置(存货,楼层,银行等)显示不同的选项集,供玩家进行交互。 我将如何实现这一目标?首先,我应该采用哪种方法,决定应该显示哪些选项,单击后如何调用相应的方法。 我正在使用C#和Unity3D,但是提供的任何示例都不必与它们中的任何一个相关,因为我追求的是与实际代码相反的模式。 非常感谢您的帮助,如果我在问题或期望的结果中不清楚,请发表评论,我会尽快解决。 到目前为止,这是我尝试过的: 实际上,我已经设法实现了一个通用的“ Item”类,其中包含了不同类型项目的所有值(额外攻击,额外防御,成本等)。这些变量由Xml文件中的数据填充。 我曾考虑过将每个可能的交互方法都放置在Item类中,但是我认为这是令人难以置信的混乱且糟糕的形式。我可能仅通过使用一个类而不将其子类化为不同的项目而采用了错误的方法来实现这种系统,但这是我可以从Xml加载数据并将其存储在类中的唯一方法。 我之所以选择从Xml文件中加载我的所有物品,是因为该游戏可以容纳40,000多个物品。如果我的数学正确,则每个项目的班级很多。


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.