粉丝822获赞3540

大家好,我是欧阳文艺,今天我来给大家讲解一下我最近做的两个关于音乐的脚本。 我从高中开始做音乐的,但是一个一个音块按照谱子上面进行摆放,这个首先就是很麻烦,有的方块要点十来次, 另外的就是容易错,如果点错了要重新听一下才知道错在哪里。所以我到大学学软件工程之后,我就自己学了撸啊脚本, 通过脚本我就可以实现一些很牛逼的功能。我做了一个音调方块生成器,可以通过玩家手持道具类型还有输入的字母或者数字来进行放置音乐方块, 这个还可以设置调性的。还有一个是乐器方块生成器,乐器方块生成器是有存储功能的, 可以将玩家指定的乐器方块类型存储到一个变样里面,在玩家按下 shift 按键的时候就放置那个方块,而且如果 存入了这个记忆,但是又放置了别的方块,这个记忆是不会被清除的。现在我们来演示一下这两个脚本的用法。今天我们还是用迷你世界主界面启动音乐来做示范的教材, 这个谱子也是我自己爬的,现在我把迷你世界放在左边,水果放在右边,这样我们就可以一边看谱子一边做 音乐了。这个字牌上面写着降八度,用综合五降八度就是比如要用高音块就用中音块,如果要用中音块就用低音块。 我们现在要做的是第九小节的第三拍的后半拍,我在这个地图里面也是一格是四分之一拍,转化成玩法地图才能用这个脚本。 从这一个方块开始放 低八度的话就是 l 的 a, 然后下一个是 g, 直接输入在聊天框就 可以了。你看我们现在手持的道具就是低音块,直接在聊天框里面输入音铃就可以了, cdf gab 就是音乐中的七个音铃, 刚才为了给大家方便演示,所以开了一下倍数,我现在就做了这么多,实际上也就是两三分钟的事情,特别的简单,不用手点,而且还不容易出错。现在我们来演示乐器方块, 这一段要用综合舞,那我们就手持乐器综合,然后在聊天框输入, 现在已经录入数据了,直接按下潜行键就可以在对应的位置上面生成方块。那大家可能会有疑问,那我怎么知道这个是怎 综合点五下的音效呢?别着急,到后面我会给大家演示一下,这边用综合六,综合六是一种很可爱的音色哦, 录入数据之后直接按下潜行键就可以了。乐器方块生成器是有记忆功能的,所以不管你切换道具还是中途又放置了其他的音乐方块,这个乐器方块的数据是不会受影响的, 所以说只要你按下前行键,他就会生成对应的方块, 把剩下的部分做完,然后给大家演示一下整个的效果。 刚才示范的综合五和综合六这个两个乐器方块确确实实的放在那边了,所以说明这个脚本是有效的,大家如果想要用这个脚本,可以在西瓜视频私信我, 我的梦想是成为迷你玩的软件工程师,为迷你世界的建设添砖加瓦,我会秉承终身学习的理念,不断提高 自己,精进自己的技术。好,本期视频到此结束,感谢大家观看,我们下期再见,拜拜!

大家好,今天这节课的目的是带大家一块阅读 l u a 的帮助文档, 快速学习 lua 的基本语法,对于已经掌握了基本语法的可以跳过不看。我们为什么要学习 lua 的基本语法呢?因为懒人精灵脚本使用的是 lua 的语法, 只有熟练掌握了才能写好。懒人精灵他的学习网站我推荐是菜鸟教程中的 lua 部分,这里我先简单 过一下今天需要带大家了解的内容部分。首先是支付串,在脚本中我们需要处理的文本数据都是支付串。比如说我要输入一个手机号在界面中,或者要在游戏的窗口中发送一句话,这些内容都是支付串, 他的特点是用两个引号引起来的。接下来是波尔兹,波尔兹,为什么叫波尔兹呢?他是纪念数学和逻辑学家乔治波尔,他的词含义就是真的或者是假的。我们说话的时候如果什么什么是真的, 如果今天下雨就怎么怎么样,这里假定今天下雨是真的。在语言中,我们用真和假来描述,在逻辑电路中, 我们用零和一,在电路中,我们用高低电瓶。而在程序中,我们通常用处或 force, 这里面有一个重要的补充处代表真, force 代表假。 我们在写条件语句的时候,零也代表甲,空也代表甲。这里面的空不是一个空格空起来,而是条 条件语句中需要判定的部分,他的值是空等数,我们点击命令填写的坐标值就是一个整数。除此之外还有函数和表, 我们一会会一起去网页中查看这方面的教程。还有条件运算,这里面的条件运算就和数学中的加减乘除一样,可以放在两个条件的中间,通过两个条件的真和假 来生成一个结果。例如与运算或运算和非运算。这里面的和是我们平时说话的和,但它的含义是与 与运算流程包括循环和条件。一会我们着重学这两个,接下来我们学习变量的语法结构。关于变量是什么,这里不过多解释,大家可以 查阅相关资料。在 l u v 中直接定义的是全局变量,前面加上 logo 定义的是局部变量。变量需要先定义后使用,否则的话 变量的值会是 new。 关于变量,我们掌握这些即可。接下来我们讲解函数。函数是对一系列工作的一些封装,比如说之前提到的榨果汁,我们用榨果汁三个字就可以代表整个榨果汁的流程,但是 每一次榨的不一定是同一种水果。所以说在榨果汁的这个函数中,我们还要提供一个选项来决定内部的流程使用的是什么样的水果。那么这个选项就是函数的参数 scope, 这是函数定义的格式。蓝色的部分是主要的结构体,首先要有一个 fiction 作为开头,摁的作为结束。在 fiction 后面有一个函数的名称,也就是说榨果汁后面是一个括号,括号里面可以传入 任意多个参数,可以是水果一,水果二。在函数前面有一个可选修饰,它是用来定义函数是全局的还是局部的。 return 是函数的返回值,通常会返回该函数的运行情况和运行结果。例如我们会返回两个部分,一是果汁榨成功了,第二是把果汁端出来,函数部分就降完了。


