【新课标案例分享】
结合加速度和算法
制作创意计时器
未来板Lite
导语
又到了每周的案例分享环节,看着未来板Lite四方小巧的造型,决定结合加速度和算法,为其量身制作一个创意沙漏。无论是正着摆还是倒着摆,未来板Lite都可以检测相应的姿态显示沙漏。
材料准备
未来板 Lite*1
编程软件使用
Kittenblock1.89
程序功能
生活中的沙漏大家都见过,在一个方向的沙子漏完之后,需要翻转沙漏才可以继续计时,而本次项目的核心就是通过算法完成电子沙漏的翻转效果以达到继续计时的功能。
前期准备
沙漏的造型可以通过未来板Lite的像素模式画出来,但是后来笔者发现用程序画沙漏本身需要时间,模拟沙子下落的动画显示出来会显得比较卡,其次是这个造型太丑了,不符合未来板Lite的气质😶
想了想还是决定使用直接以图片的方式显示好一点,这里的.png格式的图删除了沙漏中间的部分,保留背景的空白区域,至于为什么这么处理,先卖个关子,稍后会解释~
最后把图片命名为sl(沙漏)上传到未来板上,看到板子内部上传。前期准备完成!
程序编写
1.显示沙漏
首先显示刚刚上传的图片,并使用矩形积木来表示沙漏里的沙子,得到图片的效果。
但是沙子使用矩形积木来实现的,所以会有棱角边,貌似不会很完美的“放进去”。但其实用矩形积木也是可以做到的。因为我们的沙漏图标中间是掏空的,背景是实体,所以只需要调整图标的显示顺序,先显示矩形,把它放在最底层,后显示沙漏,把它放在最上层,这样就能以假乱真把“沙子”装进“沙漏”里了。
2.制作沙子自由落体动画
现实沙漏里的沙可以看成是做自由落体运动,那么参考自由落体时间-位移公式h=1/2g∆t^2,把自由落体的公式存放到【加速度位移】变量里,转化成整数是为了能在像素里显示对应的位置。
其中【时间1】-【时间2】可以用板载的运行时间来代替,【时间1】为初始时间,【时间2】为实时时间,沙漏速度g可以自己在初始化手动调整(建议扩大7-10倍),比如100。
有了加速度后可以开始设置沙漏动画了,还是使用矩形积木来表示沙子,颗粒大小设为4*4,并且从坐标(78,66)的位置(沙漏中央偏下)落下,纵坐标会根据公式的变化而变化。
上传后发现是有沙子掉下来的感觉,但是直接穿过沙漏底部了。
解决这个问题也很简单,因为我们还没有设置地面的高度,可以加一个判断条件,当碰到沙漏底部时【加速度位移】归0,且重置最新的时间变量,这样就可以实现“沙子”源源不断掉出来的效果了。
3.制作沙漏高度变化
目前来说效果已经初步显现了,接下来需要做到顶部的“沙子”逐渐减少,底部的沙子逐渐增加。为此要添加变量【沙粒高度】,每次沙子落到底部一次,高度就加1。直到顶部的“沙子”漏完为止,而顶部和底部的沙子高度变化都可以根据【沙粒高度】变量进行数学计算。
可是什么时候沙子停止下落呢?当顶部的沙子高度移到64时(屏幕中心高度),沙子停止下落。到这一步为止也就完成了一大半的程序了。
4.制作沙漏翻转效果
这一步可以从沙漏的状态开始分析,分析可以由什么状态作为触发条件进入下一个状态。
沙漏的状态总共可以分为四类,分别为:正立开始、正立完成、倒立开始、倒立完成。其中正立完成状态可以作为触发倒立开始的条件,而倒立完成状态可以作为触发正立开始的条件。
有了这个思路,我们就可以继续回到程序中来编写程序了。这一环节需要创建【状态】变量来实时记录板子当前的状态。在原先的基础上添加一个起始状态,在程序第一次打开时,初始设置函数生效,只要板子正立就设置【状态】变量为正立开始。
同时把刚刚完成的沙漏程序用名为【沙漏开始】函数封装起来,同时判断状态中是否包含开始字样,以此来触发此函数的运行条件。到目前第一次沙漏程序可以正常运行。
除此之外还需添加用于判断沙漏是否已经完成的程序。创建函数把功能封装起来,只要顶部的沙子高度移到64,就依据情况进行状态的设置,如果此前是正立的状态,就设为正立完成,反之就设为倒立完成。不要忘记这里需要重置【沙粒高度】(这个沙粒高度是沙漏顶部的沙粒高度,沙漏漏完了顶部的高度自然就是0)。
马上就到最后一步啦~在上述程序完成后,可以编写方向切换的程序。如果此时板子的姿态为倒立,且当前的沙漏状态为正立完成,那么设置屏幕方向朝下颠倒屏幕,同时把状态设置为倒立开始,这样看起来就像是沙漏颠倒过来了一样。反之为同理,设置对应的程序即可。
这里不得不提一下未来板Lite的屏幕方向切换功能,极大的简化了编程实现难度。同时这也是和未来板的一个小区别,如果用未来板制作同样的效果难度要大一些。
5.功能扩展
到这里程序就完成啦~可能有些程序的逻辑比较绕,如果自己多看几遍也很容易理解的😁
此外也可以适当添加一些制作细节,比如沙漏快漏完时,颗粒的大小会变化,屏幕会显示读数等等。这个就由大家根据自己的想象力和对项目的要求来调整了。
程序内部图片:
功能演示

