How I faked 3D in my 2D train game
Hello! Thanks to everyone who tried my game so far.
I wanted to showcase the various techniques I used in this jam to create this little train game with a day/night cycle.

Why
When I got the idea of using speed limit signals to fit the theme, I immediately went with those old trains as I like the sound they make as they go and their whole aesthetic. I thought it fit the vibe of the little world I'm slowly creating.
Thus, I needed a way to easily loop a texture over, and this is why I decided to go with a shader to give an illusion of depth and movement. By shifting the UV depending on the train's movement, I could easily create an illusion of perpetual movement.
How
The game is composed of several overlayed sprites.
The background is entirely rendered by a shader, including the stars, the sun and the mountains.
The train is composed of, overlayed in this order: a base sprite, Meina's left side, the train's right side sprite, and Meina's head and right side. This allowed me to only change the sprites of Meina's right side to animate her.
A combination of scaling and lerps between anchor points was used to make the speed signs and other things pass by on the side as you keep cruising.
Finally, the rails used a base texture that was carefully deformed to give this effect below.
The goal was to be able to place the train on the left to have space on the right for various objects passing by.
The coord variable here is the train's position in the world.

Sound
I got some comments praising the sound aspect of the game. I did originally plan to add subtle music, but didn't because of time constraints. I spent a lot of time tweaking the sounds of the train. I used a looping engine sound with modulating volume depending on the situation, as well as 5 very short rail "clunk" samples from one long sound, which play at a slower or faster rate depending on the speed. Both of those are from Pixabay, which is why I've opted out of the Sound category. I did not compose anything.
Future of the game
I've received a lot of ratings and feedback, and I'd like to thank again everyone who played my game! I've released the first bigger update which is mostly refactoring and polishing. For the initial version, I was manually passing the time and train position parameters to every sprites' shaders to achieve the tint effect on assets, but I discovered Godot's RenderingServer class which allows me to set global parameters, as well as the "Use parent's material" toggle.
RenderingServer.globalshaderparameter_set("time", time)
This should make future development easier, as I'm certainly planning to add more varied encounters, gameplay elements, an actually coherent small world to explore with still some random generation in object placement, weather effects, and calm, soft or atmospheric music. The goal is to make the game more interesting while keeping its cozy charm. The only reason the current game did not end up with a lot of content is because of time constraints. I added an actual goal at the last minute!
Thank you for reading this post until the end! If you found this interesting, please give my game a try! I'll do my best to release a new version with more content before the end of the rating session. If you have any questions too, feel free to ask.