【转载·不定期更新系列】怎样做一个平台跳跃游戏
scratch吧
全部回复
仅看楼主
level 9
-流- 楼主
【本贴转载自 Griffpatch 的 Platformer Tutorial v0.12,这个贴子是这个平台跳跃脚本的中文解释,侵删】
(这是第二个贴子,第一个贴子是精品贴,后来不知怎的顶不上来了,并且我也坑了一段时间,所以就开新贴更新吧)
准备工具:一台装有scratch的电脑和能用百度网盘的浏览器。(网盘地址楼下发)
那么,开更。
2018年11月30日 13点11分 1
level 9
-流- 楼主
二楼网盘
2018年11月30日 13点11分 2
前排提醒:坟贴勿回!
2019年03月13日 10点03分
1
2025年08月21日 05点08分
level 9
-流- 楼主
三楼
2018年11月30日 13点11分 3
PS:链接在楼上,点开回复即可
2018年11月30日 13点11分
@-流- 看不到???
2022年08月01日 14点08分
@-流- 看看
2025年08月21日 05点08分
level 9
-流- 楼主
第一节 重力
我们知道,像超级马里奥,魂斗罗,洛克人等经典FC游戏到现在的各种手游,凡是横版跑酷类游戏,那么跳跃几乎是不可少的。
在sc中,我们可以看到各种各样的跳跃游戏,但是在新手制作游戏的过程中,经常会出现这样的脚本:
但是这类脚本的效果往往很差:
抛开别的不说,单看效果,就知道这样肯定是不行的。
所以,我们需要更好的。
那么怎样做呢?
还是先来看看最基础的东西吧。
我们知道牛顿他老人家 发明× 发现了万有引力,这玩意就是让我们跳起来后落下的罪魁祸首。
既然如此,这个东西在游戏中怎样实现呢?
这个变量用来储存y值变化(在现在看来,就是循环一次下降的速度)
超级简单对吧?不懂?没关系,来看看效果,你就明白了。
那么接下来要做的,就是画一个地板。。。
可是小猫直接穿过地板了怎么办??
没关系,因为我们还没有写判断地板的脚本。
大家想一想,当小猫碰到地板后,y速度会有什么变化?
会清零对不对?因为这时你已经没有必要下降了。
还有什么?
你要不停地增加你的y坐标直到你不再陷入地面,即与地面重合。设想,如果不增加y坐标,会发生什么情况?试着编程,并分析原因。
讲了这么多,看看脚本吧。
效果:
发现问题了吗?小猫是【缓慢】的升上来的,没有达到我们想要的目的。
怎么办?
那么就要让这“上升”的一段动画不显示,让我们直接看到上升的结果——更多模块。
一定要勾选【运行不刷新】!!!!
这样,我们来看看最终成果吧。
那么,看到这里,恭喜你,你已经学会了重力系统了。
然而。。
这仅仅是一个微不足道的开始——
下一节——可以上坡的移动!
2018年12月01日 08点12分 4
level 11
支持普及!
2018年12月01日 10点12分 5
level 9
-流- 楼主
第二节 左右移动
在开始讲之前,先看一个简单的左右移动脚本吧。
超级简单,不是么?但是与前面的脚本结合,这个脚本的功能就显得有些奇怪。
看见了吗?小猫会直接“瞬移”到平台上,这是为什么呢?结合前面的脚本,请自己思考一下。
如何解决这个问题呢?在这之前,我们先把这些脚本打个包——更多模块
【注意,这里依旧勾选运行不刷新】
接下来就是重点和难点了,我们首先把小猫想象成一个像素格子,把斜坡/墙壁/平台想象成其它像素:
(两个黄色的方块代表猫,黑色的代表地板)
那么,当我们走“进”墙里时,图就是这样的:
很显然,下一帧,重力系统就会将我们抬到平台表面
但是,如果我们自己在撞到墙后“反弹”回来,不就搞定了吗?
于是脚本如下:
你以为这样就结束了?不不不,你还是图【哔——】
咳,总之,这会导致我们的小猫连一个只有一个像素的凸起都过不去,仿佛一只不会弯腿的僵尸。(僵尸还会跳呢)
所以,我们要做的就是【判断这是一堵墙还是一堵斜坡】
——前方重点——
换一张图,假设小猫可以翻过一格高的“阶梯”,即如图所示,这个阶梯小猫是可以过的。
那么当小猫来到墙里面的时候:
按照上面的脚本,我们应该让小猫返回到上一格,但是我们知道小猫是可以跨到一格高的阶梯上的对吧。
所以我们先让小猫升高一格:
这时我们惊奇的发现,小猫不再与地面重叠了,也就是说,【小猫不再【碰到】地面】了,
这说明这个阶梯只有一格高,我们可以上去。
所以我们就不用动了,让小猫保持这个姿势,我们不就完成了上阶梯的任务了吗?
【楼下继续更】
2018年12月01日 13点12分 6
level 9
-流- 楼主
那么有人肯定就要问了:
哎楼主啊,我的角色肯定不是只能爬一格像素啊(长宽都只跨一个x或者y的我称它为一个像素),我还准备搞个登山游戏,我的角色可以爬很多像素呢,你这怎么行呢?
别着急,你想一想,既然我们升高一格后接触不了地面,说明这个阶梯是一格的,那么我们升高N格,如果不接触地面,那么这个阶梯不就是N格的了吗?
【恍然大悟】
那如果发现这个阶梯我们跨不过去呢?
很简单,还是那堵墙的问题:
我们升高了一格,发现:唉,我身子怎么还卡在墙里啊,坏了,这墙我过不去。
那么我们要退回到原来的位置,即:y坐标减1,x坐标减1的位置。
这两个1是不一样的。
y坐标减的那个1,是你上升了1格。
x坐标减的那个1,是你一步能走1格。
所以这不就出来了吗?
当升高到极限时,还是碰到了墙壁,那么就不要升高了,你过不去的,少年。
当你发现你过不去时,你就得回退,所以
y减去升高的极限值
x减去你的步数
消化一下——
思路既然已经有了,那么还不赶快动手!
新建一个变量,表示你升高了多少。
然后就按照你的思路,在这个变量的基础上,自己动手写一写。
脚本:
(注:此处默认极限值是7,超过7就爬不上台阶了)
什么?你说没有注释,看不懂?
如果你认真思考了这个脚本,你会发现,注释已经在你的脑海里了。
看看效果:
你的小猫已经“克服残疾”,学会“自己走路”了!
TQL!
开不开心!!
不过别高兴的太早,这只不过是另一个开始罢了=)。
2018年12月01日 13点12分 7
本期友情赞助:GraphicsGale,一个画像素画的工具。
2018年12月01日 13点12分
克 服 残 疾[滑稽]
2021年01月23日 13点01分
level 6
一年多前看到过一个重力系统的帖子,但是现在找不到了,那个人是翻译了外国教程做的,但是好像你的这个讲解得好一点,但是程序是差不多的。
下面的他的成品程序图
2018年12月01日 14点12分 9
@姓q的那位 哈哈哈[滑稽]
2018年12月02日 08点12分
2018年12月02日 10点12分
level 9
-流- 楼主
第三节 跳跃
在第一节当中,我们讲了【重力】,没错吧?跳跃,本质上来讲就是重力的一个分支,简单来说,就是你的身体发力,使你整个身子暂时离开地面,随即被万有引力拉回来。
注意,这一节比较零散,关系到第一节,建议先重温一下第一节的代码。
那么怎样实现呢?
我们看我们之前的代码:
我们之前一直在假设y速度只会是非正数,那么如果y速度变成了正数呢?那么你的y坐标自然就会增加一个正数的值,但这个值会因为【y速度-1】而不断减少,最后重新变为负数,继而下降。
分析一下过程:y增加——y增加的幅度减少——y下降——重归地面。
这不就是我们要的效果吗?
可很显然,这样的话,小猫就会“螺旋升天”:
我们来分析一下问题出现的原因:
1.游戏不能让你一直按下上键,不然小猫就会一直向上跳(当然你也可以不加)
这个比较容易搞定,如果你做过一些游戏,那么你会想到新建一个变量来解决问题:
但是,这样仅仅解决了不能一直按下上键的问题,而不碰到地面就能跳的问题仍然没有解决:
但是。。怎样才能解决这个问题呢?
思考一下,发现单纯的【如果碰到地面那么可以跳】的逻辑是不成立的,因为在这之前就已经判断并离开了地面(重力检测脚本)。
如果我们能用一个变量侦测离地有多久,再让这个变量在接触地面的时候清0,如果这个变量为0(原作者的脚本中,这个改成了小于3,即悬空时间等于0,1,2时都可以起跳,我测试了一下改成0几乎没有问题,但是往后的代码尊重原作者,还是写成小于3的模式),那么我们就可以起跳了。
要做到这个,首先我们要更改我们的重力脚本。
然后,只需要在跳跃脚本上修改一下:
最后一个小点需要注意:
跳跃相对于前两节来说,还是比较简单的(指代码实现),但是想要真正理解,就必须扎实地掌握第一节,这就是为什么我说这是重力系统的一个分支了。
下一节是个小小的补充,针对一种情况的特判。(不得不佩服,作为sc界的神犇,这位作者也是将特判做到了极致)
2018年12月07日 11点12分 11
我需要制作二段跳,那该怎么办呢(在线求答)
2020年11月06日 14点11分
level 9
-流- 楼主
第四节 别碰着头!
在这一节之前,我们先想一想:
我们在前几节的学习中,接触过这个脚本,对吧?
它用来检测是否碰到地面以及之后所要做的事情。
但是,你有没有想过一个问题:如果碰到地面的地方不是脚而是头,怎么办??
不用想了,告诉你,这会导致:
emmm...小猫头顶平台,直接“瞬移”到了平台上。
想一想,为啥?
怎么解决?很简单,加一个特判(特判,即对特殊情况的特殊处理)。
这个脚本很简单,就是对碰到地面的位置做一个检测,如果碰到地面的时候y速度大于0,那么情况只有一个——你的y坐标在增加。所以你是头碰到了天花板而不是脚碰到了地面。
如果你碰到了天花板,那么你仍然在悬空,并且你的y要减少-1让你的头离开天花板(即增加-1,具体思路参考底下的增加1)
测试一下,实现了。
没错,第四节就是这么的少而简单。
吗?不,当然不是,你还是图样图【楼主已被枪毙】
咳咳,总之,试试这个:
为啥?我不是都做好程序了吗?
当然,但是你要注意一个问题:
当你增加一次y坐标之后,实际上你的y速度归0了!这意味着,你又会重新开始执行向上移动的脚本。
啥?不懂?简单来说,就是在这个“如果”被执行的n次里,作为判断条件的y速度发生了改变!
解决的方法也很简单,就是把原先的值当做一个常量(常量,即不变的量)来处理。
脚本:
看,这样,作为常量的(y速度>0)(这虽然是一个大于号的表达式,但是在正式编程中,这个表达式是有值的,为1或0,这也就是为啥我说这个表达式是一个常量的原因。啥?你不知道表达式是什么?简单说,所有绿色的三角模块就是表达式)不会改变了,这个bug也就被修复了(再次感叹作者强大的特判能力)
最终实现:
2018年12月07日 11点12分 12
level 9
-流- 楼主
阿勒。。怎么就精了??
我还没更(ge)完呢。
[滑稽][茶杯]
2019年03月03日 12点03分 14
[滑稽]原来你还记得更新啊
2019年03月03日 13点03分
现在精品贴也能成坟了。。[滑稽][心碎]
2019年03月03日 13点03分
吧务
level 15
坟贴勿回
楼主更新后自动解除
2019年03月05日 11点03分 16
level 4
🐮,谢了
2021年01月23日 05点01分 26
1 2 尾页