基于HMI的Lua游戏设计——实现俄罗斯方块
一、引言
随着工业制造技术的发展,HMI(人机界面)的应用场景愈加广泛,在能源、汽车、医疗、工控、充电桩等领域都有涉及。拓普微的智能液晶显示模块,能简单迅速地实现人机交互界面,外部系统只需使用简单的串口指令就能完成复杂的显示。
智能显示模块支持脚本语言,Lua语言规范简练、体积小、易于嵌入使用,所以适用领域非常广泛,很多应用程序、游戏使用Lua作为自己的嵌入式脚本语言。拓普微的智能液晶显示模块利用Lua语言使用简单的指令就能创建出功能丰富的人机界面,大大缩短了产品开发时间。本文将介绍智能显示模块HMT070ETD-C如何通过上位机设计界面与Lua脚本的配合,实现一款家喻户晓的游戏——俄罗斯方块。
二、需求分析
1、明确俄罗斯方块游戏规则
游戏会在7种类型的方块(T型、S型、Z型、L型、反L型、线型、方型)中随机生成1种,然后自上往下移动,玩家在方块移动期间通过“上下左右”改变方块降落位置,或旋转方块形状。然后根据定时控制,将方块停留在底部不可移动的位置。最后检查每一行的方块填充是否完整并消除,增加得分。
2、Lua程序设计
参考俄罗斯方块游戏规则:
①定义游戏中必要的数据结构;
②构建相关的处理函数;
③完成游戏的主循环逻辑。
3、HMI界面设计
由于该设计基于HMI串口屏开发,因此需要考虑:
①界面风格设计;
②方块如何匹配与Lua中的数据结构;
③上下左右按钮如何关联功能;
④得分数据显示刷新。
三、Lua程序设计
嵌入至HMI界面的Lua程序主要实现“俄罗斯方块”的以下功能板块:
1、游戏场景数据结构
1.1搭建游戏场景
构建函数:function Scene:ctor()
输入:场景名
输出:12x21方块的场景
说明:以数组的形式存储方块显示的数据
1.2定义方块数据结构
定义数组:cBlockArray[]
说明:构建三维数组,数组中定义7种方块类型(T型、S型、Z型、L型、反L型、线型、方型),以及7种方块的4个旋转形态。该数组用以下落时的方块刷新显示使用。
1.3场景内方块显示与清除
构建函数:function Scene:Set(x,y,value)
输入:“x,y”输入场景内方块坐标,“value”显示控制,“1”时显示“0”时不显示
输出:方块的显示与清除效果
算法说明:该函数是游戏的基础函数,场景中所有方块的显示与清除通过调用该函数实现。衍生清行、清屏函数有function Scene:ClearLine(y) 、function Scene:Clear()
1.4场景内方块坐标获取
构建函数:function makeKey(x,y)
输入:“x,y”输入场景内方块坐标
输出:HMI中对应方块的地址
算法说明:①判断输入的“x,y”坐标是否在符合场景区域;②该函数用以获取方块坐标的实际对应的地址,返回的地址将用于HMI中实际方块的显示清除控制。衍生函数function Scene:Get(x,y)用以判断移动、变形、放置时是否合法。
2、游戏功能算法设计
2.1随机生成方块
调用函数:math. random()
说明:随机数学函数选取方块类型生成。
构造函数:function BlockPrint(index,trans)
说明:将下一个方块信息显示在左侧提示框。
2.2方块检查
function RawPlace(index,trans,scene,newX,newY)
输入:方块、形态、场景、X、Y坐标
输出:生成的方块放置到游戏场景后,更新场景
算法及说明:由新的方块进入游戏场景时调用此函数。①对新进入游戏的方块、或移动时方块进行检查,可以放置则更新方块坐标返回True,不能放置则返回False。
2.3方块移动(左、右、加速下降)
构造函数:function Block:Move(deltaX, deltaY)
输入:方块以及方块的移动方向,“deltaX”左右移动控制,“deltaY”向下移动
输出:移动后的方块位置
算法及说明:对正在下落的方块进行操作时调用此函数。①根据参数“deltaX”和“deltaY”依次对方块中所有坐标左移、右移、下降操作;②调用方块检查函数,判断移动是否合法。
2.4方块旋转变形
构造函数:function Block:Rotate()
输入:正在下降的方块
输出:变形后的方块位置
算法及说明:对正在下落的方块进行操作时调用此函数。依据方块类型,调用检查函数,判断变形后方块坐标是否合法。然后更新变形后的方块坐标。
2.5定时操作、延时操作
调用函数:hmt.gettick()进行定时,hmt.delayms()进行延时。
说明:这两个函数由HMI库函数提供
hmt.gettick()获取HMI屏幕系统运行时间,返回时间的单位“ms”,此处用以定时使用,如判断按钮长按、方块下降速度控制;
hmt.delayms()为HMI屏幕系统延时函数。输入的时间单位“ms”。
2.6、场景中方块下降完成后,检查场景
构造函数 function Block:Check()
输入:游戏场景中的所有方块数据
输出:消除方块后的场景,增加得分,根据得分数调整方块下落时间
算法及说明:当场景中添加方块后,调用此函数。①检查场景中是否存在可以消除的行;②存在时消除,将上方的方块下移相关数量;③刷新得分,调整下落速度。
2.7、游戏结束,初始化场景
构造函数 function Block:lifeDown()
输入:游戏场景中的所有方块数据
输出:初始化场景,清空方块,清空得分,初始化方块下落时间
算法及说明:判定游戏结束时调用此函数①执行方块全显函数;②清空全显的方块;③归零得分,调整方块下落时间为初始值。
四、HMI界面游戏界面设计
1、游戏场景设计
设计游戏界面UI,包括俄罗斯方块活动场景,下一方块类型提示区、得分区、下方按键区;
①俄罗斯方块活动场景,方块活动宽高比“12:21”
②下一方块提示区,采用“4x4”矩阵显示
③得分区,显示游戏内取得分数
④下方按钮区,标识“上下左右”4个按钮
2、游戏方块设计
模拟像素的产生,使用了变量图标显示单个方块,每个方块使用一个变量地址控制,当变量置1时显示方块,变量不为1时不显示该方块。方块使用图标 “ ”显示。
3、按钮功能设计
模拟“上下左右”按钮控制功能,使用HMI的触摸键功能替代,每个触摸键都关联相应的地址,配合Lua脚本中回调函数,实现游戏中“上下左右”移动及方块变形的功能。
4、信息框,下一方块提示及分数显示
显示下一随机方块,随机方块显示使用HMI中的变量图标“ ”实现,提示区的变量图标数量为“4x4”;
得分数使用HMI中的数字控件关联相应变量显示。
五、总结
如图所示,为《俄罗斯方块》的游戏显示效果,综合测试表现功能运行正常。智能显示模块的芯片处理速度快,期间游戏界面刷新无卡顿,方块变形移动正常,“上、下、左、右”触摸反馈迅速,功能运行稳定可靠,而且上面这些都是在智能显示模块上独立完成, 无需外部协助。
在Topway智能显示模块上采用上位机工具结合Lua脚本的开发方式,对于用户进行界面开发和功能设计都大有裨益,实现一些普通串口屏做不到的功能。该方式能充分利用智能显示模块的处理能力,将主板中的一些程序功能移植到Lua脚本中实现,可以减少主板的指令解析处理,降低串口通讯压力,能大幅缩短产品开发周期,节省成本。