哈喽,同学们好,我是小燕老师,欢迎来到迷你世界的撸啊课堂。下面我们一起来回顾一下上节课学习的内容。 上节课我们继续学习了自定义 ui 管理的相关知识。首先我们学习了远近的显示与隐藏的接口,并用这些接口制作打地鼠的游戏。接着我们学习了远近的旋转方法,并制作了时针、 分针还有秒针,组合成一个模拟时钟。最后老师还展示了原件移动的效果,这个效果可以通过设置原件位置来实现, 同学们有没有做出来呢?现在我们就一起来看一下上节课留下的两道小作业吧。第一个作业是使原件左右移动,碰到屏幕边缘 会朝相反方向移动。我们一起来看一下这道题怎么做。要完成这道作业,就需要让原件移动,而一个原件在移动的时候,实际上就是坐标发生的变化。因此我们要先来认识自定义 ua 的坐标系统。 之前我们学过地图里的三 d 坐标,现在的自定义 ui 界面不是一个三 d 空间,而是一个二 d 的界面,所以他只有两条坐标轴,也就是 s 轴和 y 轴。 在屏幕的左上角, s 坐标和 y 坐标都是零。往右移动, s 坐标增大,往下移动, y 坐标增大,这里的坐标单位是像素,比如往右移动一个像素,那么原件的 s 坐标就会增加。一、原件的坐标是以左上角的点为基准的, 不管原件有多大,原件的坐标都是他最左上角的点的坐标。另外,我们在屏幕左上角继续往左或者往右移动原件的时候,原件也有可能超出屏幕外,这时二 d 坐标就是一个负数, 当然我们也可以在屏幕边缘继续往右或者往下移动原件,这时二 d 坐标的值会超过屏幕的大小。好了,理解了二 d 坐标之后,我们就来实现这个效果吧。考虑到有多人游戏的情况,我们先把玩家迷你号存在 playerleister 里面, 接着我们来设定原件的初始属性。一开始我们把原件的 s 号外坐标分别设置为六百和三百,原件会在这个位置出现,接着我们来设定原件的 动速度,这里我们就设置为十五,要注意这个速度只是原件横向移动的速度, 我们要让原件不停移动,就要让原件的坐标不停的发生变化,所以这里我们要来注册一个游戏运行到某秒的监听器, 接着我们来定义对应的函数。 考虑多人游戏的情况,我们先便利 刚才我们设定了原件的 s 号 y 坐标变量,现在我们就去自定义 y 管理接口,找一下设定原件位置的接口吧。我们看到第十一个设置原件位置,我们点进去看看, 他总共需要五个参数,分别是玩家的迷你号,界面 id、 软件 id, 还有要设置的 s 坐标和 y 坐标,我们复制下来, 现在我们是在 released 连带器内部,所以玩家迷你号就是变量 d 界面 id, 我们已经存在全局变量 uiid 里面了。接下来我们就来取原件 id, 这样子我们就可以把原件的坐标设置为我们刚才设置的 s 毫弯变量的值。不过现在这个原件是不会移动的,要让原件移动起来,就要改变原件的坐标,我们现在所在的事件是不停触发的, 只要我们每次设定位置之前改变坐标,那么原件就会发生位移。现在我们让原件向右移动,向右移动的时候 是 s 坐标增大,增大的值刚好就是横向移动的速度。 好了,现在我们去运行一下试试看吧。 哎,我们看到现在原件果然一直往右移动了,不过移动到屏幕边缘的时候,原件直接就一去不回了,接下来我们再让原件反弹回来吧。 要让原件反弹回来,就要判断原件的坐标是不是到了边缘,同学们可以把原件移动到屏幕的边缘,然后打开原件的属性,查看边缘的坐标。这里老师已经提前取好了坐标了,左边 边缘的坐标就是负十一,而右边缘的坐标就是九百一十,我们拍段 s 小于等于负十一或者大于等于九百一十的情况, 这时说明原件碰到了边缘了,我们就要让他反弹回来。当一个物体发生反弹的时候,速度就会变成相反的方向。 假如现在的速度是十五,我们把速度改成负十五,速度的方向就是和原先的方向相反了。当然如果现在的速度是负十五,我们就要改成十五,我们可以让 sb 乘以负一,这样 sb 的大小不变,符号就会变成相反的。 好了,我们去运行一下试试看吧。 哎,我们看到现在我们确实实现了这个反弹的效果啦,那我们就完成了第一道作业啦。接下来我们来看一下第二道作业,使原件斜向移动,碰到屏幕边缘会朝相反方向移动,我们一起来看一下这道题怎么做。 其实当原件斜向移动的时候,可以看成他在 s 轴和歪轴方向都发生了移动,那么速度也分解成 s 轴的速度,还有歪轴的速度。我们增加一个 ysb 的变量来表示歪轴的速度,同样设置为食物。 刚才我们把 s 轴的速度叠加在 s 坐标上,现在同样要把 y 轴的速度叠加到 y 坐标上。 最后由于是斜向运动,原件有可能碰到上边缘或者是下边缘,我们还要判断原件的歪坐标是不是小于等于上边缘的歪坐标,或者是大于等于下边缘的坐标。 这种情况下我们同样要改变歪轴速度的方向。好了,我们去运行一下试试看吧。 我们看到远见确实 斜向移动了,而且碰到每个边缘的时候都会反弹,那我们就完成了第二道作业啦。 好了,我们完成了上节课的作业,接下来就来学习这节课的新内容吧。今天我们要学习第二单元一 y 功能实力,利用此地一 y 功能,我们可以在游戏中制作功能强大的一 y 组建,我们将在第二单元学习这些一 y 组建的制作。 第二单元我们分为四节课,今天我们要开始学习第一节课。那在开始学习之前,我们先来看一下米斯拉的烦恼吧。 尼斯拉上次制作了一个坐骑生存地图,在这个地图里面,玩家可以骑上自己点击的生物,并且自由控制坐骑移动和飞行。尼斯拉想在这个基础上 加入坐骑发射投资物的功能。代码都写好了,却发现在移动端没有多余的按键可以控制坐骑发射投资物,那怎么办呢?今天我们就用自定义 y 来帮助李斯拉实现这个效果吧。 在终极上第十六课的时候,我们制作了万能坐骑的功能,玩家可以骑上任何生物,控制生物的朝向,前后左右移动,跳跃还有飞行,我们可以在之前的代码基础上继续编写。 之前我们没有考虑多人游戏的情况,现在我们可以先创建一个 player list 来支持多人游戏的情况,使每个玩家都能提上坐骑。 接下来我们来看玩家点击生物对应的函数,之前我们都是尽可能使用事件返回的参数,现在这样做的好处就体现出来啦,即使是多人游戏,事件返回的也是触发这个事件的玩家迷你号还有生物 id。 这个函数里面调用的两个接口都是使用了事件返回的参数,这里不用修改也能进入多人游戏。 接着我们就要想办法把玩家迷你号和玩家的坐骑 id 存起来了,之前我们是直接定义了两个变量来存储这两个信息,可是现在不能这么做了,因为玩家有多个,所以坐骑也有多个, 而且玩家和坐骑是有一一对应的关系的,玩家只能控制自己的坐骑,不能控制别的玩家的坐骑。 要存储这种一一对应的映射关系其实是很简单的,我们熟悉的 table 就可以做到啦。我们可以把玩家迷你号作为 key, 玩家的坐骑 id 作为 very, 这样我们就知道每个玩家的坐骑 id 了。 每次有玩家点击生物的时候,我们就把事件返回的迷你号作为 key, 事件返回的生物 id 作为 w, 存到 player list 里面去。 接着我们来解决另外一个问题,那就是坐骑摔死的问题,之前可能有同学遇到过这种情况,那就是坐骑掉到地上摔死, 现在我们可以让坐骑免疫跌落伤害,避免出现这种情况。我们到艾特管理接口,找一下相关的接口,我们看到第三十四个设置免疫伤害类型,这个就是我们要找的,我们点进去看一下 这个接口需要填写三个参数,分别是要设置的生物 id, 免疫伤害的类型,还有是否开启免疫,我们复制下来。 这里我们要免疫的是跌落伤害,我们到伤害类型产量里面找一下, 我们找到这个跌落伤害,然后复制下来。 之前我们在有 新运行的过程中,会让玩家的坐骑朝向和玩家的朝向保持一致,现在要考虑多人游戏的情况,我们就要来便利, 首先取得每个玩家的朝向,然后让每个玩家对你的坐骑也面向这个方向。 另外之前玩家跳下坐骑的时候,我们会把玩家的坐骑 id 出石化,因为现在有多个玩家,我们就要以事件返回的一份发展 id 为,所以取到对应的坐骑 id, 并且把这个 id 设置为纽,表示这个玩家没有坐骑了。 最后玩家按下按键的时候,我们还要取到这个玩家的坐骑 id。 在之前的代码中,坐骑 id 是存在艾特 id 这个变量里面的,程序中也是调用了这个变量, 所以最方便的做法就是取得这个玩家对应的坐井 id, 然后把它复制给艾特 id, 我们同样可以拿事件返回的 event of 这 id 作为缩影。 玩家长按按钮试键里面也要用同样的方法取得坐骑 id。 好啦,完成了多人游戏了 逻辑之后,我们就来增加投掷物发射的按钮吧。首先新建一个界面,然后在界面的右下角添加一个泡泡球的按钮,等一下按下这个按钮的时候就让坐骑发射泡泡球。 由于接下来的代码里会涉及到自定义 ui, 所以要在 ey 的局部脚本里面编写,可以把刚才的代码复制过来。 玩家进入游戏的时候当然也要打开这个界面, 这部分代码我们已经写过很多次了,这里直接复制过来,然后把界面 id 改一下就可以了。 接着我们来注册按钮,被松开监听器, 然后我们来定义对应的函数。 首先判断被按下的按钮是不是泡泡球按钮, 如果是我们就可以让坐骑发射投掷物,坐骑应该是朝自己的前方发射投掷物的,这样子会比较自然, 所以我们可以使用获得 spawn projecto by d i r 接口来发射投掷物,这个接口需要的参数有,投掷物发射者,投掷物 id, 发射的初始坐标,发射方向的 s y z 轴,分量,还有发射速度。首先我们来确定发射者,这里是坐骑发射,所以发射者就是坐 gid 玩家的,做 gid 可以通过玩家的迷你号渠道,而玩家的迷你号就是事件返回的一份保证 id。 接着就是投掷物的 id, 这里我们写泡泡球的 id, 发射的初始坐标就是坐骑现在的坐标,我们可以使用 at gap project 来获取坐骑的坐标, 接着再做一个错误的判断, 然后我们可以使用 at face direction 来获取坐骑面相的方向, 接着再做一个错误的判断, 最后再设定速度,我们把速度设置为一百 好了,设定完所有的参数之后,我们就可以调用 word spun projecto by dir 接口了,这里要注意 y 坐标可以适当的增加一些,避免投掷物打到知己。 现在呢,我们去运行一下看一下效果吧。 我们看到现在按下泡泡球按键的时候,坐骑确实会朝自己的前方发射投掷物了,不过这个按钮是一直存在的,即使我们跳下坐骑还是能发射投掷物, 那接下来我们就把这个按钮改成动态的吧,每次玩家坐上坐骑,这个按钮才会出现,跳下坐骑之后这个按钮又会消失。现在我们回到代码, 玩家进入游戏的时候是没有坐骑的,这时按钮应该是隐藏的状态,所以在玩家进入游戏对应的函数里面, 我们要把这个按钮隐藏起来, 玩家点击生物的时候就会提上坐骑,这时就要同时显示按钮了, 而玩家跳下坐骑的时候,按钮又要隐藏起来, 好了,我们再去运行一下,看一下效果吧。 我们看到现在游戏刚开始的时候,按钮是隐藏起来的,那我们坐上坐骑, 哎,按钮果然出现了,再试试看能不能发射泡泡球,泡泡球也可以正常发射。接着再跳下坐骑, 哎,按钮又消失了,那我们就实现了动态按钮的效果啦。刚才我们已经学习了按钮的实现方法,随着游戏功能的增加,按钮的数量也会越来越多,如果我们直接把这些按钮都排列到界面上,那么界面就会越来越乱,甚至看不清地图场景。 所以当界面上的按钮变多之后,我们可以把一些使用频率没那么高的按钮放到快捷面板。这个快捷面板一开始是收起来的,当我们点击展开按钮的时候,这个快捷面板就会展示在屏幕的边缘,同时快捷面板上的按钮也会一起展示出来 时,我们就可以使用这些按钮啦。当我们使用完按钮之后,又可以把快捷面板收起来,这样子这些按钮就不会占地方了。接下来我们来学习快捷面板的实现方法。首先创建一个新界面,再导入一张图片作为快捷面板的背景, 接着调整一下背景的尺寸和位置, 接着再添加右边的展开和收起按钮,这个按钮是一直跟着背景同步移动的,我们可以把这个按钮设置为背景的资源键,同样调整一下尺寸和位置。 最后再添加面板上的功能按钮,同时调整属性。 好了,现在准备工作做好了,我们来开始写代码吧。 首先我们来创建一个变量,存放快捷面板的信息。快捷面板有两个状态,分别是打开和关闭,我们可以用 is open 来标记这个状态,一开始面板是关闭的,所以这个状态要设置为 photos。 每次面板打开或者关闭的时候,面板都会有滑动的动画效果,这里我们把移动速度设置为二十。 接着我们再创建一个子 table 来存放背景的信息,背景的信息包括背景的尺寸,面板关闭时背景的坐标,打开时背景的坐标,还有背景现在的坐标。 接下来我们还要设置展开收起按钮的信息。每次面板展开或者关闭的时候, 这个按钮的方向会发生偏转,这时他是以左上角的点作为中心旋转的,旋转之后他的位置就会发生偏移。为了修正这个偏移,我们只需要在偏移前的坐标基础上加上他的长和框就可以了。 好了,设置完面板的信息后,我们要先打开这个界面, 修改一下界面 id。 接着我们就来写展开按钮的逻辑吧。首先注册按钮被松开监听器,并注册对应的函数, 判断按下的是不是展开按钮, 如果是,那就要改变面板的 状态。当面板是关闭状态的时候,点击展开按钮就变成打开状态。反过来,假如原先的就是打开的状态,那反而要变成关闭的状态。我们可以把 is open 设置为 no is open, 这样每次都会变成相反的状态。 每次状态改变的时候,这个按钮都会旋转一百八十度,所以我们先把这个原件的 id 设置好, 在设置旋转的角度初始化为零。为了修正柜质偏移,还要重新设置这个原件的坐标, 所以我们还要设置 s 号 y 同样初始化为零。这三个参数在面板打开和关闭的时候是 不同的,现在我们来分情况讨论。首先判断面板是不是打开状态,如果是,我们就要把 s 和 y 设为打开状态时的坐标, 打开时旋转的角度和初始方向相反,也就是一百八十度。接着我们来考虑关闭时的情况,这时就要把 s 和 y 设置为关闭状态时的坐标 角度,又要恢复初始的角度,也就是零度。好了,设置完这些信息,我们就可以设置按钮的位置,并且让按钮旋转对应的角度了,当然背景一 动的时候,他上面的紫圆键都会被带动。接下来我们再让面板的背景移动起来吧。首先我们注册游戏运行到某秒监听器,并且注册对应的函数。 面板移动的时候也是分层打开和关闭两种情况。 当面板变成打开状态的时候,我们判断他现在的 s 坐标是不是比完全打开时的 s 坐标要小, 如果是说明他还没有移动到位,那就要让他慢慢往外边移动,每次都要把现在的坐标增加一定的数量,这个数量就是一 动速度。接着我们设定一下原件 id, 再设定 s 坐标和 y 坐标,这两个坐标就是背景现在的 s 和 y 坐标, 最后就可以设置背景的位置了。接着我们再来考虑关闭状态的情况,当面板变成关闭状态的时候,我们判断他现在的 s 坐标是不是比完全打开时的 s 坐标要大, 如果是说明他还没有移动到位,那就要让他慢慢往里面缩,每次都要把现在的坐标减少一定的数量,这个数量就是移动速度。同样的再设定 原件 id 和坐标,然后设定原件的位置。好了,现在我们去运行一下看看效果吧。 哎,我们看到现在我们就实现了这个效果啦。 好了,那今天我们的内容就讲完了,接下来我们来看一下这节课的课后练习吧。第一个是在快捷面板上设置切换皮肤按钮,点击后使玩家切换成随机皮肤。 第二个是在快节面板上设置时间增加和减少按钮,点击后可以使地图时间推迟或者提前一个小时。好了,那我们今天的课就到这里了,谢谢同学们,同学们,再见。



