我们如何通过遥控器制作棋盘游戏-第2部分

上次我告诉您有关“智能”棋盘游戏的技术组成,遇到的问题以及最终发生的情况。

图片

今天,我想更详细地讨论移动应用程序,第一个游戏以及如何为其创建缩略图。

第一篇文章可以在这里找到: 我们如何通过遥控器制作棋盘游戏-第1部分

注意! 上有很多照片。

在上一篇文章的评论中,他们正确地指出,最好不要制作游戏,而最好是一个平台,在此平台上您已经可以使用可用的机制来制作游戏。 最初,我们计划了它,但是结果,我们意识到我们除了游戏之外无法做其他事情。 仅仅由于缺乏游戏设计经验或熟悉的游戏设计师,他们可以告诉我们应该支持哪些机制。

因此,我们决定在第一个游戏中实现平台的所有基本功能(移动,动态突出显示,提示),我们自己将提出这些功能。 然后,利用获得的经验,我们将成为一个成熟的游戏构建者。

行动应用程式


如我先前所写,所有平台管理都是通过通过BLE协议与其连接的移动应用程序执行的。

几个GIF
GIF“” /

GIF

GIF

GIF“” /

实际上,为了实现任何游戏,您都需要为其编写一个完善的移动应用程序,在其中描述所有规则和机制。

在编写应用程序的过程中,我们通过连接到平台进行了所有测试,这不是很方便。 因此,为了简化调试,我们在应用程序框架内制作了一个简单的软件模拟器,在该模拟器上,数据的显示方式与在运动场上显示的方式相同。


在开始时,我们遇到了一个问题,即离开应用程序的数据会丢失。 我们发现使用BLE时,可以发送的最大数据包大小为20个字节。 因此,我们将BLE上的所有传出数据划分为20个字节的数据包,“ Gate”参数写入标头。 此参数可帮助Arduino了解此软件包属于平台的哪个组件。 从Arduino方面,这些包的处理是基本的:

