前两天在b站看了超马奥德赛的一些实况 心血来潮
而且一直以来就很喜欢奥德赛平面关卡这个创意 也一直在考虑怎么在smbx中尽可能还原
于是阿炽尼亚遗迹和蘑菇王国水井的平面关卡给了我灵感 也让我设计了这个脚本。
(想要具体脚本包的SMBX交流群私信我,QQ2466976998)
首先需要准备:8bit的小怪 水管素材
原版马里奥素材和FC马里奥素材(头名称为luigi,要用luigi实现代换)
还有一些背景素材
接着,对FC风格的砖块的属性菜单进行如下设置:
然后进入正式脚本环节。
首先对npc(小怪)的设置
dim a as integer
With npc(sysval(Param1))
If char(1).id = 1 Then
.friendly = 0
Else
.friendly = 1
End If
‘利用char(1).id判断人物状态(原版/8bit)
for a = 1 to sysval(bcount)
if BGO(a).id = 113 or BGO(a).id = 18 then
BGO(a).zpos = 0.3
’被原版的背景草丛遮挡,体现分层关系
end if
Next
End with
接下来设置角色进入水管后的变为8bit状态的脚本(在这里感谢氧哥的帮助)
在水管传送处设置事件,进行脚本触发。
(注意!!!!这里必须要用事件触发脚本,否则角色转变会过早)
Dim i As Integer
do
i += 1
If i >= 56 Then
‘这里进行等待进水管的动画,等i值大于56后就执行下面的语句
Char(1).id = 1
’变换角色为8bit马里奥(原版1为路易基,但是这里替换为了8bit马里奥的素材)
call AudioSet(12, 20000, 0, "")
call AudioSet(11, 1000, 0, "60.Run, Jump, Throw! 2 (8-bit) - Super Mario Odyssey Soundtrack.mp3")
’将原版bgm停止,变为8bit风格的bgm(引号中的bgm是文件夹中的音乐文件即可,mp3,ogg,wav等支持的音频文件都行)
End If
Call Sleep(1)
Loop Until (i >= 126)
从8bit风格变为原版同理,另新建一个脚本,将char(1).id的数值变为0(对应马里奥),同时下面音频的文件名变为原版bgm即可。
完成进出水管风格切换后,我们做掉出8BIT区域时,角色被“升维打击的效果”
If char(1).id = 1 Then
’判定条件,即角色为8bit马里奥时
call fxcreate(63,char(1).x,char(1).y,0,0,5,2,0,3,0)
’掉出区域的烟雾特效
call AudioSet(12, 20000, 0, "")
call AudioSet(11, 1000, 0, "59.Run, Jump, Throw! 2 - Super Mario Odyssey Soundtrack.mp3")
‘将bgm切换为原版bgm
Char(1).id = 0
’角色切换为原版马里奥
end if
这段脚本使用流体触发,流体编号设置为5,即只对玩家触发一次(Event Once)
最后,设置玩家与草丛的遮挡关系,同时设置只能在马里奥为8bit状态下,8bit水管才有效的特性(感谢享的帮助)
首先,我们需要新建一个图层用于存放水管入口
dim a as integer
do
‘注意:这里必须要用do-loop循环,否则只判定一次,没有效果
if Char(1).id = 0 then
call LSet(pipe,2,0)
else
call LSet(pipe,1,0)
end if
’对水管入口图层显隐的判断,其中pipe为图层名,可按需修改
if char(1).id= 1 then
for a = 1 to sysval(bcount)
if BGO(a).id = 113 or BGO(a).id = 18 then
BGO(a).zpos = 0.3
‘遮挡原理,同NPC,此处不再赘述
end if
Next
else
for a = 1 to sysval(bcount)
if BGO(a).id = 113 or BGO(a).id = 18 then
BGO(a).zpos = 0.5
’防止原版马里奥也被图层遮挡,当BGO的z坐标小于等于0.5时,遮挡一切
end if
Next
val(Status) = char(1).status
if char(1).id = 0
char(1).status = val(Status)
‘确保马里奥进出水管得到的状态(火力花,蘑菇等)一样
end if
end if
call sleep(1)
loop
脚本在Level-Start的事件中触发,作为默认事件。