这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 教程 | 用一块智能屏+几个简单指令,实现俄罗斯方块游戏

共31条 1/4 1 2 3 4 跳转至

教程 | 用一块智能屏+几个简单指令,实现俄罗斯方块游戏

管理员
2021-07-09 16:53:51     打赏

基于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.png

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.png

2、游戏方块设计

模拟像素的产生,使用了变量图标显示单个方块,每个方块使用一个变量地址控制,当变量置1时显示方块,变量不为1时不显示该方块。方块使用图标 “ ”显示。

3、按钮功能设计

模拟“上下左右”按钮控制功能,使用HMI的触摸键功能替代,每个触摸键都关联相应的地址,配合Lua脚本中回调函数,实现游戏中“上下左右”移动及方块变形的功能。

4、信息框,下一方块提示及分数显示

显示下一随机方块,随机方块显示使用HMI中的变量图标“ ”实现,提示区的变量图标数量为“4x4”;

得分数使用HMI中的数字控件关联相应变量显示。

五、总结

如图所示,为《俄罗斯方块》的游戏显示效果,综合测试表现功能运行正常。智能显示模块的芯片处理速度快,期间游戏界面刷新无卡顿,方块变形移动正常,“上、下、左、右”触摸反馈迅速,功能运行稳定可靠,而且上面这些都是在智能显示模块上独立完成, 无需外部协助。

1625821080765259.png

在Topway智能显示模块上采用上位机工具结合Lua脚本的开发方式,对于用户进行界面开发和功能设计都大有裨益,实现一些普通串口屏做不到的功能。该方式能充分利用智能显示模块的处理能力,将主板中的一些程序功能移植到Lua脚本中实现,可以减少主板的指令解析处理,降低串口通讯压力,能大幅缩短产品开发周期,节省成本。




关键词: TOPWAY     Smart LCD    

工程师
2021-07-09 20:56:36     打赏
2楼

这个酷啊!


工程师
2021-07-09 21:01:18     打赏
3楼

不愧是智能显示模块啊! 设计如此有些复杂的游戏,看起来很easy


工程师
2021-07-09 21:06:52     打赏
4楼

这显示模块很nice嘛! 不知道单价如何? 太高用不起啊


工程师
2021-07-09 23:44:41     打赏
5楼

十分感谢您的分享


助工
2021-07-11 22:16:44     打赏
6楼

十分感谢您的分享


工程师
2021-07-17 19:46:58     打赏
7楼

感谢楼主分享


工程师
2021-07-17 19:53:19     打赏
8楼

学习到了


工程师
2021-07-17 20:01:38     打赏
9楼

感谢楼主分享


工程师
2021-07-18 23:39:02     打赏
10楼

挺厉害的


共31条 1/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]