欢迎来到 luato s 物联网小白变大神系列教程,本期为 lua 基础语法部分的第一小节, 这一节将教你入门撸啊编程,掌握撸啊开发的基础。在开始这一节的内容之前,大家需要准备好一套撸啊测试环境,比如说撸啊头 s 的在线模拟器,撸啊在线运行网页,或者是本地自行安装的撸啊运行环境。这里推荐大家用最左边的在线模拟器, 如果没有准备好,可以先暂停这个视频。好了,现在我默认大家已经准备完毕,下面就开始讲本节的内容。在学习的一开始,我们要了解一下脚本语言的运行方式, 脚本语言是从上往下一行一行来读取代码,然后一行一行来运行的,就像现在展示的这段代码,当他跑到最后一行的时候,这段代码就跑完了。 当然如果代码里调用了函数,会跳到函数中也行,不过调用的函数也是前面加载过的代码,同样也是一行一行来读去的。大家对这些内容有个基本的概念就好。 了解代码的基本运行逻辑之后,我们继续进行下面的讲解。首先要介绍一下变量这个概念,什么是变量?变量就是一个带名字的数据,比如这里有一个叫做 cont 的值,它的内容是一二三四五六。在撸啊里面,想要新建一个变量,可以使用复制语句, 只需要使用变量名等于值这个格式,就可以出现一个新的变量。我们来了解一下负值后发生了什么。当被负值的变量名不存在时,罗马虚拟机会自动新建一个使用这个变量名的变量,如果这个负值语句执行的时候,这个变量名已经代表了某个变量了, 那么这个变量的值会被更新成你传递的那个新值。复值语句还可以一次性给多个变量进行复制,不同的变量用逗号来隔开,就可以实现一次性给多个变量复制。而且呢,我们还可以把其他变量放在右侧, 把值传递给左边的那个变量。学习了这些知识,现在我要给大家出一道简单的题,请现在暂停一下这个视频,想到答案是什么了吗?我要开始公布答案了。这道题有两个解题思路,第一个方法呢是新建一个中间变量,比如说变量 c, 把 a 和 b 其中一个变量放到 c 里面,比如把 a 的值存入 c, 接下来只要把 b 的值存入 ac 的值存入 b, 这个交换就完成了。另一个方法更加直观,直接用多个变量 复制的语法就可以完成交换。如果大家还是有疑问的话,可以再看一下前面的内容,我们继续来讲新的知识点。 变量的类型,前面举的例子用的都是数值型的数据,一般我们用它的英文名 number 来表示,从它的名字我们也可以猜到这种类型是用来存数字用的,比如现在列出来的这些值 都是数值型的数据,在这里特别说明一下,零 x 开头的值都是十六进值数据,而且里面的字母 不论是用大写还是小写都是合法数据,符合路外语法的规范。为了方便大家理解和消化上面的知识,这节课就暂时只讲这一种数据类型,接下来我们趁热打铁学习一下算数运算符这个知识点。算数运算符就是对数值型的变量进行计算的符号, 图案里的算数运算符有加法、减法、乘法、除法、求余、乘密。这些运算符可以直接使用,遵循乘除法的优先级, 并且在必要的时候还可以加上括号,和我们小学数学里用的用法差不多。顺带说一下,左边的求余符号可以求出两个数的余数,你可以利用除法运算结合求余运算来进行整除计算, 这样可以保证计算完之后小数部分都是零。我们现在来练习一下吧。尝试用刚刚学习的运算符来计算一个物体的体积, 你现在可以暂停一下这个视频,想一想怎么实现题目中的要求,现在要公布答案了,这道题其实很简单,我们可以先计算出长方体的体积,把长宽高乘在一起就可以求出来了,然后 用质量除异体积,注意这里有优先级的区别,所以要加一个括号,最后存到变量 c 里面就可以了, 这样就实现了题目中的要求。本小节的最后给大家说一下如何在在线的测试环境中把变量的值打印出来,我们只要用 prin 函数就可以了,如果有多个变量,用逗号分隔开来就行。大家可以在测试环境里自己复习一下这个小节的知识。 好了,本小节的视频就到这里,大家如果有什么想问的,可以在弹幕或者评论区进行留言,如果觉得自己没有什么疑问,也可以去评论区看一看,没准会有人讲其他的知识点,感谢观看本视频,欢迎关注!

