Questions tagged «design-patterns»

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

3
回合制游戏的设计,其中动作有副作用
我正在编写游戏Dominion的计算机版本。这是一种基于回合制的纸牌游戏,其中动作卡,宝物卡和胜利点卡累积在玩家的个人卡组中。我已经很好地开发了类结构,并且我开始设计游戏逻辑。我正在使用python,稍后可能会在pygame中添加一个简单的GUI。 玩家的回合顺序由一个非常简单的状态机控制。顺时针旋转通过,玩家无法在游戏结束之前退出游戏。单圈游戏也是一种状态机。通常,玩家经历“行动阶段”,“购买阶段”和“清理阶段”(按此顺序)。根据问题的答案,如何实现回合制游戏引擎?在这种情况下,状态机是一种标准技术。 我的问题是,在玩家的动作阶段,她可以使用对自己或其他一个或多个玩家有副作用的动作卡。例如,一张动作卡允许玩家在当前回合结束后立即进行第二回合。另一张动作牌会使所有其他玩家从其手上弃掉两张牌。在当前回合中,还有另一张动作卡不起作用,但允许玩家在下一回合中抽出额外的卡。为了使事情变得更加复杂,游戏中经常会有新的扩展添加新的牌。在我看来,将每个动作卡的结果硬编码到游戏的状态机中既丑陋又不适应。回合制策略循环的答案 并未详细介绍解决该问题的设计。 我应该使用哪种编程模型来包含一个事实,即转弯时的一般模式可以通过转弯内发生的动作来修改?游戏对象是否应该跟踪每张动作卡的效果?或者,如果卡应实现自己的效果(例如,通过实现接口),则需要什么设置才能赋予它们足够的功率?我已经想出了一些解决此问题的方法,但是我想知道是否存在解决该问题的标准方法。具体来说,我想知道哪个对象/类/什么负责跟踪每个玩家由于打出一张动作卡而必须执行的动作,以及与正常顺序中的临时更改有何关系转弯状态机。

2
如果“ ResourceManager”类被认为是不好的,那有什么替代方法?
我听到有相互矛盾的意见,例如: “专用的Manager类几乎永远不是正确的工程工具” “(目前)专用的Manager类是在拥有数千个资源的大型项目中生存的最佳方法” 让我们来看一个经典的ResourceManager类,它具有以下功能: 加载资产(纹理,音频,3D模型等) 通过保留缓存确保资产仅加载一次 引用计数资产以确定是否可以将其释放 隐藏实际资产的来源(例如,每个资产一个文件,或一个包文件中的所有资产,或者甚至可以通过网络加载资产) 可以在不重新启动程序的情况下重新加载资产,这对于从事游戏的美术师来说非常有用。 假装这些ResourceManager对象不是单例,而是通过依赖项注入传递它们,让我们从表中删除“ singletons is bad”参数。 然后是“使用工厂”或“称其为工厂”参数。我的问题是,是的,它是一个工厂,但它也是一个缓存和一个重装器(因为缺少更好的词)。称其为工厂并不能正确地描述它,如果我将其设置为合适的工厂,那么在哪里实现缓存和重新加载呢? 我同意“经理”类通常是不良体系结构的征兆,但是在这种特殊情况下,如何对其进行重组并仍然保留所有功能?这是“经理”类实际上合适的情况吗?

3
游戏中类似MVC的分区?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我当时正在考虑游戏的设计(特别是将棋盘游戏转换为计算机,我认为在这种情况下是相关的),我想到将“游戏”与“显示器”分开构建可能是有意义的。 这将使我能够通过简单的文本界面快速原型化某些东西,然后稍后对其进行完善。这也使我可以更轻松地将游戏移植到其他媒体上。 这种分隔在游戏中是否常见?我是否应该尝试进一步分解?我可能会错过一些并发症吗?

6
开发新游戏时要考虑的最大陷阱是什么?
实际上,我几周前才刚刚开始追踪(感谢David Young的术语更正)几个针对Facebook的新的基于Web的游戏,而我刚好被大量的思维障碍和重新编码所浪费的时间淹没了。我正在研究类似基于回合(吸血鬼战争)风格的RPG。我具有编写游戏代码的技能,但我一直在努力尝试正确设计模式并使产品与我所见一致。 通常,在构建网站时,我喜欢“思考代码”,而我发现更改代码/ HTML进行调整的速度更快。这可能是因为我对自己的工作非常满意并且知道会发生什么因为我一遍又一遍地做。在游戏开发的这一点上,我发现自己又重新开始了(就像我以前在网站上一样),我想知道这是否只是我缺乏对游戏逻辑的专注和直觉,还是这是一种在我的脑海中发扬光大的合适方法?编码提前。 对于如何正确解决此问题并使自己保持工作状态的一些建议,我将不胜感激。我很快就从标准的商务网站上了解到一个游戏引擎有多么不同!每次我准备好一些东西时,都会感到糊涂和不完整,并且变得令人沮丧。 扩展的 例如,最近给我带来很多问题的战斗引擎采用简单的攻击技能,然后在-50%到+ 50%之间随机滚动,然后将原始攻击技能乘以该百分比。防御也要做同样的事情,然后我将其划分,以确定是否对敌人的健康造成了损害。我想当我开始问自己这是否是正确的方法,或者是否存在“正确”的方法时,我应该意识到自己会陷入困境。我发现的一个主要缺点是,两个角色在同一级别附近可以具有多个“掷骰”,攻击率为-50%,防御率为+ 50%,所以我最终遇到了一些漫长的战斗序列,没人做任何事情。失败 也许我的帖子应该一直要求提供描述简单游戏逻辑的建议链接。 末端延伸 谢谢大家!

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 ... 但这很快就会失去控制。设计这样的系统的更好方法是什么?

