冰壶游戏更新:应用设计和状态流
最近有人向我发起挑战,要求我将我们几年前发布的冰壶模拟器(参见这篇文章和这篇文章)以使用该时段尚未提供的新功能:程序设计师和状态流的MATLAB.
如你所料,这可不是我能拒绝的挑战!
你可以在这里找到最终的结果:冰壶游戏App
概述
下面是一个图表,说明在一个高水平上如何实现冰壶应用程序:
如果你下载了这个应用程序,下面是你将看到的文件的描述:
- TestCurling.m:方法创建的测试应用测试框架.这允许我以编程方式执行我的应用程序,并验证它的行为符合预期。
- curling.mlapp:主应用程序。
- curlingLogic.sfx:定义应用程序的所有逻辑和操作的状态流图。
- curlingSimulator.slx:一个金宝app模拟冰上石头动态的Simulink模型。
- msfcn_showTrack。M和msfcnsweep . M:MATLAB s函数在Simulink模型中使用,在app中金宝app实现了冰壶游戏的动画化。
现在让我们单独来看每一部分
程序设计师
正如我在以前的文章,在MATLAB中执行的状态流图非常方便地定义MATLAB应用程序的行为。在这样的应用程序中,MATLAB应用程序本身只定义了应用程序中的图形元素,并将应用程序的回调映射到状态流图中的事件。
以下是应用程序在设计视图中的样子:
就代码而言,这非常简单。我简单地定义了一个startupFcn回调来实例化状态流图,在那里我向它传递了一个MATLAB应用程序的句柄。然后,对于应用程序中的每个项目(按钮、轴等),我定义了一个在状态流图中触发事件的回调。
MATLAB状态图
这是定义所有应用程序功能的地方。它看起来是这样的:
这个逻辑将一次投掷分为4个状态:等待、选择目标、指定速度和旋转以及投掷。每个状态之间的转换由应用程序触发,在每个状态下我可以与应用程序的组件进行交互,就像我在MATLAB代码中所做的那样。你将在这篇文章的最后看到更多关于石头是如何动画的。
一旦用户点击应用中的“Go”按钮,状态流图就会启动模拟并等待它完成。为此,我定期使用后函数。
对于一些实用程序,我需要在图表的多个地方,我在Stateflow中创建了MATLAB函数,我可以从图表的多个地方调用。这里是一个示例函数,每次我需要画一个新的石头。
金宝app仿真软件模型
和我在我的2018年后, Simu金宝applink模型变化不大。我唯一需要修改的项目是MATLAB s函数,以便在模拟过程中使石头动画。
为了让S-Function与应用程序交互,它需要一个句柄。在开始模拟之前,状态流图将此句柄存储到S-Function中的应用程序中阻止用户数据.这样,s函数就可以检索它,并在每个时间步中设置石头的位置。下面是Output方法的样子:
测试
在开发这样一个应用程序时,如果你需要一次又一次地手动点击同一系列的按钮,那么测试和调试就会很乏味。这就是应用测试框架开始发挥作用。
我创建了一个函数,以编程方式执行一次投掷。因此,新闻方法的应用程序测试框架允许我按下一个按钮或在应用程序的特定位置。
然后在一个测试中,我用不同的目标和速度调用这个方法。最后,我确认所有的石头都在它们应该在的地方。
下面是运行测试时屏幕的样子。注意蓝色的圆圈,在那里程序点击发生,以及Stateflow动画,这使我很容易验证它正在做正确的事情:
现在轮到你了
下载此最新版本冰壶游戏应用程序在MATLAB中央请在下面的评论中告诉我们你的想法。
- 类别:
- 有趣,
- Stateflow,
- 有什么新鲜事吗?
评论
要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。