行为-状态机无头痛

状态描述是描述用户输入和对其进行反应的顺序(例如,在控制游戏中的角色时)的标准方法。 但是,这通常会导致程序繁琐,要理解这些程序需要付出很大的努力,甚至需要在纸上画草图。 在本文中,我建议对说明进行一些细微改动,以节省屏幕空间和大脑资源。


图片

描述的转变是协程技术的使用。 若要应用此技术,有必要想象一下我们期望从计算机获得什么样的行为 。 因此,我将为此任务创建的小型库称为“行为”。

当用户与程序交互时,计算机将等待特定的操作并以特定的方式响应输入。 原始行为及其组合可以替代通常在程序中正式或非正式地找到的庞大状态机。 例如,当程序处于等待按下某个键的状态时,可以说它执行了Behavior waitForKey(...)。 方便之处在于,行为与状态机不同,以易于阅读的形式组合在一起。 拖放的简单示例:

* DragAndDrop = * draggedObject =  MouseDown  -  * First *  MouseUp * Forever *  MouseMove *  draggedObject 

行为具有开始,结束并可以返回值。 行为按顺序执行,也可以使用组合器并行执行。 例如,第一个组合器并行执行多个行为,并在一个行为完成时结束,并返回其结果。 永远-重复执行特定行为到无穷大。 与函数执行不同,行为不会阻塞执行的主线程,因此无限行为可能非常有用。

我使用将原始事件(例如MouseDown,MouseUp,MouseMove等)作为参数接收并产生以下形式的对象的函数来实现“行为”:

 { done: true|false, value: result value } 

您可以在此处查看实现: GitHub上的behavior.js以及此处的拖放示例: jsFiddle

在哪里可以使用行为?

  • 电脑游戏 -编写逻辑和AI十分方便,有时我什至用行为来做所有事情,包括动画和对象移动,但您需要监控性能
  • 前端中的教程 (新功能介绍)-显示信息,等待用户交互,根据输入继续,所有代码都放在一个地方,几乎像伪代码一样阅读
  • 面向主题的语言解析器是惯用的代码,因为您可以并行执行多个“行为”,所以无需“超前”输入

照片: Nick Youngson CC BY-SA 3.0 Alpha股票图像的行为

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


All Articles