1
设计一个ResourceManager类
我已经决定要为我的爱好游戏引擎编写一个中央ResourceManager / ResourceCache类,但是在设计缓存方案时遇到了麻烦。 这个想法是ResourceManager对所有游戏资源组合使用的总内存有一个软目标。其他类将创建处于卸载状态的资源对象,并将它们传递给ResourceManager。然后,ResourceManager决定何时加载/卸载给定的资源,同时牢记软限制。 当另一个类需要资源时,会将请求发送到ResourceManager(使用字符串ID或唯一标识符)。如果加载了资源,则对该资源的只读引用将传递到调用函数(包装在引用的计数的weak_ptr中)。如果未加载资源,则管理器将在下一次机会(通常在绘制框架结束时)标记要加载的对象。 请注意,尽管我的系统确实做了一些引用计数,但它仅在读取资源时才进行计数(因此,引用计数可能为0,但实体可能仍在跟踪其uid)。 还可以在首次使用之前就标记好要加载的资源。这是我正在使用的类的略图: typedef unsigned int ResourceId; // Resource is an abstract data type. class Resource { Resource(); virtual ~Resource(); virtual bool load() = 0; virtual bool unload() = 0; virtual size_t getSize() = 0; // Used in determining how much memory is // being used. …

6
如何在C ++引擎编程中正确使用单例?
我知道单例很糟糕,我的旧游戏引擎使用了单例“ Game”对象,该对象处理从保存所有数据到实际游戏循环的所有事情。现在我要制作一个新的。 问题是,要在SFML中绘制某些内容,请window.draw(sprite)在window是的地方使用sf::RenderWindow。我在这里看到2个选项: 制作一个单例游戏对象,游戏中的每个实体都将检索该对象(我以前使用过的对象) 使它成为实体的构造函数:(Entity(x, y, window, view, ...etc)这只是荒谬而烦人的) 在将实体的构造函数保持为x和y的同时,执行此操作的正确方法是什么? 我可以尝试跟踪我在主游戏循环中所做的所有事情,只是在游戏循环中手动绘制其精灵,但这似乎也很麻烦,我也希望对实体的整个绘制功能具有绝对的完全控制权。

2
游戏开发是否具有自己的建模类型?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 在一般的计算机科学有造型“语言”(读:标准化的图表技术),如UML 1,2,在数据库中也有类似的事情ERD 3,在业务还有其他类型,如BPMN 4,5。有没有类似游戏设计的东西?

5
代码对象通用名字典
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我正在寻找专用于游戏的通用术语词典(就像设计模式具有事物交互的通用语言一样)。 例如,如果我正在制作具有高度复杂性的乒乓游戏,我想相应地命名。 我见过一些用户可以与之交互的视觉对象,称为小部件,一些非交互的对象,称为doodad(无论如何,我还是在与星际争霸的地图编辑器一起玩的时候回来的)。帧频时钟有合适的名称吗?游戏时钟是否有适当的名称(该时钟与世界上物体的运动有关,而与视觉图形无关)? 我只想要一本字典,这样我就能说相同的语言,而不用随便写东西。我担心我要创建名为doodads,whosits,whatsists和flim-flams的东西,而我不想这样做。

