特殊机制
前言
恭喜你,在历经了重重困难之后 终于——来到了特殊机制的教学 不过要提前声明的是: 特殊机制的制作不比角色操纵简单! 做好心理准备 认真观看教学吧!
制作角色爬墙机制!
在角色操纵的教程中 不出意外的 你学会了 角色通过下移来侦测是否在地面上 很好,现在我们需要继续用这个小技巧
我们本节课要实现的有以下几个功能:
- 如果,角色离墙很近时又按下了左移动键,那么,角色会被添加一个“贴墙”的状态
- 如果,角色落地或离墙体较远时,那么,取消贴墙状态
- 如果角色处于贴墙状态时,那么,可以按下跳跃键进行跳跃
有了这些思路,我们就可以进行制作啦
贴墙
当,角色按下移动键时
让角色向移动键方向
移动一小段距离来判断是否应该“贴墙”
并且我们用一个临时变量来储存信息
当然,贴墙也分向左或向右贴的 所以我们用 “向左”“向右”“不贴墙” 三个变量数据来储存状态
目前,角色即使落地也不会解锁贴墙状态
是因为,没有添加取消的判断
所以,让我们来做落地后的取消状态
与上面类似
取消贴墙是自动取消的
所以取消贴墙的执行就不需要加上条件触发了
接下来就是制作
角色在离墙体过远时取消贴墙状态
取消贴墙
拿左边举例
在处于向左贴墙状态时
如果离左边的墙较远就可以取消贴墙状态(如图)
同理向右也一样
但注意,向右爬墙的话就需要向右判断离墙的距离
不过目前我们的脚本有点乱
脚本太乱了可能会不方便后期维护与整理
那该怎么办呢。。。
(此时皮卡丘跳了出来)
聪明聪明d皮卡丘:
“哎,溯老师,难道你忘了吗?我们有注释扩展啊!”
哦,对啊!
我们可以添加一个注释扩展!
加上了以后,整体大概长这样
需要注意的是:
以下这个积木块应该放在切回原来的水平拉伸的上面
下一步,就是改变“贴墙”状态
首先,除了“不贴墙”
其他状态都应该有一个缓慢下落的效果
但是,观察“平行棱镜”可以发现 在爬墙过程中 是否按下所爬方向的移动键 会造成下落速度不一样
所以,再让我们进行一些更改: 如果,是向左贴墙 那么,按下移动键和不按下移动键的下落最大速度不一样
同样的,我们把向右的也加上
但
先别急着将积木块加入循环
我们还要制作贴墙过程中的反墙跳功能
反墙跳
哎,皮卡丘,我问你一个问题(突击检查)
你觉得。。。要在什么情况下执行反墙跳呢?
蒙圈蒙圈d皮卡丘:
啊,这。。。你这个问题可算是难倒我了,你得让我思考一会。。。
(哎呀,刚刚走神了,可不能被溯老师发现了,昨天的鸡腿都没有了)
哦哦,我想到了!
我想到了三种可能的状态:
- 处于贴墙状态
- 按下跳跃键
- 按下反方向的移动键
你看这些符不符合溯老师你的要求呢?
嗯,很好,与我想象中的一模一样啊
既然已经知道了条件
那么制作贴墙跳就简单了
首先,贴墙跳后要取消贴墙状态
其次,需要改变角色的x、y速度
(如图)
其中的如果按下w的条件是
处于贴墙状态、向左贴墙、按下右移动键、按下跳跃键
这样,只需要在其中加入取消贴墙状态和改变x、y速度的值就ok了
同样的,把另一边也做好
(注:如果是另一边的话反墙跳时x速度的值要反着来)
可以通过以下图片检查,加了注释,方便理解~
然后就可以放入循环中了
值得注意的是,这串代码应该放在重力加速的下面
(因为贴墙动作执行后会限制y速度的最小值,所以应该在y坐标移动前进行限制y速度的值)
效果如下~
疲惫疲惫d皮卡丘:呼—可算是做完了,哎等一下。。。
以溯老师的习惯,这里不会还要增加一个反墙跳的特效吧
溯老师:哎!好 主 意,那就浅浅的加一个特效吧!
(皮卡丘倒下了)
还有特效,所以我们继续吧~
先在反墙跳的地方加上伸缩效果
粒子也不要忘了
OK,搞定! 让我们进入下一步
角色的冲刺机制!
作为一个强调灵活的游戏,冲刺可不能落下
让我们再创建一个循环
并且设置冲刺键为空格
为了增强冲击感
我们可以在角色在冲刺前增加一小段的时停
(如视频)
所以我们要一个东西来停止引擎
也就是变量控制
我们用0表示关,1表示开
然后,用一个条件判断套上 但是,现在如果引擎被关闭了 那么,角色被拉伸后也无法复原 所以,我们要把拉伸复原的引擎套在判断外面
最后,不要忘记初始化时启用引擎
继续回到冲刺部分
让我们把时停部分加上,时间控制就是3帧(0.09秒,30帧时1帧0.03秒)
震动
但。。。目前看起来效果不是很好,还能加什么呢?
皮卡丘你来说说加什么
无奈无奈d皮卡丘:“加。。。特。。。效。。。”
没错! 光线!镜头!开拍! 特效!拉伸!震动!
雷神特效的震动很完美,所以可以直接用
再把大小变化也加上(一个收缩效果)
特效和拉伸也别落下!
现在来试试效果吧!
(赞叹赞叹d皮卡丘:哇!一下子就变得有张力了哎)
有内味了是吧
但现在只要一直按住空格就会一直触发,这肯定要改
解决方法很简单:
我们只要在最后加上<等待按下空格不成立>
相当于是松开了空格键
速度
还有呢,冲刺肯定要有速度变化对吧
我们先来学一个新的技巧
众所周知
棱形积木(布尔值)可以输出两个值:false或true
因为sc是由Squeak开发的 所以 false与true 也可以代表 0与1
就像开关一样:0是关,1是开
由此我们可以实现以下效果
同理,w和s也可以
如果此时再加个x33,想想会发生什么?
同样的,这只能输出3个值:-33、0、33
这很好,所以我们能用它做出以下操作
哎~没想到吧 它确实可以这么用! 让我们把它放入冲刺程序中看看吧
注:里面是将临时变量设为而不是增加,增加也没问题,看个人喜好~
充能
现在还需要加入冲刺条件,也就是充能
当能量被消耗完了后,需要补充能量才可以继续冲刺
不然就可以直接左脚踩右脚飞天了!
不过呢。。。在做之前,先让我们的皮卡丘想想,怎么样才能充能?
皮卡丘:“啊?又叫我来上班了啊
我觉得吧。。。落地、反墙跳、跳跃 这三种情况可以充能”
可以的,那么就按这个逻辑继续吧
一样的,我们要设定一个充能变量
0表示未充能,1表示已充能
再让我们在冲刺部分加入能否冲刺的判断
并且冲刺后变为未充能状态
然后是充能的途径: 1.落地充能
2.反墙跳充能
3.跳跃充能
但是,现在还没办法直接看出角色有没有充能
这对玩家来说是不友好的
所以,我们可以通过充能后角色的颜色变化来体现是否充能
让我们再创建一个循环并设置一个变量
充能时变量为充能,未充能则为未充能
这样有什么用呢?让我们往下看
(点击绿旗时记得初始化一下私有状态)
这样也能实现颜色的变化效果
这时 在一旁喝咖啡的皮卡丘 就要问了
偷懒偷懒d皮卡丘:
“哎呀为什么要这么复杂呢?直接一个“如果 那么 否则”不就好了嘛?
还要浪费一个变量,溯老师可真不。。。”(被捂嘴)
大家再仔细看看,有没有发现什么?
从 “充能=1不成立” 到 “充能=1”
其中的 “如果私有状态=未充能” 只执行了一次
这就是和只用 “如果 那么 否则” 的区别
这样的意义何在?
这样子可大有好处
我们可以在里面加入更多的效果触发
每一次状态改变才会执行一次的那种
(x-y)/z 的原理前面讲过,就不细说了 概括来讲:可以让亮度的值不断趋近于0 然后,把它加入循环 并且,在每次充能改变时加入亮度变化就好啦
再冲刺部分也加入亮度变化
效果浏览⬇︎⬇︎⬇︎
拖尾
但是。。。感觉还少了什么呢?
抢答抢答d皮卡丘:“特效,肯定是特效!”
没错!是拖尾!(啊?)
当然是在冲刺的时候加上拖尾啦
想要拖尾,先让我们创建一个广播信号
因为克隆拖尾不止一个 也不是瞬间克隆完的 如果放在冲刺部分中会消耗运行的帧数 而用广播消息就相当于多开一个线程了 可以避免这个问题了 现在,将广播放在冲刺中
接着,放置一个接收信号
但要注意:
因为,克隆体会运行一切帽子积木
所以,克隆体也是能接受广播的
因为,我们只需要让本体克隆拖尾
所以,先要判断其是否为本体,再进行下一步操作
还记得我们的尾迹造型吗?
现在,是时候让他开始干活了!
先别急着试,尾迹属于特效
我们先去写尾迹的代码
先将尾迹的大小和主角的大小设为一样
(注意输入框的造型名称要正确)
然后是消失,让它逐渐变小变透明
(因为初始大小是85,所以重复10次缩小8.5就可以归零了) 还要注意的是: 尾迹特效不能盖在主角上面 所以,要对尾迹的图层进行限制
来看看效果吧
崇拜崇拜d皮卡丘:“哇哇哇,真的是太有冲击感了,溯老师真的是太厉害了!”
课堂小结:
本节课我们制作了角色爬墙机制
从多个角度完善了我们的作品,比如说:
- 贴墙状态:当角色靠近墙壁并按下对应的移动键时,添加“贴墙”状态。
- 取消贴墙状态:角色落地或远离墙壁时取消贴墙状态。
- 反墙跳:处于贴墙状态时,按下跳跃键和反方向移动键即可执行反墙跳。
- 制作角色冲刺机制
- 冲刺操作:设置特定按键(如空格键)用于冲刺,并在冲刺前增加时停效果。
- 速度变化:通过布尔值控制速度增减。
- 充能系统:引入充能机制,允许通过落地、反墙跳或跳跃来充能。
- 视觉反馈:通过角色颜色和亮度的变化来显示充能状态。
- 拖尾效果:利用广播消息和克隆体产生拖尾效果。
剧透剧透d皮卡丘:
在下节课,我将会给大家带来一个非常重要的东西,那就是。。。(被捂嘴)
溯老师:
好了,我们今天的课程就到这里了
大家记得回去自己动手尝试一下
愣着干嘛!
快睡觉啊!
赶紧开启你的学习之路吧!
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=sumiu-jump/sumiu/Lec02a&type=comment"
title="{跟着溯μ制作平台跳跃游戏 02a}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>