Radical Parallax Script

Make games! Discuss those games here.

Moderators: Bob the Hamster, marionline, SDHawk

Post Reply
User avatar
Ravancloak
Red Slime
Posts: 51
Joined: Wed Jul 31, 2019 1:49 am
Location: Venus
Contact:

Radical Parallax Script

Post by Ravancloak »

[EDIT]: I have made it so you set x and y separately on each layer, instead of my x/y modifier thing.

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 &#40;layerOffsetX <> 0&#41; then &#40;
			offsetX &#58;= &#40;camera pixel x -- map width  * 10 + slice width&#40;sprite layer&#41;/2&#41;  / layerOffsetX
		&#41;
		if &#40;layerOffsetY <> 0&#41; then &#40;
			offsetY &#58;= &#40;camera pixel y -- map height * 10 + slice height&#40;sprite layer&#41;/2&#41; / layerOffsetY	
		&#41;
		put slice &#40;sli, &#40;offsetx&#41;, &#40;offsety&#41;&#41;
		offsetX &#58;= 0
		offsetY &#58;= 0
	end

	if &#40;lookupSlice &#40;sl&#58;mapLayer0&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer0&#41;
		layerOffsetX &#58;= layerOffsetX0
		layerOffsetY &#58;= layerOffsetY0
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer1&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer1&#41;
		layerOffsetX &#58;= layerOffsetX1
		layerOffsetY &#58;= layerOffsetY1
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer2&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer2&#41;
		layerOffsetX &#58;= layerOffsetX2
		layerOffsetY &#58;= layerOffsetY2
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer3&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer3&#41;
		layerOffsetX &#58;= layerOffsetX3
		layerOffsetY &#58;= layerOffsetY3
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer4&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer4&#41;
		layerOffsetX &#58;= layerOffsetX4
		layerOffsetY &#58;= layerOffsetY4
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer5&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer5&#41;
		layerOffsetX &#58;= layerOffsetX5
		layerOffsetY &#58;= layerOffsetY5
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer6&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer6&#41;
		layerOffsetX &#58;= layerOffsetX6
		layerOffsetY &#58;= layerOffsetY6
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer7&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer7&#41;
		layerOffsetX &#58;= layerOffsetX7
		layerOffsetY &#58;= layerOffsetY7
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer8&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer8&#41;
		layerOffsetX &#58;= layerOffsetX8
		layerOffsetY &#58;= layerOffsetY8
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer9&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer9&#41;
		layerOffsetX &#58;= layerOffsetX9
		layerOffsetY &#58;= layerOffsetY9
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer10&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer11&#41;
		layerOffsetX &#58;= layerOffsetX11
		layerOffsetY &#58;= layerOffsetY11
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer12&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer12&#41;
		layerOffsetX &#58;= layerOffsetX12
		layerOffsetY &#58;= layerOffsetY12
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer13&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer13&#41;
		layerOffsetX &#58;= layerOffsetX13
		layerOffsetY &#58;= layerOffsetY13
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer14&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer14&#41;
		layerOffsetX &#58;= layerOffsetX14
		layerOffsetY &#58;= layerOffsetY14
		applyOffset &#40;&#41;
	&#41;
	if &#40;lookupSlice &#40;sl&#58;mapLayer15&#41; <> false&#41; then &#40;
		sli &#58;= lookupSlice &#40;sl&#58;mapLayer15&#41;
		layerOffsetX &#58;= layerOffsetX15
		layerOffsetY &#58;= layerOffsetY15
		applyOffset &#40;&#41;
	&#41;

	# Set the script to run again next tick
	setTimer&#40;timer&#58;parallax, 0, 1, @layerParallax&#41;
end
Attachments
Here is an example of the script in action.
Here is an example of the script in action.
Parallax2.gif (1.12 MiB) Viewed 1449 times
Last edited by Ravancloak on Sat Feb 27, 2021 4:43 pm, edited 1 time in total.
Have a flower! ^-^~* (she/her)
User avatar
Ravancloak
Red Slime
Posts: 51
Joined: Wed Jul 31, 2019 1:49 am
Location: Venus
Contact:

Post by Ravancloak »

For anyone interested, I add setting x and y offset independently.
Have a flower! ^-^~* (she/her)
Post Reply