为多人游戏开发API

我们如何轻松编写合理的定制多人游戏? 我一直在思考这个问题已有大约一年的时间,在这个世界里,如果我必须学习技巧,教侄子物理学或提出一个愚蠢的新主意,在晚宴后惹恼我的朋友,可以在几百行中为其编写游戏,只考虑新体验的独特之处,而将其余内容留给可靠的抽象。 每次都不必担心记分逻辑,计时逻辑或任何类型的自定义后端工作,这听起来很棒。

为了解决这个问题,我草拟了一个名为elm-gameroom的程序包,我非常幸运能在今年的Elm Europe上展出。 您无需观看视频即可理解本文的其余部分,但如果您打算以令人耳目一新的公开演讲的形式来传达一些背景信息,那么您绝对应该这么做🤓。

  • 定义猜测的数据结构-在这种情况下,它是所选答案的索引。 同样,提供那些编码器和解码器:
  • 定义产生问题的方法。 使用框架提供的帮助器:
  • 评估与问题相对应的猜测(最高评估赢得一轮):
  • 定义问题在屏幕上的外观,将任何用户输入映射到原始猜测(在这种情况下, onClick映射到从零到答案数减一的简单整数)。 context变量包括诸如回合状态(活动,冷却等),玩家的猜测(因此您可以包括反馈)和得分之类的内容。 您不必担心这一问题的开始,并且可以在其自己的模块Gameroom.Context看到它的记录。
  • 将所有内容混合在一起,形成一个称为spec的记录。 (Spec是elm-gameroom提供的类型,并为Problem和Guess采用类型变量):
  • 您的游戏现已准备就绪:

请注意,您不必提供initviewupdatesubscriptions ,并且ModelMsg是框架为注释提供的类型。 问题和猜测的特定数据结构随处可见,因为它们作为类型变量在框架代码库中的各处传递。

elm-gameroom会注意在此阶段,UI告知游戏开发者,多人路线(创建房间,与其他人一起玩)仍然有效,因为它们依赖于外部通信的正常运行。

现在已经完成了大部分的工作,并且我们看到了事情的表现,设置多人游戏只是另一步骤:

  • 定义一些使用JavaScript对象的端口:
  • 将这些端口提供给修改后的gameWith函数,使spec对象与以前相同:

elm-gameroom游戏室游戏需要与某些后端通信,并且由于我想保持该后端通用性,因此必须有一些端口。 为什么选择responsiblePorts ? 因为必须使用所选的后端正确设置与这些端口的通信,即使这几乎意味着要复制一些样板,也可能会出错。 一个更常规的名称是unsafePorts ,但我认为负责任听起来更信任和鼓舞人心。

如此多的自定义

我在上面通过gameWith以及第一个也是最重要的自定义选项responsiblePorts gameWith放弃了自定义API。 要退后一步,此定制策略现在遵循elm-community / webgl的Settings API,允许进行各种可选的定制,而不会膨胀spec对象,例如:

  • noPeripheralUi :在noPeripheralUi有一个外围接口,包括记分板,获胜者通知和计时器。 您可能会不喜欢它,因此可以完全禁用它,并自行构建外围UI。 它的所有数据都在Context中提供给您。
  • clearWinner :过去常常是猜测是正确的还是不正确的—实际上,规范中的evaluate函数曾经是isGuessCorrect 。 现在,将猜测值评估为浮动值,其中最高的值在每一轮中获胜。 为了保持过去的运作方式,您可以例如设置clearWinner 100设置,以告知应用程序只有达到最高评价100的玩家才能赢得任何给定回合。
  • roundDurationcooldownDurationunicodeIconnameinstructions etCetera :您能想象曾经有一次曾经被硬编码过吗?

您可以像这样混合搭配:

将这些设置放在列表中后,可以逐步进行自定义,同时为所有未触及的参数保留合理的默认值。 当然,您可以在屏幕上看到每个步骤的效果。

只是一步一步的猜谜游戏?

不再! 现在,在游戏回合进行期间,任何玩家都可以随意移动(当然,作为游戏作者,您可以取消这种自由,因为在很多游戏中这都是有意义的)。 我的一个好朋友向我介绍了西蒙·塔瑟姆(Simon Tatham)令人敬畏的拼图收藏 ,我很高兴地向您报告,其中大多数可移植到新的elm-gameroom 。 敬请关注在接下来的几周内(可能是几个月)在存储库中显示的更详细的示例。

是否应该有一种协作模式? 新的游戏回合可以在前一个状态的基础上进行构建,从而形成更多具有连贯性的故事吗? 是否有一个框架变得太通用而无法轻易使用的点,也许仍然不够通用,无法让我们去某个真正酷的地方? 这些仍然是我正在研究的问题。 我正在考虑在API中添加一个complexGame选项,该选项模仿原始游戏API,但将所有新参数公开给游戏规范中所需的功能。 看看它将鼓励什么样的新型游戏体验会很酷。

部署方式

我意识到,即使仍然难以部署,使游戏易于编写也无济于事。 我在上面! 我想要一个中央游戏站点,该站点将从GitHub存储库中提取源代码,并允许人们提交自己的游戏。 在Ellie上制作东西的声音更加简化,我将在秋天的某个时候进行探索。

为最后保存最好的东西:快速和Moebius!

在Elm Europe,我只展示了一个虚拟的原型,但我很高兴地宣布,这款毫不费力的细腻游戏现在已经可以正常使用了(在工作中,但也知道λ·functional·λ🤓)! 所以,赌上你最喜欢的车手 。