if (NewCommandReady) { switch (CurrentGate) { case 1: processLEDCommand(); break; case 2: processDriverCommand(); break; case 3: processMagnetCommand(); case 4: // break; } //  NewCommandReady = false; } 

在我们将智能手机和BLE模块之间的数据流分解为20字节的数据包之后,数据停止消失,但通常以失真的形式进入Arduino。 事实证明,我们没有考虑到Arduino串行端口具有64字节的缓冲区。 当缓冲区溢出时,数据会丢失,随后的数据也会失真。 增加大小并创建自己的缓冲区并不总是有帮助。 我必须在BLE传输之上编写包装协议,以可靠地发送和接收数据。

由于使用了这种“协议”,因此通过检查传输数据的完整性会稍微减慢数据交换的速度,但是可靠性对于游戏来说更为关键-如果在确认移动电话上的举动时AOE某些能力的显示不完整或英雄没有动弹,那将是可耻的。

为了在运动场上显示对象,我们使用了OS窗口子系统中的图层原理:

  • 突出显示的每个对象或动作(英雄,障碍物,英雄移动的方式,能力的可用范围以及其他)都使用其自己的图层。
  • 当应用层时(例如,在能力的可用范围内的AOE区域),LED的初始状态会被记住。 结果,当顶层消失时,可以返回原始颜色。

在移动应用程序和平台之间传输的大部分数据是重新粉刷LED。 为了优化目的,添加了一些算法:

  • 对于重涂二极管,使用了一个缓冲区,在缓冲区中进行更改,直到应将这些更改显示在物理板上为止。
  • 排除了在同一命令中重绘单个LED的情况。
  • 重涂时(例如,将AOE能力的区域移动1个单元),将分析LED板的当前状态。 如果处于新状态的LED的颜色与先前的状态相同,那么Arduino将不会接收任何命令来重新粉刷它。

游戏玩法


所以,你决定玩。 下面我将从侧面描述它的外观:

  1. 我们将插头插入插座,然后打开游戏。
  2. 在每次启动时,都会进行自动校准,以确定步进电机移动1个单元的准确步数。
  3. 同时,我们使用蓝牙将智能手机连接到游戏。
  4. 在移动应用程序中,每个玩家都选择他想玩的角色。 每个人都做出选择后,按“开始”。

  5. 每个字符都有其自己的颜色。 游戏将自动突出显示您需要放置英雄人物的单元格。
  6. 游戏按顺序进行。 第一步是由首先选择英雄的玩家做出的,第二步-第二步,依此类推。
  7. 每个英雄都有一定数量的动作点(OD),可用于在竞技场上移动或应用能力。
  8. 每个能力都有其自己的恢复时间,该时间以轮数计算。 在移动应用程序的框架内,有两个概念:移动-从玩家当前动作的开始到结束的间隔。 回合-参与游戏的所有玩家的移动总和。 目前,一个玩家的回合限制为30秒。
  9. 障碍物放置在玩家无法通过或使用大多数能力的区域上。 现在,它们只是在运动场上以红色突出显示,但将来它们将具有物理体现。

  10. 您可以借助每个英雄所拥有的特殊能力来移动战场。 例如,魔术师的隐形传送。 与标准动作不同,当玩家逐格铺路英雄的路线时,使用这些技能时,玩家仅指示终点。 结果,需要一种算法,以找到到指定点的最短路径,从而绕过所有可能发生碰撞的物体(其他英雄的身影,障碍物等)。


    借助图形和BFS穿过单元格非常简单地解决了这个问题。
    简而言之,该算法的本质是按距离标记各个单元格,从英雄的当前位置到要移动英雄的指定单元格(以橙色表示)。

    找到所需的单元格后,将在单元格中搜索返回路径,以使从起点到下一个单元格的距离应比到当前单元格的距离小1(段落标记为黄色)。 返回到起始位置(绿色单元格)后,将形成一系列点,这是最短的路径。 这是作为团队移动英雄传送到Arduino的序列。
  11. 英雄死亡后,游戏会自动将人物移到“家园”。 主区域-游戏开始时放置图形的单元格。 每个玩家都有自己的角色。 开始游戏后,您无法在本国区域中输入或使用该能力。 这样做是为了使玩家无法复活。 对于英雄被击败的玩家,游戏将在1轮后结束。 在他重新参加战斗之后。

  12. 目前,英雄是最后一位留在场上击败对手的玩家正在获胜。 但是条件可能会有所不同,例如,先获得N个碎片得分的人获胜。

这是在当前版本中有效的游戏方式。 由于缺乏游戏设计经验,也许我们看不到明显的学校或机会。 例如,等待您的下一个动作总是很痛苦的。 在当前的实现中,等待时间可以达到1.5分钟。 在原型的下一版本中,我们计划添加RFID标签读取器,这将使游戏玩法多样化。 例如,使用带有RFID标签的卡,您可以在回合外使用。

缩图


缩影喜欢一切! 我们也不例外。 因此,在收集力学和编程知识的同时,我们也致力于发明自己的微型模型。 我认为从图片中可以明显看出我们的游戏是关于在舞台上战斗的幻想猫。
因为 我们根本不知道该如何使用文字,我们求助于我们的朋友,他非常高兴地开始画“战斗猫”。

她以我们的宠物为基础。 因此,在她的房子里住着一只巨大的凶恶的猫,绰号为“海盗”-是他躺在微型勇士的心脏上。

几周后,我们得到了第一份草图。


从有关棋盘游戏制作的文章中,我意识到,在俄罗斯,制作缩影非常糟糕,许多缩图在芬兰或德国定购。

在进行微型模型制作之前,我们需要为每个英雄制作模型,这些模型足以构成原型。 起初,我们想用聚合物黏土制成它们,但事实证明,在我们的朋友中,没有小型画家,而当时的定制价格太昂贵了。 因此,我们决定首先在3D打印机上打印它们。 为此,我们的朋友为我们在Zbrush中的第一个英雄制作了3D模型。


在FDM打印的帮助下,不可能打印出质量令人满意的图形。

幸运的是,我的妻子正在使用SLA 3D打印机。

立体光刻(SLA)是3D打印技术,可让您使用光源通过光聚合过程将液体材料逐层转换为固体。 使用SLA技术打印时的层厚比使用FDM打印时的层厚小几倍,因此,成品质量更高。

几天后,我们得到了第一个模型。


这些微缩模型的质量要高得多,但仍达不到通过塑料模塑获得的产量。 造成这种情况的原因是支撑物,移除后会留下明显的痕迹。 从理论上讲,我们可以将图形“切割”为单独的部分,并在不使用支撑的情况下单独打印每个图形,然后将它们粘在一起。 但是,这将花费很多时间,此外,将来它仍可能会改变。

每个图都有自己的基础,我们也将其打印在3D打印机上。 底座内部是钕磁铁。 磁体的大小和厚度是根据经验选择的,以便人物可以平稳地磁化到平台托架上的电磁铁,但不会对相邻人物产生反应。

合计


目前,我们致力于改善平台的物理特性和所有组件的可靠性。 我们将用聚碳酸酯和ABS塑料代替胶合板,改善平台组件彼此之间的固定性,并使运动场可移动,以便可以将其更改为其他形状因子(例如六角形)的场。 下一步是创建一个成熟的MVP,这对展示给人们来说并不可耻。

随着游戏变得更加艰难。 当然,我想完全专注于平台的实现,而不必参考特定的游戏。 但是,我们很清楚,没有人对没有游戏的平台感兴趣。

谢谢大家的批评/建议/关注。 我们有一个想法,可以在不使用机制的情况下创建版本,但是能够确定人物在野外的位置和类型。 我认为下一篇文章将在创建MVP之后编写。

Source: https://habr.com/ru/post/zh-CN427227/


All Articles