粉丝2440获赞8189



今天来看看粉丝造门制作的保护鸡汤这个游戏,这是用创游做的全触屏横版游戏, 瞬间感觉高大上了有木有?把你做的游戏名字发在评论区,我会抽取幸运粉丝的游戏做视频推荐哦!左下角进入抖音小游戏,打开创游编辑器。

哈喽,同学们好,我是小燕老师,欢迎来到迷你世界的撸啊课堂。下面我们一起来回顾一下上节课学习的内容。 上节课我们继续学习了自定义 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 和坐标,然后设定原件的位置。好了,现在我们去运行一下看看效果吧。 哎,我们看到现在我们就实现了这个效果啦。 好了,那今天我们的内容就讲完了,接下来我们来看一下这节课的课后练习吧。第一个是在快捷面板上设置切换皮肤按钮,点击后使玩家切换成随机皮肤。 第二个是在快节面板上设置时间增加和减少按钮,点击后可以使地图时间推迟或者提前一个小时。好了,那我们今天的课就到这里了,谢谢同学们,同学们,再见。

迷你世界更新自制界面了,可以在游戏自定义按键界面和图标,还可以自定义 ui, 文字 还有很多种,预计将在七月十四日与家园玩法一同更新,接下来请自行观看, 玩的有点快,可以暂停 嘿!

哈喽,同学们好,我是小英老师,欢迎来到迷你世界的撸啊课堂。下面我们一起来回顾一下上节课学习的内容。 上节课我们继续学习了自定义 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 来编程,只要我们用代码给他下指令,他就能按照我们的指令自动做蛋糕了。那么我们的代码要怎么写呢? 这台机器肯定也会像迷你世界的引擎一样,提供很多做蛋糕需要的撸啊接口,比如搅拌 呢,加牛奶啊,加面粉啊等等,我们先忽略这些细节,用代码表示一个基本结构就可以了。在这段代码中,我们定义了做蛋糕这个函数, 只要对用这个函数就能制作蛋糕。在做蛋糕的函数内部,又包含了八个子函数,分别是打蛋白液加白糖、打蛋白糊、打蛋黄糊加油,还有牛奶加面粉,混合蛋白和蛋黄,还要烤蛋糕八个函数。 至于这些紫函数内部还可以继续分解成各种接口,这里我们就不必关心啦。 在这个过程里面,我们实际上是把做蛋糕这件事情一步一步拆分,然后按照步骤一步一步完成的,最后呢,整件事情就做完啦,这就是面向过程的编程方法。首先分析出 解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个个依次掉油就可以了。理解了面相过程的含义之后,我们再来理解面相对象的含义。 我们同样举做蛋糕的例子,这回我们换一个思路来做蛋糕。假设你突然获得了一种魔法,可以让打蛋棚、分档器、面粉筛、电子秤、量杯、蛋糕膜、打蛋器、烤箱变成具有自己思想的精灵, 这些精灵可以自己搅拌,加面粉、烤蛋糕,他们各司其职,流水线生产,最后做完了蛋糕。在这个过程中,我们实际上不是直接分解做蛋糕的步骤,而是把做蛋糕的各种工具对象化。这些做蛋糕的精人有自己的 动习惯和能力,比如打蛋器有大小、有重量等属性。打蛋器还有功能,只要打蛋棚里面有东西,打蛋器就会开始旋转。烤箱也是这样子的,他有温度、倒计时等属性,他的功能是自己内部放入东西的时候可以关上烤箱门, 打开开关。在这个解决问题的过程中,我们实际上把做蛋糕的每种工具都出现出一个个的对象,由这些对象实现我们想要的功能。这种编程方法就叫做面相对象啦。 那么面向对象有什么好处呢?同学们想一想,在面向过程中,假如这台机器故障了,我们就要每个步骤都排查一遍,修理机器的人一定要懂得做蛋糕的所有步骤,这样才能确定问题出在哪里,并且成功修好。但是在面向对 对象中,哪个工具坏了,只要修这个工具就好了。比如烤箱坏了,我们只需要请会修烤箱的人来维修就可以了,打蛋器坏了也只需要修打蛋器就可以了。甚至我们想用新款的烤箱, 也可以从别人手上买一个烤箱的对象来替换,这就是面相对象的优势。在大型工程里面,面相对象可以使程序模块之间相互依赖的程度变低,这样就便于后期的代码维护和测试,以及多人之间的协作啦。 关于面相对象,我们在后面的课程中还会详细的学习,同学们先理解这个概念就可以了。好了,那最后就又来到了我们这节课的课后作业环节了, 今天的第一个作业是使用输入框切换玩家的皮肤,第二个作业是使用输入框使玩家传送到某坐标位置。那我们今天的内容就到这里啦,谢谢同学们!同学们,再见。


