在前文(https://bbs.eeworld.com.cn/thread-1230538-1-1.html)中,我们已经用lvgl在BL808上实现了小狮子的奔跑跳跃功能,在本篇中,我们将实现修改宠物的日夜环境,以及日夜中宠物的不同行为。
首先,我们认为狮子是晚上活动,白天睡觉的动物,所以把时间段分为3块:白天、傍晚、夜间,每个时间段,狮子的活动频率各不相同。
接下来,把宠物的栖息地在地图上标注出来。
宠物可以待的地点在图中标注出来,有7个,每个地点宠物方向可以是朝左或者朝右,可以是站姿或者躺姿(A的位置太小,认为狮子不会在狭小位置睡觉),所以一共有26个初始状态。
根据这26个初始状态,决定了宠物狮子可以做的动作一共有47种(当然只是暂时的,未来肯定还准备继续扩,比如从G到C掉下来摔扁了,E到F的爬坡动作等等),把这47种动作全部写在一个函数里面封装起来,只通过动作序号作为参数就可以调用,返回值是动作结束后下一个动作的初始状态值。
把对应关系做成一个表格:
状态机.xlsx
(11.93 KB, 下载次数: 2)
在上面的表格中,发生动作的概率系数直接用整数(主要是为了在代码中好实现一些),表格中没有出现的对应关系发生概率为0。
将上述表格转换成一个3*26*47的数组(action_chance[3][26][47]),根据这个数组,通过随机值决定小狮子的下一步动作。
白天大概率是在睡觉
傍晚活力稍强一些,开始做一些运动
夜间就基本不睡觉啦
除了宠物本身的动作,背景环境也发生了变化,主要有太阳位置的变化和背景色的变化。
太阳是采用lvgl中arc控件实现的,通过lv_obj_set_style_arc_opa函数把LV_PART_MAIN和LV_PART_INDICATOR的透明度设置为0,就只可以留下LV_PART_KNOB,显示为可以在弧线运动的一个圆,通过lv_obj_set_style_bg_color(arc, lv_palette_main(LV_PALETTE_RED), LV_PART_KNOB);将其设置为红色,就可以当做太阳使用了。lv_arc_set_value(arc,sun_time);就可以设置太阳所在位置了。将arc设置够大,选择合适位置放置,当LV_PART_KNOB在屏幕内就是白天,移出屏幕后就是晚上。
根据不同时间段,作出背景的混色效果,并决定狮子可以按照哪种概率活动。
通过设置lv_obj_set_style_bg_main_stop和lv_obj_set_style_bg_grad_stop实现地平线效果后,天空可以由亮蓝(白天)变成红(傍晚)再变成深蓝(夜间),地面的颜色也在对应变化。
15c63105bf98a1e01e7a5f943595c326
|