我们都知道,在 38A 里并没有着色器功能,想要在 38A 中做出带有 3D 特效的东西看起来似乎是不可能的。然而事实真的是这样吗?不,虽说我们不能做出真正 3D 的东西,但是我们可以使用 bitmap 之类的功能让一个东西看起来像是 3D 的东西!这就是为什么我要在这里发布我最近做出来的新脚本——伪3D背景系统!
更新内容
脚本代码
'(图像ID,场景ID,使用的NPC的图源ID,图像宽度,图像高度,切割高度,最大缩放倍数,最小缩放倍数,拉伸倍数,类型(type),横向滚动速度(parax),纵向滚动速度(paray),背景横向移动速度,优先级(Z坐标),颜色)
script pseudo3dbg(id as integer, sid as integer, picid as integer, width as integer, height as integer, split as integer, maxi as double, mini as double, stretch as double, type as integer, parax as double, paray as double, xsp as double, z as double, color as double)
Dim i as integer
dim x as integer
Dim s as integer
dim t as double
dim ty as double
dim ty2 as double
Dim num as integer = -int(-800/width)/(2*(mini+i*(maxi-mini)/(height/split)))
for s = sid to sid
for i = 0 to height/split - 1
for x = -num to num
If char(1).section = sid Then
If i <> 0 Then
If type = 1 Then
call BmpCreate(id*1000000000+ i*10000 + x, picid, 0, 1, 0, i*split, width, split, sysval(player1scrX), sysval(player1scrY) + 600*type + height*2*(0.5-type) + i*split, 2*(mini+i*(maxi-mini)/(height/split)), 1, 0, 0, 0, color)
Else
call BmpCreate(id*1000000000+ i*10000 + x, picid, 0, 1, 0, height-i*split, width, split, sysval(player1scrX), sysval(player1scrY) + 600*type + height*2*(0.5-type) + i*split, 2*(mini+i*(maxi-mini)/(height/split)), 1, 0, 0, 0, color)
End If
Else
call BmpCreate(id*1000000000+ i*10000 + x, picid, 0, 1, 0, 0, width, height, sysval(player1scrX), sysval(player1scrY) + 600*type + height*2*(0.5-type) + i*split, 2*(mini+i*(maxi-mini)/(height/split)), 1, 0, 0, 0, color)
End If
Else
Call berase(2,sid*1000000000+ id*100000000 +i*10000 + x)
End If
t = parax*(section(sid).x + xsp*sysval(gametime) - sysval(player1scrX))/32 - width*2*(((section(sid).x + xsp*sysval(gametime) - sysval(player1scrX))*parax/32)\width*2 - 1)
ty = paray*(section(sid).y + section(sid).height*type - sysval(player1scrY) - 600*type)/32
If i <> 0 Then
bitmap(id*1000000000+ i*10000 + x).scaley = 1+ty*stretch
If bitmap(id*1000000000+ i*10000 + x).scaley >= split*2/stretch Then
bitmap(id*1000000000+ i*10000 + x).scaley = split*2/stretch
End If
End If
bitmap(id*1000000000+ i*10000 + x).zpos = z-i*0.0001
bitmap(id*1000000000+ i*10000 + x).destx = sysval(player1scrX) + 400 - (width-1)/2*2*(mini+i*(maxi-mini)/(height/split)) + (width-1)*2*(mini+i*(maxi-mini)/(height/split))*x + t*(mini+i*(maxi-mini)/(height/split))
If i <> 0 Then
bitmap(id*1000000000+ i*10000 + x).desty = sysval(player1scrY) + (600 - height)*type - 2*(0.5-type)*i*split + height*(1-type) - 4*stretch*(0.5-type)*ty*(mini+i*(maxi-mini)/(height/split))- 2*(0.5-type)*split
Else
If type = 1 Then
bitmap(id*1000000000+ i*10000 + x).desty = sysval(player1scrY) + (600 - height)*type + 1*split + 2*stretch*ty*(mini+1*(maxi-mini)/(height/split))
Else
bitmap(id*1000000000+ i*10000 + x).desty = sysval(player1scrY) + (600 - height)*type - 2*(0.5-type)*1*split - 4*stretch*(0.5-type)*ty*(mini+1*(maxi-mini)/(height/split))
End If
End If
next
next
next
end script
'split - this determines the split height of the gfx, the smaller this number is, the more refined the bgo is
'split决定伪3D背景的拆分高度,这个值越小,背景越精细
'maxi - this determines the maximum zoom multiple of the gfx
'maxi决定背景的最大缩放倍数
'mini - this determines the minimum zoom multiple of the gfx
'mini决定背景的最小缩放倍数
'stretch - this determines the stretch multiple of the gfx when the screen is scrolling vertically, set it to 0 to disable the stretch of the gfx
'stretch决定屏幕纵向移动时背景的拉伸倍数,设为0以禁用背景的拉伸
'type - 1 for glue sth to the floor of the section, 0 for glue sth to the ceiling of the section
'type为1时将背景固定在场景底层,type为0时将背景固定在场景顶层
'parax - this determines how fast gfx is scrolling when player moves screen horizontally
'parax决定屏幕横向移动时背景的滚动速度
'paray - this determines how fast gfx is scrolling when player moves screen vertically
'paray决定屏幕纵向移动时背景的滚动速度
'Credit by HengShao, referenced from Yvahnek's Parallax BGO script
'脚本由亨少制作,借鉴自 Yvahnek 的多层背景脚本
'Example:
'Call pseudo3dbg(1,1,1,64,64,1,1.5,0.5,0.5,1,16,8,0.15,0.99,-1)
'(It should in do loop)
预览动图
如果使用这个脚本,你可以做出一些看起来很炫酷的伪 3D 大背景!就像这些动图里的一样!
注意事项
- 这个脚本只兼容 1.4.5 版本。
- 这个脚本暂时不支持带有透明背景的贴图素材。
- 如果场景太长或者贴图素材的分割高度过小,伪 3D 背景可能会出现 bug(如显示不完整)。对于这种情况,可以采取的措施包括将贴图素材的分割高度改成更大的数值,或者改变脚本中使用的 bitmap 的编号来防止多个 bitmap 的编号发生冲突。(如将 bitmap(sid1000000000+ id100000000 + i10000 + x) 改为 bitmap(sid100000000000+ id10000000000 + i10000 + x)。)
- 如果场景太长或者贴图素材的分割高度过小,游戏可能会掉帧。因此,请慎重考虑你的和玩家们的电脑配置。
Credit 名单
亨少 - 制作了这个脚本
Yvahnek - 借鉴了他的多层背景脚本的内容
Slash-18 - 在实例脚本中使用了他的彩虹渐变特效
这里还有一个实例关卡,用于展示如何使用这个脚本。希望你们能喜欢这个脚本~