In our last Speed Limit blog, we talked with Matija about his fantastic work on Speed Limit soundtrack. In this blog, something a bit different.
Today, we talk with Karlo, our programmer who will guide us through the process of making those awesome Speed Limit transitions!
Tell us a bit about yourself and what do you do in Gamechuck!
Hi there! I’m a game developer at Gamechuck. I’ve worked on the development of bike and choppa levels of Speed Limit. I’ve also worked on a few smaller commission games.
Right now I’m occupied with prototypes for a few game ideas we’re cooking, as well as doing the frontend for our arcades.
What projects have you worked on before joining Gamechuck?
I didn’t have any professional experience before Gamechuck, but I spent a fair amount of time and energy participating in game jams, using Godot as the engine.
I consider these jams as work experience due to shared qualities. The whole process of coming up with ideas, making a prototype, making the rest of the game, publishing, and marketing, working with a team, organizing the process, etc.
Other than that I occasionally do game development in Godot in my free time, mostly testing out some ideas and learning new stuff.
So when it comes to Speed Limit, how difficult was it for you to jump-into the production process?
Not very difficult. Before starting working I haven’t used GameMaker Studio for a long time, so switching back to its philosophy took between one to two weeks.
What helped was the fact that each level has its own logic and system, so I was able to work on them separately without poking into the whole game.
There are a few things the engine is doing differently compared to Godot and I had to get accustomed to it. After that things were going smoothly.
Can you explain how exactly we do those transitions?
Before starting working on them, I had to discuss a lot with the designer to get the exact picture of what we want it to look like.
Some transitions were hard to explain by words so we made some animations just to be able to visualize them clearly.
Once I had that picture in my mind, I started making some preparations for both levels which was mostly positioning objects where they should be at the start or end of a transition, and discussing with lead developer Vanja to do the same for the other two levels that happen before and after mine.
In the meantime, our pixel artist Jurica chucked out all the necessary assets with their changing perspectives (ex. choppa rotating from a sidescrolling perspective to isometric perspective).
Finally it was transition time!
The majority of each transition consists of interpolating objects between key positions and scales, playing their animations at the right speed and time, and warping the background in several ways. Most of the work here was properly sequencing all the events and tweaking them to look and feel good.
Few issues arose during the making which required making some creative solutions. One example is the background during bike-to-choppa transition.
In the bike level, the road and sea background is constructed from segments, and you can see tall buildings. In the choppa level, the background is a simple warped scrolling texture of water.
How do you transition between these two? The answer is that you don’t. When the player hits the choppa after jumping on a ramp, the camera zooms into the choppa, covering up the entire screen. That’s when we remove some elements from the background (like the road and buildings) to make the transition easier.
The car-to-bike transition had a slightly different story. We had to draw a tunnel that transitions from a top-down perspective to a fake 3D perspective, ending with a camera behind the player inside that tunnel. How?
For this one, I went overboard and actually reconstructed the whole transition in 3D using the Godot engine. Then I recorded the positions of vertices of the tunnel, projected onto the camera’s 2D plane during the animation.
Finally, I added these positions into the level, and now I had exact coordinates of tunnel vertices. All that was left was to draw the segments between them. So in essence, the tunnel you see during the transition, it’s drawn with baked coordinates from a 3D animation. Whew! It paid off in the end.
How difficult was it to make those transitions? For you, personally.
It wasn’t exceptionally difficult once you know exactly what it should look like. The most “difficult” part was adjusting the positions and scales of objects on the edges of both levels so the transition plays nicely without any visible snaps.
Choppa as part of transition had to be positioned at an appropriate place so when the room transition happens you don’t see it suddenly move or change its scale. Same with rotating and warping backgrounds. The real difficulty is the patience for iterating over and over until it feels good.
What was the MOST difficult to pull-off? In the game, as a whole. And why.
Regarding the levels I’ve worked on, there were 2 near-equal difficult things to pull off, and I’ll mention them both.
For bike level, it’s the collisions, specifically with enemy bikers. GMS uses Box2D for collision, but since this level is not compatible with that, being “3D” and all, I had to write my own.
Doing that wasn’t very easy, and most solutions for collision are done in some creative way.
For the choppa level, it’s the draw order. The thing about isometric perspective is that the camera is not aligned to 2 world axes like it is on any other level. When it is aligned with 2 axes, you only really have to sort objects in that 3rd “depth” axis.
When I started working on this level, everything was working smoothly. Boats were drawn first on the water, after that all the flying objects like the player and enemy planes. But when we added lighthouses that are tall, the draw order got messed up.
The solution required a fair amount of research and iteration, and the algorithm now considers a lot of factors in order to sort objects regardless of their position or size.
What do you think about the GameMaker 2 engine?
I think GameMaker Studio a solid game engine for making 2D games. Its performance is quite good, and you have control over the rendering pipeline which gives plenty of room for optimization, compared to modern game engines. It comes close to using a framework rather than a full-fledged set of tools.
That said, it has a few flaws. At the time of development, we used GMS 2.2 which didn’t support custom structs or some sort of sequencer to make transition events easier to edit. Their support arrived in GMS 2.3 but by that time we were finished with the game and didn’t want to make the switch.
Besides these, I haven’t found its workflow to be pleasant. Managing scripts and assets was annoying, and compile times were long-ish.
Now, something a bit more personal. What games do you like, and play currently?
I like to play video games a lot, and cover a wide spectrum of genres, but my favorites are hardcore platformers, rhythm, and puzzle games.
I like games with plenty of challenges (provided they’re given in an appropriate way) and giving problems that require creative solutions. Good gameplay is what I seek and appreciate in games, and story, atmosphere, and fun are a bonus.
Some of my favorites would be The Witness, Baba is You, Hollow Knight, Celeste, 140, and Thief: The Dark Project. These days I’m playing Cuphead, 1001 Spikes, and Bloodborne.