欢迎来到撸啊头 s 物联网小白变大神系列教程,本期为撸啊基础语法部分的第二小节,上一节的内容我就不再帮大家复习了,直接开始本节的内容。这一节我们要学习这几个知识点,两种新的数据类型,一种是 new 类型,另一种是布尔型, 然后会附带讲解布尔型的逻辑运算服知识。当大家掌握了这两个知识点之后,到下一节课的时候,我们会使用分支判断语句把这几节的内容都串起来, 和上一节一样,如果有不懂的地方可以发弹幕或者在评论区留言提问,会有人来解答。我们先来讲一下尿类型, 尿类型只有一个可能值,就是尿。所有没有声明过的变量,他的值都是尿。尿一般用来表示这个变量是空的。 看到 new 我们就知道这个变量不包含任何数据。当然如果某个变量已经有数据了,我们也可以手动把它的值复为 new。 洛尔虚拟机会自动清理掉这个变量占用的资源。了解了你有类型,我们再来学习一下布尔型。布尔型有两种可能值,一种是处,另一种是 force。 这两个值就是我们平常在逻辑上所说的真和假。同时波尔形也有自己的几个运算符,分别是与或和非三个运算符,他们的计算规则和平常的逻辑也差不多。 我们先给大家演示一下只有处和 force 时,计算结果是什么样的。与运算符只有前后两个值都是处的时候,结果才是处,只要其中有一个 force, 那结果就是 force。 货运算符只要有一个是处, 那么结果就是处,除非两个都是 force, 结果才是 force。 非运算符的计算就是直接反转运算结果,把处变成 force, 把 force 变成处。现在暂停一下视频,尝试自己进行不二运算,然后打印出结果看看吧。 试过了吗?如果你真的试着运行了上面的代码,会发现一个问题,那就是第二个 print 输出的结果是 new。 为了解释输出这个结果的原因,我们还需要学习另外一项新的知识点, 就是其他类型和布尔型在逻辑运算中的等价关系。在逻辑运算中,只有 force 和 new 这两个变量表示假的含义,而其他所有的值,包括我们现在还没有学到的其他类型,都代表着真这个逻辑。并且在撸啊中, and 和 or 的运算有一种特殊的规则,实际上 这两个运算符会根据前一个值的真假,直接返回前一个值或者后一个的值,这样计算得出的结果和我们之前介绍的计算方法是完全一样的, 你可以自己暂停视频来验证一下是不是一样。所以我们前面列出的代码可以按照这个规则直接推导出输出结果,把 abc 的值都带入公式,按顺序计算,就可以得出正确的结果。好了,本节内容到这里就结束了, 如果你对本节有疑问,可以在弹幕或者评论区提出来,欢迎关注本账号,我们下一小节再见!

