各位老铁们好,相信很多人对教你用三菱PLC制作《超级玛丽》。模拟操作不需要任何硬件。都不是特别的了解,因此呢,今天就来为大家分享下关于教你用三菱PLC制作《超级玛丽》。模拟操作不需要任何硬件。以及的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
这是另一个动画:
这款游戏虽然玩法简单,但是要做的内容太多,一个人做起来不太现实。因此,我希望通过讲解这个节目的制作方法,让更多的人能够参与其中,丰富游戏内容。
人机界面
如果要显示内容,就必须有屏幕。常用的HMI都内置有开关和指示灯。可以使用字指示灯来代替屏幕的像素,并通过D软元件的值来控制指示灯显示的颜色。
那么这个颜色是按照什么规则设置的呢?我根据Excel中get.cell函数中单元格颜色定义的顺序设置HMI指示器颜色。这个函数的颜色定义可以在网上找到:
为什么要使用Excel函数定义?稍后再谈。
该函数总共定义了56 种颜色。虽然我们用的不多,但是我还是很努力的把所有的颜色都设置好了!
我们在PLC全局标签中创建一个容量为30*30的二维数组,并将起始地址设备设置为D0,以对应HMI的虚拟屏幕。
这样就可以利用XY坐标来定位像素点的具体位置。例如,如果我们要将第4列第5行的像素显示为黑色,则通过查看颜色定义可知黑色编号为1。我们只需要写gDisplay[3.4]:=1 就可以了。
创建游戏元素
超级马里奥游戏包含很多元素,背景:大地、山丘、树木、蓝天白云、水管、石头。
动态角色:马里奥、蘑菇怪物、乌龟怪物、炮弹。
为了在我们制作的屏幕上显示这些元素,我们需要计算屏幕数组中这些图片的每个变量的颜色编号。以主角马里奥为例展示一下我的制作方法:
1、首先在excel中根据网上找到的像素图片,使用“填充颜色”绘制马里奥模型:
2.然后使用get.cell函数获取每个单元格的颜色编号(如何使用get.cell函数来自百度):
为了保存这些数据,需要在程序中创建一个容量为16*17的二维数组。为了简化程序长度,我们将数据保存到FC函数中。
3. 创建函数FC_Mario 并将返回值设置为:word [signed] (0.15,0.16),
4、利用刚才excel中的简单公式和下拉操作给FC_mario赋值:
这样一个像素的制作就完成了。我还在Mario's FC 中添加了States 变量来选择Mario 的不同姿势。
使用上述方法制作所有元素:
此时,我们可以编写几行代码来在虚拟屏幕上显示图像。我们可以将上面建立的FC返回值传递给一个相同容量的数组,然后使用两层for循环将其传递给屏幕显示数组gDisplay。屏幕中会显示相应的图片。例如显示马里奥:
adjMario:=FC_Mario(0);
对于ii:=0 到15 执行
对于jj:=0 到16 执行
gDisplay[ii,jj]:=adjMario[ii,jj];
结束_for;
结束_for;
adjMario 是与FC_Mario 元素相同的双层字数组。如果你有兴趣,可以尝试一下。
编程
案例iStep 的
0:
//初始化地图
1:
//计算显示位置
2:
//刷新屏幕
结束案例;
初始化地图
屏幕尺寸太小,无法显示游戏的整个地图,因此我们需要一个容量更大的数组来存储整个地图的所有元素。
我这里创建了4个标签,两个常量代表数组X、Y方向的最大值,方便后续程序修改。背景元素显示数组BackGround,以及背景元素属性数组bgAttribute。显示数组用于保存每个元素的颜色数据;属性数组用于保存元素的属性。例如0为背景,人物可以重叠,1为固定物体,人物不能重叠,用于判断碰撞。
以后还可以添加其他属性,比如怪物可以是2个,可以蹲进去的管道是3个,变大的蘑菇buff是4个等等。
2:设置背景颜色
地图中没有元素的网格被视为蓝天并设置为蓝色。找到一个蓝色的数字,比如47。属性是重叠的,设置为0:
3:添加位置不变的元素
例如,地砖、山丘、石头等元素相对于地图位置是固定的,我们可以直接在初始化步骤中添加它们。例如添加地砖:
首先使用上一步创建的函数生成地砖的颜色数据,保存到地砖数组objGround中,然后指定地砖在地图中的位置(从屏幕的零点位置开始, map,而数组元素所有元素都是左上角,所以用数组零点[0.0]来定位)。
例如,第一块砖块的零点[0.0] 位于地图上的[0,55] 处。在X方向上,一块砖占据了8个格子,因此第kk块砖的零点[0,0]在[0+8*kk,55]位置。然后使用两层for循环来传递所有砖块的所有X和Y值。不要忘记元素属性。地砖不重叠,属性设置为1。
使用同样的方法给所有元素赋值。如果元素中存在值为0的间隙,则需要添加一个判断来去除间隙:
计算显示位置
在演示视频中,马里奥在屏幕上的位置以及窗口中显示的地图的位置都通过按钮进行上下左右移动。要实现这个目标,需要根据马里奥相对于屏幕的偏移量和屏幕相对于地图的偏移量来计算。
Mariooffset用于记录Mario元素[0.15, 0.16]相对于屏幕零点[0.29, 0.29]的偏移量,即Mario在屏幕。
当偏移量为0时
当偏移量X=8,Y=6时
bgOffset用于记录屏幕[0.29, 0.29]相对于地图[0.175, 0.59]的偏移,不再显示。
2:设置屏幕刷新率
将1000ms除以刷新率FPS(默认值15)得到一帧的保留时间,使用ton功能块计时,时间结束后进行计算,并重置计时触发器。
3:根据上、下、左、右移动方向计算偏移量
我们以向右移动为例:
M0是右移按钮的地址。当M0触发时,马里奥的姿势在pose=1、2、3之间循环变化,做出行走的动作。
在移动之前,我们需要判断是否要接触到一个属性为1的固定物体。我们首先重置接触状态变量iTouch,并使用for循环遍历是否右侧的地图属性马里奥为1。确定的距离是马里奥在一帧内移动时的距离。距离(即马里奥的移动速度)由变量iSpeed 表示。这样我们就可以根据itouch的状态判断马里奥右侧是否有障碍物。
根据触摸变量的状态,我们决定是否要更改两组偏移量。如果touch为false,首先判断Mario是否在屏幕左侧(mariooffsetX7)。如果在左边,则增加Mario的X方向偏移mariooffsetX(mariooffsetX+ispeed)的值,并将Mario移动到屏幕中间。
当mariooffsetX=7时,马里奥位于屏幕中间。此时,马里奥静止不动。将背景地图向屏幕左侧移动,判断屏幕是否没有超出地图最右侧(bgOffsetX175-30,30为屏幕宽度),如果屏幕已经显示到最右侧地图和地图位置不动,马里奥继续向屏幕右侧移动,直到移动到屏幕最右侧(mariooffsetX=29-13,13是马里奥的宽度)。
向上、向下、向左移动是类似的。
刷新屏幕
位置计算完成后,我们需要根据两组偏移值刷新屏幕显示的内容,但必须先刷新背景图,再刷新马里奥。目的是擦除前一帧的马里奥图形。
Mario的左右方向由iDirection变量来表示,它是通过改变Mario在X方向上的赋值顺序来实现的。
程序编辑完成后,模拟PLC和HMI开始游戏。
你学会了吗?