2
设计基于组件的游戏
我正在写一个射击游戏(例如1942年,经典的2D图形),我想使用基于组件的方法。到目前为止,我考虑了以下设计: 每个游戏元素(飞艇,弹丸,加电,敌人)都是一个实体 每个实体都是一组可以在运行时添加或删除的组件。例如位置,雪碧,健康,IA,损坏,边界框等。 这个想法是飞艇,弹丸,敌人,威能不是游戏类。实体仅由其拥有的组件定义(并且可以随时间变化)。因此,玩家飞艇从Sprite,Position,Health和Input组件开始。上电有Sprite,Position,BoundingBox。等等。 主循环管理游戏“物理”,即组件之间如何交互: foreach(entity (let it be entity1) with a Damage component) foreach(entity (let it be entity2) with a Health component) if(the entity1.BoundingBox collides with entity2.BoundingBox) { entity2.Health.decrease(entity1.Damage.amount()); } foreach(entity with a IA component) entity.IA.update(); foreach(entity with a Sprite component) draw(entity.Sprite.surface()); ... 组件在主C ++应用程序中进行了硬编码。实体可以在XML文件中定义(lua或python文件中的IA部分)。 主循环对实体并不太在意:它仅管理组件。该软件设计应允许: 给定一个组件,获取它所属的实体 给定一个实体,获取类型为“ type”的组件 …

3
通过版本控制,将游戏引擎与类似游戏中的游戏代码分开
我有一个完成的游戏,想要在其他版本中拒绝。这些游戏将是类似的游戏,或多或少具有相同的设计,但并非总是如此,基本上情况可能会发生变化,有时会有所变化,有时会有所变化。 我希望将核心代码与游戏分开进行版本控制,以便如果说我修复了游戏A中发现的错误,则该修复将出现在游戏B中。 我正在尝试找到最好的方法来管理它。我最初的想法是这样的: 创建一个engine模块/文件夹/所有内容,其中包含可以概括的所有内容,并且与游戏的其余部分100%独立。这将包括一些代码,但也包括游戏之间共享的通用资产。 将此引擎放在自己的git存储库中,该存储库将作为一个git submodule 我苦苦挣扎的部分是如何管理其余代码。假设您有自己的菜单场景,此代码是特定于游戏的,但大多数代码也往往是通用的,可以在其他游戏中重用。我不能将其放在中engine,但是为每个游戏重新编码都效率很低。 也许使用某种git分支变量可以有效地解决这一问题,但我不认为这是最好的方法。 任何人都有一些想法,经验要分享或与此有关的任何事情?

6
游戏组件,游戏管理器和对象属性
我正在努力使基于组件的实体设计成为现实。 我的第一步是创建可以添加到对象中的各种组件。对于每种组件类型,我都有一个管理器,该管理器将调用每个组件的更新功能,并根据需要传入诸如键盘状态之类的信息。 我要做的下一件事是删除对象,并让每个组件都带有一个ID。因此,对象是由具有相同ID的组件定义的。 现在,我在想我不需要所有组件的管理器,例如,我有一个SizeComponent,它只是一个Size属性)。结果,SizeComponent它没有更新方法,并且管理器的更新方法不执行任何操作。 我的第一个想法是要有一个ObjectProperty组件可以查询的类,而不是将它们作为组件的属性。因此,一个对象有许多ObjectProperty和ObjectComponent。组件将具有查询对象属性的更新逻辑。管理者将管理调用组件的更新方法。 在我看来,这似乎是工程过度,但我认为我无法摆脱这些组件,因为我需要让管理人员知道哪些对象需要哪种组件逻辑才能运行(否则,我只会删除该组件)并将其更新逻辑推入管理器)。 难道这(有ObjectProperty,ObjectComponent和ComponentManager班)在工程? 有什么好的选择?

4
套接字服务器和游戏服务器是否应该是独立的进程?
假设一个简单的标准客户端/服务器游戏。对于服务器,是否值得拥有一个单独的进程来侦听客户端的连接和消息,并通过本地套接字或stdin将数据发送到运行实际游戏服务器的另一个进程? 另一种选择是使这两项都在一个过程中完成。对传入的消息进行排队并以正确的顺序执行它们,这不会造成停顿问题。 我想知道将两个“活动”分开的额外资源是否真的值得。我应该如何决定?我想听听任何利弊。

3
如何在视频游戏中表示弹丸?
我正在做一个简单的固定射击游戏,类似于“ Galaga”,),这是我正在做的演示的一部分。我想知道人们会使用什么策略和数据结构来跟踪弹丸,例如从飞船发射的激光。我以前使用的一种超级简单的实现方式是将每个弹丸表示为一个点,并检查是否与场景中的所有对象发生碰撞。 但是,在有许多弹丸的大型场景中,这似乎很昂贵。我想知道这种用例还使用了哪些其他类型的策略或实现。FPS之类的游戏用于跟踪弹丸(子弹,坦克炮弹等)有什么作用?

3
如何避免事件计划程序的单例模式?
我想为我的游戏制作一个事件调度程序,我基本上希望能够安排一个游戏事件的触发时间。这可以是一次触发,也可以是周期性触发(触发事件“ E_BIG_EXPLOSION”每5秒钟触发一次...)。 诱人的是,这可能是使用Singleton的好地方,但是Singleton可能非常邪恶,它们容易像疾病一样传播……所以我不惜一切代价避免使用它们。 在这种情况下,您建议采用哪种设计避免单例使用?

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.