哈喽,同学们好,我是小英老师,欢迎来到迷你世界的撸啊课堂。下面我们一起来回顾一下上节课学习的内容。 上节课我们继续学习了自定义 ui 的具体应用。首先我们学习了成绩的概念,并使用数结构来表示数据的成绩关系,利用这种数据结构,我们实现了多级菜单的数据管理。好了,回顾完上节课的内容,我们一起来看一下上节课留下的两道小作业吧。 第一道作业是制作完整的多级菜单,我们一起来看一下这道题怎么做。上节课我们已经把完整的菜单数据录入程序了,但是光录入数据还不行,我们还要复制按钮原件,同样的我们要连续的复制,然后把这些 按钮放在一起,现在我们先去运行一下试试看吧。 同学们观察一下,当我们点击生物菜单的时候,确实出现了动物和怪物两个紫菜单,但是这两个紫菜单在最下面,这样子看起来很不协调。接下来我们就来做紫菜单位置的金融吧。首先先回到代码, 上节课我们初始画列表中的按钮的时候,分别设置了每个按钮的 s 坐标和 y 坐标, s 坐标和菜单的深度有关系, 这部分逻辑在多级菜单仍然是兼容的,但是歪坐标就不兼容了,我们现在要在上一级菜单的歪坐 目标基础上,再加上紫菜单的位置偏移,这样才是菜单的真实高度。首先我们要取得这个菜单的 sdq, 也就是兄弟序号,用来计算紫菜单的位置偏移, 因为紫菜单是在复节点的基础上发生偏移的,所以还要知道复节点已经发生的偏移,当然复节点也可能有自己的复节点,我们可以把它叫做组复节点。 副节点本身也是在主副节点的基础上发生的偏移,而主副节点又是在真主副节点的基础上发生的偏移,我们需要一直追溯这个节点的祖宗,直到根节点。要做到这一点,首先我们 需要把这个节点的副节点需要给记录下来, 只要复解点是存在的,就重复循环。 每次在已经记录的节点的兄弟序号基础上再增加负节点的兄弟序号,我们可以使用负节点的序号来取得负节点的数据,负节点的序号就是变量哎。 如果复节点的兄弟序号是一,说明复节点在同级菜单的最下面,不需要偏移。当复节点的兄弟序号是二的时候,只需要往上偏移一个单位,因此偏移的单位永远是比兄弟序号要小一,这里还要再减去一。 最后把 i 重新复制为复节点的复节点, 这样下一次循环的时候就可以取到主副节点的数据,这样一直循环下去,直到哀不存在的时候, 说明已经偏离到了根结点了,就会自动退出循环。这段代码很简短,但是其中里含的逻辑比较多,同学们要好好的消化哦。 现在的 seq 是便利到根结点累加起来的,而不是直接从迭代期的节点中取到的,所以别忘了把 seq 前面的 v 去掉好了,我们去运行一下试试看吧。 现在紫菜单的位置确实是在上一级菜单的基础上发生了偏移, 但是当我们收起主副菜单的时候,只有副菜单收起来了,而紫菜单并没有收起来,接下来我们再来解决这个 bug 吧。 收起和展开按钮是发生在玩家双开按钮的时候,所以我们要改写一下这部分的逻辑。 上节课我们定义了阿迪塔函数来完成节点数据的刷新,我们只刷新了节点的紫元件数据,并没有刷新紫元件的紫元件的数据。现在我们来从 写这部分逻辑吧。首先把被点击的按钮的 is es 属性设置为相反的状态,这样展开的按钮点击之后就变成收起,收起的按钮点击之后就变成展开的。 接着我们要便利这个节点的节点, 判断现在是展开状态还是收起状态。 如果是转开状态,只需要把此原件展示出来就可以了,可以把此原件的 so 属性设置为处。 如果是收起状态,那就要把这个紫元剑以及他的所有后代都收起来。现在我们还不知道怎么做到这件事,那就先调用阿迪塔函数,让阿迪塔函数来完成这件事情。 上节课我们写的阿贝塔横竖不能实现这个功能,现在我们来改写一下。 首先明确一下这个函数的功能,这个函数要传入两个参数,一个是乘积菜单的推波数据,另一个就是要隐藏的菜单序号,当这个菜单隐藏的时候,他的所有纸 也会一起隐藏。刚才我们使用这个函数的时候是在确定按钮收起的时候,但是为了函数的通用性,我们还是要检查一下床入结点的复节点是不是展开状态?首先取到床入结点的复节点, 接着判断复节点是不是收起状态, 只有负节点是收起状态才进行后续的逻辑。首先我们当然要把传入节点的 ses 还有 isso 都设置为 fos, 这样就可以把传入节点 隐藏起来,并且设置为收起状态。 接下来我们要收起传入节点的所有后代。首先判断传入节点有指节点,如果没有指节点,那就不需要继续进行下面的逻辑了。 接下来就是最难的一步,我们也许可以便利传入节点的所有此节点, 但就算做到了这一点,子节点的子节点也要便利啊,甚至子节点的孙子节点也要便利,这样下去就没完没了了呀。我们一定要想一想有没有更简洁的方法。别 交集,我们还是回到最初的思路,先便利以传入节点的所有指节点吧。 我们还是可以像从前一样,假装已经有这个函数来帮助我们便利所有后代。这个函数要传入两个参数,一个是乘级菜单的 table 数据,另一个就是要隐藏的菜单序号, 当这个菜单隐藏的时候,他的所有子孙也会一起隐藏。同学们仔细回忆一下,这个描述是不是似曾相识呢? 没错,这个描述跟刚才阿迪达的功能是一模一样。我们是不是要在定义另外一个一模一样的阿迪达函数呢?完全是没有必要, 在编程中这种纯粹的重复性工作肯定是有更好的办法来简化的。既然 update 函数就是用来实现这个功能的,那我们就直接掉用 update 函数好了。 这里同学们可能有疑问,那就是现在我们在 update 函数内部, update 函数都还没有写好,就这样自己调用自己不会出问题吗? 其实这是程序的一种基本思想,这种基本思想就是抽象化。还记得之前我们总是假装一个函数存在,先调用这个函数,回过头再去定义这个函数。 在我们便用一个函数的时候,其实不用关心这个函数的内部的细节,而是把这个函数当成是一个抽象的接口, 这个接口传入某些数据就能返回另一些数据,或者实现某个功能,在这里也是一样的。我们实际上把贝塔当成是一种抽象的概念,先不用关心啊,贝塔具体是怎么实现的,直接调用就可以了。 在程序中,自从自己调用自己的结构,我们称为地规结构,同学们可以先有个印象就可以了。 在以后的高级课程中,我们会详细学习地规的程序结构。现在我们调用了啊,低塔函数,那就要传入两个参数,第一个参数是成绩菜单的 table 数据,这个和上面传入的参数是一样的, 我们还是写 tap 就行了。第二个参数是菜单序号,我们调用 大函数是希望子节点也收起,所以第二个参数就是迭代气变量 v, 写到这里就大功告成了,同学们是不是有点惊讶,总感觉还没写完呢?其实当我们在撕掉用 update 的时候, update 又会运行一次,同样的, 第二次运行的时候又会第三次跟了贝塔,就这样一直便利自己的后代,直到叶子结点,整个过程都是自动完成的,我们不用关心程序运行的细节,那现在我们就去运行下试试看吧。 没错,现在收起菜单的时候,菜单的所有后代都会收起,那我们就修复了这个 bug 啦。 我们又发现一个新的问题,那就是展开一个菜单的时候,他的同级菜单不会自动收起,那接下来我们再来修复这个 bug 吧。 之前我们在点击按钮的时候做了三件事情,第一件事就是让按钮的展开状态变成相反的。第二件事就是便利按钮的紫菜单,让这些菜单展开或者收起。 最后一件事情就是刷新按钮的显示状态。现在我们还要再增加一件事情,那就是让这个按钮的同级菜单收起来。首先我们要确保这个按钮是展开的, 并且不是根结点, 这种情况下我们就要把他的同级菜单收起来。首先我们取到他的复解点, 再取到复节点的所有指节点,这些指节点就是同级节点,其中也包括这个节点的本身。 现在我们就可以来便利这些子结点了。 当然我们还要把自己排除在外, 每次自己展开的时候,要把兄弟节点的 is yes 都设置为 first, 这样他们就是收起的状态。 同时兄弟节点的子节点也要隐藏起来。首先判断兄弟节点有没有子节点, 如果有就便利这些直接点 对每个子节点调用阿迪塔接口,把 节点和他的后代都隐藏起来。 好了,现在同级菜单都收起来了,我们再来解决一个隐藏的问题。刚才我们是直接便利了被按下的节点的子节点,如果这个节点已经是叶子节点了,那么就不存在子节点, 这时使用迭代器就会导致程序错误,所以这里我们要先确保他有指节点。 好了,我们去运行一下试试看吧。 哎,没错,现在同级节点可以收起来了,那我们的第一道作业就完成啦。接下来我们来看一下第二道作业吧。 第二道作业是使按钮展开的时候显示镜头,收起的时候不显示镜头。我们一起来看一下这道题怎么做。 现在我们需要对按钮上的箭头进行操作,所以要在每个圆间的信息中添加箭头的 id。 按钮上的箭头是紧接着按钮的背景添加的,所以他的 id 尾数总是比按钮背景大一,我们可以在按钮的背景原件的 id 基础上加一。 接着我们来到刷新列表的接口之前,这个接口只需要处理按钮的隐藏和显示逻辑,现在还要增加箭头的隐藏和显示逻辑,如果整个按钮已经隐藏起来了,箭头也会跟着隐藏, 所以我们只需要考虑按钮显示的情况。首先我们把传入节点的箭头 id 记录下来, 接着判断这个节点是不是展开状态,同时还要确保这个节点由子节点 这时传入节点式展开的状态,他也有指节点显示出来, 那就可以显示箭头原件了。如果不满足这两个条件,那就要把箭头隐藏起来。 好了,我们去运行一下试试看吧。 哎,没错,现在箭头可以正确显示了,那我们就这样完成第二道作业啦。 好了,做完了作业,我们就来学习今天的新内容吧,今天我们要学习的是 y 功能实力的最后一节课,在开始学习之前,我们先来看一下米斯拉的烦恼吧。 尼斯拉已经使用过按钮、图片、文字这三类界面的零件了,其中的按钮比较特殊,玩家可以通 点击按钮来产生交互事件。米斯拉心想有没有别的原件类型也会发生交互事件呢?答案是肯定的。输入宽也会产生交互事件,不过输入宽的交互事件和按钮的是不一样的,今天我们就来学习输入宽的使用方法吧。 首先我们往界面添加一个输入框原件,然后运行一下看看效果吧。现在我们点击这个原件,可以发现原件上出现了输入框,我们可以在上面输入文本, 接着再点击一下其他地方,这个输入框消失了,同时原件上的文本内容就变成了我们刚才输入的内容了,这就是输入框的用法,刚才我们点击屏幕上的其他地方的时候,实际上就是让输入框失 去了焦点,这个就是一个用户交互事件,接下来我们来看看这个事件会返回哪些参数吧。 我们来到界面事件,最后一个事件就是自定义 ey 输入框失去交点事件,他除了像按钮事件一样返回玩家迷你号界面 id 和原件 id 之外,还会返回空腾参数, 这个参数会记录下玩家最后输入的字符创内容。了解了这个事件,我们就来制作一个输入框小功能,让玩家输入零到二十三,地图里的时间会随着玩家输入的数字进行同步切换。 现在我们回到代码这里老师在开头定义了空腾变量,用来存储输入宽,上一次显示的内容地图里面默认是十二点,所以空腾 要初始化为十二,除此之外还有打开界面和失去焦点的监听器函数,现在我们就来玩上失去焦点的函数吧。首先玩家输入的数字其实是一个字幅串,我们要先把它转换为数字类型, 玩家输入的不一定是数字,而且这个数字也不一定是在零到二十三之间。当玩家输入数字之外的其他字符的时候,对字符串使用 to number, 横竖就会返回你了。 所以这里我们要确保 r 是存在的,而且在零到二十三的范围内。 这时我们就可以把地图的时间设为玩家输入的时间, 同时把这个时间转换为字符上存储在空腾中。下次玩家输入无效的内容的时候,就可以使用空腾来替换输入框的内容了。 接着我们来处理无效内容的逻辑,当玩家输入无效的内容时,要提示玩家重新输入, 同时用空腾中的字幅串来代替玩家 加输入的内容。好了,我们去运行一下试试看吧。 现在我们输入零到二十三的数字,地图的时间就会同步切换啦,接下来我们来试试看不输入数字会怎么样。 我们发现这个输入没有记录下来,而是马上被上一次的数字替换掉了。接着我们来输入超过零到二十 三这个范围的数字吧, 可以发现这个数字也被上一次的数字替换掉了,那我们就实现了这个输入框的功能啦。 接下来我们来实现按钮拖拽的功能。在游戏开始之后,按钮的位置就被固定下来了, 如果王家族的按钮位置不合理,也没有办法改变按钮的位置,我们不妨来制作一个按钮拖拽的功能。 玩家可以点击右上角的状态按钮,指方向键显示出来,这时就可以移动按钮的位置,等按钮移动到自己满意的位置的时候, 就可以再次点击右上角的状态按钮,把方向键隐藏起来。接下来我们就来实现这个效果吧。首先我们要在按钮上添加状态 按钮,还有上下左右四个方向键,这些都是作为按钮的紫元键。做好了准备工作之后呢,我们就可以来开始写代码啦。 首先我们把按钮 id 还有右上角的状态按钮 id 分别存储到变量里面,接着我们再把四个方向键的 id 存到一个速度里面去。 同学们回忆一下刚才状态按钮的外观,有手指和打勾两种状态,这其实是通过替换按钮上的图案来实现的,而每种图案也有自己的 id, 我们把这两个 id 存到一个数字里, 接着再设定按钮的移动速度,还有玩家的信息列表, 每次玩家进入游戏的时候,除了打开界面,还要出示化玩家的信息,这些信息就包括按钮右上角的状态,还有按钮的坐标。一开始右上角的图案是手指,也就是第一个状态, 设置了数据之后就可以刷新按钮的显示状态了,可以调用 update 传入玩家迷你号和数据列表,等一下再来定义 update 横竖。 接着我们来写按钮被松开的函数。首先记录松开按钮的玩家迷你号, 接着判断松开的按钮是不是状态按钮, 如果是,那就把状态按钮换成相反的状态,并且刷新按钮显示状态。最后我们再判断松开的按钮是不是方向键。 首先便利方向键 id 列表, 找出玩家按下了哪个方向键, 然后根据玩家按下的按钮相应的改变坐标。 最后同样要刷新一次按钮的显示状态。 现在我们就可以回过头来定义 update 弹函数了。 首先我们要设置按钮的位置,然后再用 set texture 函数设置状态按钮的图案,最后再根据状态按钮的图案决定方向键是隐藏还是显示。 好了,现在我们去运行一下看看效果如何吧。 没错,我们实现了按钮的拖拽功能啦! 接下来我们来学习面相过程和面相对象的概念,老师会通过做蛋糕的例子让同学们理解什么是面相过程,什么又是面相对象。 平时啊,老师没事在家的时候会自己做蛋糕,这是我整理的做蛋糕的八大基本步骤,经过这些步骤,我们就能吃上香喷喷的蛋糕啦,不过做蛋糕还是挺累的呦,要是我们有一台自动做蛋糕的机器就好了。其实现在真的有这种做蛋糕的机器, 那现在我们就讲是真的有这样一台机器,这台机器刚好就是可以用 r 来编程,只要我们用代码给他下指令,他就能按照我们的指令自动做蛋糕了。那么我们的代码要怎么写呢? 这台机器肯定也会像迷你世界的引擎一样,提供很多做蛋糕需要的撸啊接口,比如搅拌 呢,加牛奶啊,加面粉啊等等,我们先忽略这些细节,用代码表示一个基本结构就可以了。在这段代码中,我们定义了做蛋糕这个函数, 只要对用这个函数就能制作蛋糕。在做蛋糕的函数内部,又包含了八个子函数,分别是打蛋白液加白糖、打蛋白糊、打蛋黄糊加油,还有牛奶加面粉,混合蛋白和蛋黄,还要烤蛋糕八个函数。 至于这些紫函数内部还可以继续分解成各种接口,这里我们就不必关心啦。 在这个过程里面,我们实际上是把做蛋糕这件事情一步一步拆分,然后按照步骤一步一步完成的,最后呢,整件事情就做完啦,这就是面向过程的编程方法。首先分析出 解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个个依次掉油就可以了。理解了面相过程的含义之后,我们再来理解面相对象的含义。 我们同样举做蛋糕的例子,这回我们换一个思路来做蛋糕。假设你突然获得了一种魔法,可以让打蛋棚、分档器、面粉筛、电子秤、量杯、蛋糕膜、打蛋器、烤箱变成具有自己思想的精灵, 这些精灵可以自己搅拌,加面粉、烤蛋糕,他们各司其职,流水线生产,最后做完了蛋糕。在这个过程中,我们实际上不是直接分解做蛋糕的步骤,而是把做蛋糕的各种工具对象化。这些做蛋糕的精人有自己的 动习惯和能力,比如打蛋器有大小、有重量等属性。打蛋器还有功能,只要打蛋棚里面有东西,打蛋器就会开始旋转。烤箱也是这样子的,他有温度、倒计时等属性,他的功能是自己内部放入东西的时候可以关上烤箱门, 打开开关。在这个解决问题的过程中,我们实际上把做蛋糕的每种工具都出现出一个个的对象,由这些对象实现我们想要的功能。这种编程方法就叫做面相对象啦。 那么面向对象有什么好处呢?同学们想一想,在面向过程中,假如这台机器故障了,我们就要每个步骤都排查一遍,修理机器的人一定要懂得做蛋糕的所有步骤,这样才能确定问题出在哪里,并且成功修好。但是在面向对 对象中,哪个工具坏了,只要修这个工具就好了。比如烤箱坏了,我们只需要请会修烤箱的人来维修就可以了,打蛋器坏了也只需要修打蛋器就可以了。甚至我们想用新款的烤箱, 也可以从别人手上买一个烤箱的对象来替换,这就是面相对象的优势。在大型工程里面,面相对象可以使程序模块之间相互依赖的程度变低,这样就便于后期的代码维护和测试,以及多人之间的协作啦。 关于面相对象,我们在后面的课程中还会详细的学习,同学们先理解这个概念就可以了。好了,那最后就又来到了我们这节课的课后作业环节了, 今天的第一个作业是使用输入框切换玩家的皮肤,第二个作业是使用输入框使玩家传送到某坐标位置。那我们今天的内容就到这里啦,谢谢同学们!同学们,再见。