通过几分钟教大家 z b 自定义 u i 以及界面如何调整好,今天我们来讲一下我们这个软件的自定义 u i 啊,自定义 u i, 那我们现在啊 可以看到的这些东西呢,它其实都是一个 ui 界面啊,都是一个 ui 界面,那我们点开这个首选项的位置啊,这里有个配置,对不对?点开配置有个恢复自定义 ui, 我现在呢就是一个自定 ui 啊,它现在有些东西呢是没有显示的啊,是因为我们,哎,你 有这个球啊,你在这个桌面当中,你就需要拉出来个东西,然后把它生成多边形网格物体,你看我的所有的自定义 ui, 他都出来了,对不对?都出来了,那我们标准 ui 的话,这里点击恢复标准 ui, 就可以回到高 刚开始下载软件的样子了啊,就这个样子的,那如果我还继续想打开的话,那么我们可以去加载 ui, 加载啊,就是从外面导入进来啊,外面导入进来, 有的时候我们,呃自己不想设置 ui 的话,可以用其他同学或者是其他老师的 ui 啊,我们可以把他们的 ui 拿来,然后保存,点击打开好,这又出来了,对不对? 然后这个位置它有个保存 ui, 这是什么意思呢?就是我们自己呢可以去设置 ui, 设置完了过后保存出去啊,保存出去, 比如说我们这里有个启动自定义,先启动自定义,这个时候呢,我们就可以去把那个你需要的 ui 有些界面哈,我们把它放到这边来,放到这边来,比如这里的话,咱放一个这个, 哎,这个东西放到这来,再放一个存储相机啊,这个位置啊,那如何去放呢啊?我们按住 ctrl 键加 alt 键,然后拖住这个键,不松啊,不松就可以直接拖到这上面来了啊,就可以拖到上面来了。 那我们现在把这个 ui 保存出去啊,保存出去就点击这里保存 ui, 保存 u i, 比如说我们这个直接覆盖吧,好吧,然后保存已存在,是否是否替换?是啊,点击是 完了过后呢啊,完了过后呢?我们就可以,哎,存储配置记得一定一定要点这个存储配置,这样子你下次打开的时候看,每次启动 zebras 的时候非恢复此文件啊,说明你后面的话再启动 zebras 这个软件的时候 呢,他这个 ui 也是自动的,就会给你打开了,你不需要每次去打开啊,这样会比较麻烦。那我们为什么会用到 ui 呢?那像有一些命令的话,我们, 哎常用的命令的话,我们是不是每次去翻找他的话就有点麻烦,对吧?有点麻烦,所以呢,我们需要去把这个 ui 哎界面 改一下,对不对?把它放到这上面来啊,这样子的话,我们每次去用的时候呢,就会比较方便。那还有一个情况就是我们有些同学是笔记本电脑,对不对?笔记本电脑打开界面过后,他又他的这个画面呢,会比较大啊,这个图标呢,都会比较大, 比如说像这些东西啊,这里叫这什么幽灵透明等等等等,他可能是看不到的,看不到的,我这边给大家演示一下啊,比如说这里装 面啊,我们显示设置显示这这里,哎,老师有两个屏啊,稍等一下,这里啊,他有个缩放与布局啊,笔记本的话一般是百分之一百五,百分之一百五,然后这个时候呢,我们再打开 zbox 看一下 哦,这个没有什么变化啊,因为我们这个界面是够大的,界面是够大的,有的同学就记住了啊,如果是笔记本的话,我们就将这个啊缩放与布局啊,改成百分之百,改成百分之百。同样呢,如果把改成百分之百过后,还是看不太到啊,还是看不太到,那么我们就在这个, 我们把先把这个启动自己定义给关掉啊,在这个界面当中, u i 啊 u i 按钮大小,就比如说这些图标大小,我们可以去放大或者是缩小它啊,放大或缩小它,那放大了过后呢,它这个图标 标呢也会跟着放大。有的同学如果底下的图标啊是看不到的啊,看不到的,那么我们呢就把这个 ui 按钮大小啊,把它调小调小,比如说现在调到三十八啊,这是最小了, 它会显示下次启动 zebras 时将调整 ui。 说明呢,你要把它给关闭一下啊,关闭一下,关闭完了过后呢,我们再去打开啊,再去打开这个界面就可以了,这里双击好,稍等一下, 嗯,打开的话有点慢哈,稍等一下 好出来了,那现在它这个 u i 界面大小是不 就变得很小,你可以看一下。哎,变得很小对不对?变得很小,那如果你觉得你的界面这个有点小了,那同样我们可以在继续这里界面这个位置 ui, 然后把这个按钮大小调大一点点啊,调大一点点, 我用四十三吧,四十三,然后继续关掉,再打开他就是恢复这个界面就会变大啊。好,今天的这节课就到这里了。