在业余时间,我将游戏编程为业余爱好,不同类型的东西,目前并不复杂.像2D射击游戏,基于平铺的游戏,益智游戏等等...
然而,随着这些游戏的开发不断发展,我发现很难管理游戏中不同子系统的复杂性,如界面,世界观/模型,事件处理,状态(菜单,暂停等等),特别之处效果等.
我试图将连接保持在最低限度并减少耦合,但是这些系统中的许多系统需要以某种方式进行通信,而不需要一次将整个代码库保存在脑中.
目前我尝试将不同的子系统和子系统功能委托给聚合在一起的不同对象,但是我还没有找到足够解耦的通信策略.
我可以使用哪种技术来帮助我处理所有这些不同的子系统,并处理不断增加的系统的复杂性,该系统需要足够模块化以促进快速的需求变更?
我经常发现自己也在问同样的问题:
对象如何相互通信?
处理特定子系统的代码应该放在哪里?
我应该一次考虑多少代码库?
如何减少游戏实体之间的耦合?
Kylotan.. 9
啊,如果只有对你的问题有一个很好的答案.然后游戏开发不会那么困难,冒险和耗时.
我试图将连接保持在最低限度并减少耦合,但是这些系统中的许多系统需要以某种方式进行通信,而不需要一次将整个代码库保存在脑中.
他们这样做,但通常他们不需要像人们首先相信的那样直接说话.例如,每当有变化时,将游戏状态推送值放入其GUI中是很常见的.相反,如果您只是存储值并让GUI查询它们(可能通过观察者模式),则您已从游戏状态中删除了所有GUI引用.通常只需询问子系统是否可以从简单的界面提取所需的信息而不必将数据推入其中就足够了.
对象如何相互通信?
处理特定子系统的代码应该放在哪里?
我应该一次考虑多少代码库?
如何减少游戏实体之间的耦合?
这些都不是真正针对游戏的,但这是一个经常出现在游戏中的问题,因为有很多不同的子系统我们还没有开发标准的方法.如果您进行Web开发,那么实际上只有少数已建立的范例:像PHP这样的"每个URI的一个模板/代码文件",或者可能是RoR,Django的"模型/视图模板/控制器"方法,加上其他几个.但对于游戏来说,每个人都在自己动手.
但有一件事是清楚的:你不能通过询问"对象如何沟通"来解决问题.有许多不同类型的对象,它们需要不同的方法.不要试图找到一个适合游戏各个部分的全局解决方案 - 输入,网络,音频,物理,人工智能,渲染,序列化 - 它不会发生.如果您尝试通过尝试提供适合各种目的的完美IObject接口来编写任何应用程序,那么您将失败.首先解决个别问题,然后寻找共性,随心所欲地重构.您的代码必须首先可用,才能被认为是可重用的.
游戏子系统生活在他们需要的任何级别,不高.通常我有一个顶级应用程序,它拥有图形,声音,输入和游戏对象(以及其他).Game对象拥有Map或World,Players,非玩家,定义这些对象的东西等.
不同的游戏状态可能有点棘手,但它们实际上并不像人们认为的那样重要.暂停可以编码为布尔值,设置后,只需禁用AI /物理更新.菜单可以编码为简单的GUI叠加.因此,您的"菜单状态"仅仅会成为暂停游戏并显示菜单的情况,并在菜单关闭时取消暂停游戏 - 不需要明确的状态管理.
减少游戏实体之间的耦合是非常容易的,只要你没有对游戏实体是什么的无定形的想法导致一切都需要与所有东西交谈.游戏角色通常生活在地图或世界中,其本质上是空间数据库(以及其他内容),并且可以要求世界告知它附近的角色和对象,而不需要直接引用它们.
总的来说,您只需要为代码使用良好的软件开发规则.最重要的是保持接口小巧,简单,并专注于一个方面.松散的耦合以及专注于代码的较小区域的能力自然而然地从中流动.
啊,如果只有对你的问题有一个很好的答案.然后游戏开发不会那么困难,冒险和耗时.
我试图将连接保持在最低限度并减少耦合,但是这些系统中的许多系统需要以某种方式进行通信,而不需要一次将整个代码库保存在脑中.
他们这样做,但通常他们不需要像人们首先相信的那样直接说话.例如,每当有变化时,将游戏状态推送值放入其GUI中是很常见的.相反,如果您只是存储值并让GUI查询它们(可能通过观察者模式),则您已从游戏状态中删除了所有GUI引用.通常只需询问子系统是否可以从简单的界面提取所需的信息而不必将数据推入其中就足够了.
对象如何相互通信?
处理特定子系统的代码应该放在哪里?
我应该一次考虑多少代码库?
如何减少游戏实体之间的耦合?
这些都不是真正针对游戏的,但这是一个经常出现在游戏中的问题,因为有很多不同的子系统我们还没有开发标准的方法.如果您进行Web开发,那么实际上只有少数已建立的范例:像PHP这样的"每个URI的一个模板/代码文件",或者可能是RoR,Django的"模型/视图模板/控制器"方法,加上其他几个.但对于游戏来说,每个人都在自己动手.
但有一件事是清楚的:你不能通过询问"对象如何沟通"来解决问题.有许多不同类型的对象,它们需要不同的方法.不要试图找到一个适合游戏各个部分的全局解决方案 - 输入,网络,音频,物理,人工智能,渲染,序列化 - 它不会发生.如果您尝试通过尝试提供适合各种目的的完美IObject接口来编写任何应用程序,那么您将失败.首先解决个别问题,然后寻找共性,随心所欲地重构.您的代码必须首先可用,才能被认为是可重用的.
游戏子系统生活在他们需要的任何级别,不高.通常我有一个顶级应用程序,它拥有图形,声音,输入和游戏对象(以及其他).Game对象拥有Map或World,Players,非玩家,定义这些对象的东西等.
不同的游戏状态可能有点棘手,但它们实际上并不像人们认为的那样重要.暂停可以编码为布尔值,设置后,只需禁用AI /物理更新.菜单可以编码为简单的GUI叠加.因此,您的"菜单状态"仅仅会成为暂停游戏并显示菜单的情况,并在菜单关闭时取消暂停游戏 - 不需要明确的状态管理.
减少游戏实体之间的耦合是非常容易的,只要你没有对游戏实体是什么的无定形的想法导致一切都需要与所有东西交谈.游戏角色通常生活在地图或世界中,其本质上是空间数据库(以及其他内容),并且可以要求世界告知它附近的角色和对象,而不需要直接引用它们.
总的来说,您只需要为代码使用良好的软件开发规则.最重要的是保持接口小巧,简单,并专注于一个方面.松散的耦合以及专注于代码的较小区域的能力自然而然地从中流动.