Hey peeps, here's a very usable and smooth (especially at 60fps) parallax script I wrote that affects all map layers you want it to. I tried to make it as open ended and simple to "copy-paste and go" as possible. Just read the comments and you'll get an idea of how to use it. If you notice any mistakes or are confused, lemme know and I'll update it and/or explain. I literally made this math up on the spot, I have no idea if it could be better, it just works lol.
Code: Select all
#NOTES-NOTES---------------------------------------------
#by Ravancloak, Version 0.2 [27.02.2021]
#no credit necessary, feel free to modify and use wherever, idc,
#MATH TO DETERMINE OFFSET:
#center of screen's distance from the middle of the map / layerOffsetX / modifier
#USAGE:
#set the parallax amount using
#"setParallaxX(layer 0 X offset, layer 1 X offset, layer 3 X offset, etc. up to layer 15 X offset)"
#"setParallaxY(layer 0 Y offset, layer 1 Y offset, layer 3 Y offset, etc. up to layer 15 Y offset)"
#all layer x and y offset is set seperately and manually.
#use 0 for "layer #" offset to add no parallax effect
#it can be used to scroll things in the background.
#It could be used for mist or clouds closer to the camera than the tiles, just use a negative number for the layer#offset argument.
#it can also be used for trees if you're really smart :]
#Example:
#set parallaxX (4, 8), set parallaxY (4, 8, 0, -4)
#map layer 0 moves very slow.
#map layer 1 moves a bit faster.
#map layer 2 will not move.
#map layer 3 will only move slowly, the opposite direction, along the y axis.
#END-NOTES----------------------------------------------
#as an example, set this on a map with at least 2 background layers that will be moving in the back.
plotscript, example autorun, begin
setParallaxX(4,0)
setParallaxY(4,8)
layerParallax()
end
define constant, begin
#timers
0, timer:parallax
end
#change the variable numbers as needed.
globalVariable, begin
#offset for the map parallax
100, layerOffsetX0
101, layerOffsetX1
102, layerOffsetX2
103, layerOffsetX3
104, layerOffsetX4
105, layerOffsetX5
106, layerOffsetX6
107, layerOffsetX7
108, layerOffsetX8
109, layerOffsetX9
110, layerOffsetX10
111, layerOffsetX11
112, layerOffsetX12
113, layerOffsetX13
114, layerOffsetX14
115, layerOffsetX15
116, layerOffsetY0
117, layerOffsetY1
118, layerOffsetY2
119, layerOffsetY3
120, layerOffsetY4
121, layerOffsetY5
122, layerOffsetY6
123, layerOffsetY7
124, layerOffsetY8
125, layerOffsetY9
126, layerOffsetY10
127, layerOffsetY11
128, layerOffsetY12
129, layerOffsetY13
130, layerOffsetY14
131, layerOffsetY15
end
script, setParallaxX, arg0, arg1=0, arg2=0, arg3=0, arg4=0, arg5=0, arg6=0, arg7=0, arg8=0, arg9=0, arg10=0, arg11=0, arg12=0, arg13=0, arg14=0, arg15=0, begin
layerOffsetX0 := arg0
layerOffsetX1 := arg1
layerOffsetX2 := arg2
layerOffsetX3 := arg3
layerOffsetX4 := arg4
layerOffsetX5 := arg5
layerOffsetX6 := arg6
layerOffsetX7 := arg7
layerOffsetX8 := arg8
layerOffsetX9 := arg9
layerOffsetX10 := arg10
layerOffsetX11 := arg11
layerOffsetX12 := arg12
layerOffsetX13 := arg13
layerOffsetX14 := arg14
layerOffsetX15 := arg15
end
script, setParallaxY, arg0, arg1=0, arg2=0, arg3=0, arg4=0, arg5=0, arg6=0, arg7=0, arg8=0, arg9=0, arg10=0, arg11=0, arg12=0, arg13=0, arg14=0, arg15=0, begin
layerOffsetY0 := arg0
layerOffsetY1 := arg1
layerOffsetY2 := arg2
layerOffsetY3 := arg3
layerOffsetY4 := arg4
layerOffsetY5 := arg5
layerOffsetY6 := arg6
layerOffsetY7 := arg7
layerOffsetY8 := arg8
layerOffsetY9 := arg9
layerOffsetY10 := arg10
layerOffsetY11 := arg11
layerOffsetY12 := arg12
layerOffsetY13 := arg13
layerOffsetY14 := arg14
layerOffsetY15 := arg15
end
script, layerParallax, begin
variable(sli, offsetx, offsety, layerOffsetX, layerOffsetY, var1, var2, centerX, centerY)
subscript, apply offset, begin
if (layerOffsetX <> 0) then (
offsetX := (camera pixel x -- map width * 10 + slice width(sprite layer)/2) / layerOffsetX
)
if (layerOffsetY <> 0) then (
offsetY := (camera pixel y -- map height * 10 + slice height(sprite layer)/2) / layerOffsetY
)
put slice (sli, (offsetx), (offsety))
offsetX := 0
offsetY := 0
end
if (lookupSlice (sl:mapLayer0) <> false) then (
sli := lookupSlice (sl:mapLayer0)
layerOffsetX := layerOffsetX0
layerOffsetY := layerOffsetY0
applyOffset ()
)
if (lookupSlice (sl:mapLayer1) <> false) then (
sli := lookupSlice (sl:mapLayer1)
layerOffsetX := layerOffsetX1
layerOffsetY := layerOffsetY1
applyOffset ()
)
if (lookupSlice (sl:mapLayer2) <> false) then (
sli := lookupSlice (sl:mapLayer2)
layerOffsetX := layerOffsetX2
layerOffsetY := layerOffsetY2
applyOffset ()
)
if (lookupSlice (sl:mapLayer3) <> false) then (
sli := lookupSlice (sl:mapLayer3)
layerOffsetX := layerOffsetX3
layerOffsetY := layerOffsetY3
applyOffset ()
)
if (lookupSlice (sl:mapLayer4) <> false) then (
sli := lookupSlice (sl:mapLayer4)
layerOffsetX := layerOffsetX4
layerOffsetY := layerOffsetY4
applyOffset ()
)
if (lookupSlice (sl:mapLayer5) <> false) then (
sli := lookupSlice (sl:mapLayer5)
layerOffsetX := layerOffsetX5
layerOffsetY := layerOffsetY5
applyOffset ()
)
if (lookupSlice (sl:mapLayer6) <> false) then (
sli := lookupSlice (sl:mapLayer6)
layerOffsetX := layerOffsetX6
layerOffsetY := layerOffsetY6
applyOffset ()
)
if (lookupSlice (sl:mapLayer7) <> false) then (
sli := lookupSlice (sl:mapLayer7)
layerOffsetX := layerOffsetX7
layerOffsetY := layerOffsetY7
applyOffset ()
)
if (lookupSlice (sl:mapLayer8) <> false) then (
sli := lookupSlice (sl:mapLayer8)
layerOffsetX := layerOffsetX8
layerOffsetY := layerOffsetY8
applyOffset ()
)
if (lookupSlice (sl:mapLayer9) <> false) then (
sli := lookupSlice (sl:mapLayer9)
layerOffsetX := layerOffsetX9
layerOffsetY := layerOffsetY9
applyOffset ()
)
if (lookupSlice (sl:mapLayer10) <> false) then (
sli := lookupSlice (sl:mapLayer11)
layerOffsetX := layerOffsetX11
layerOffsetY := layerOffsetY11
applyOffset ()
)
if (lookupSlice (sl:mapLayer12) <> false) then (
sli := lookupSlice (sl:mapLayer12)
layerOffsetX := layerOffsetX12
layerOffsetY := layerOffsetY12
applyOffset ()
)
if (lookupSlice (sl:mapLayer13) <> false) then (
sli := lookupSlice (sl:mapLayer13)
layerOffsetX := layerOffsetX13
layerOffsetY := layerOffsetY13
applyOffset ()
)
if (lookupSlice (sl:mapLayer14) <> false) then (
sli := lookupSlice (sl:mapLayer14)
layerOffsetX := layerOffsetX14
layerOffsetY := layerOffsetY14
applyOffset ()
)
if (lookupSlice (sl:mapLayer15) <> false) then (
sli := lookupSlice (sl:mapLayer15)
layerOffsetX := layerOffsetX15
layerOffsetY := layerOffsetY15
applyOffset ()
)
# Set the script to run again next tick
setTimer(timer:parallax, 0, 1, @layerParallax)
end