图层排序问题
上一节我们介绍了不同代码段间的执行顺序,并解决了武器跟随延迟问题。下面我们来解决克隆体之间图层排序问题。 当玩家走到敌人后面时,看起来像是站在了敌人身上:
这是因为没有对他们的图层关系进行处理。当玩家移到敌人后方(玩家y>敌人y)时,图层应该靠后:
为了解决这个问题,我们需要对角色进行图层排序:位置在后面(y坐标更大)的角色,图层下移层数越大。这样,处在前面的角色总是能正确挡住后面的角色。
对于图层排序问题,国外 Scratcher 大佬 Griffpatch 给出了一个很好的解决办法。可以观看下面的视频教程
(注:视频是英文,点击视频下方的“字幕”可以显示自动翻译的中文字幕)
最终,我们可以实现下面的效果:根据y坐标计算角色间的前后遮挡。
让我们开始吧! (注:本教程使用的方法为 Griffpatch 提供的方法,你也可以研究自己的方法)
教程正式开始
- 首先,在舞台添加如下代码:
- 新建列表“图层排序表”,用于记录角色的y坐标以用于图层排序;
- 每次循环清空排序表,然后广播“图层排序”。其他角色收到广播后设置自己的图层。
- 接着,在玩家角色中添加如下代码,用于收到广播后,根据角色的地图y坐标进行排序:
- 新建自制积木“设置图层”。注意勾选“不刷新屏幕”(勾选后,如果自制积木中有循环,就可以瞬间执行完完毕)
- 为自制积木编写如下代码,用于角色计算自己应该前移的图层值:
- 新建变量“图层 i”(这个变量可以设为私有变量,也可以是全局,因为这个积木会瞬间执行完成,即使设为全局变量也不用担心不同角色的冲突使用问题。这里设为全局变量)
- 然后,使用下面的代码,依次查找,直到 y≥列表项,就插入到该项前,并将找到的位置作为自己的前移层数。
- 列表为空时,直接加入;
- 列表不为空时,插入前的内容总是保持从大到小排列(只有一项时也可以看成是从大到小排列),此时要往里面加入角色 y 时,从前往后查找列表,如果自己<列表项,就继续往后找;直到找到自己≥列表项时,就插入到该项前面。
- 例如,下面向列表插入30。这样插入后列表仍然保持有序(从大到小排列)。
- 同样,给玩家武器添加下面的代码:(将武器的排序值设为“玩家y - 1”,让武器图层保持在玩家前)
- 为敌人添加下面的代码:(使用私有变量“是克隆体” = 1,判断只有克隆体才执行图层排序)
- 为敌人武器添加下面的代码:(将排序值设置为“敌人y -1”,使敌人武器图层总在敌人之前)
- 为背景、遮挡物添加图层排序:如果是克隆体(遮挡物),就移到顶层(将排序值设为很小的数);如果是角色本体(背景)就移到底层(将排序值设为很大的数)
- 最后,给玩家受伤效果添加设置图层,让其始终移到最顶层(设置一个很小的图层排序值)(也可以直接使用“移到最前面”代码,但考虑到之后可能还会添加在“受伤效果”角色图层之上的其他角色,这里也接入图层排序系统)
- 这样,图层排序就完成了!
这段代码实际上是一个“插入排序”,始终让列表中的 y 坐标保持从大到小排列:
最后,让角色根据自己在列表的位置,设置前移层数:例如角色查找到自己在列表的第 5 项(列表从大到小,前 4 项都是 y 坐标比自己大,图层靠后的克隆体),那么就前移 4 层
Griffpatch 图层排序的代码可以在下面的作品中找到。将角色中的代码添加到自己作品中即可使用:
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec6/02&type=comment"
title="{射击6-实现图层排序}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>