PhaseShift
Role: Gameplay Programmer
Status: Released
Time Frame: 4 days
Team Size: 3
Tech: Godot, GDScript
About
PhaseShift is just a simple 2D platformer game My friends and I made for a game jam. All of us have no prior experience in game development, so we decided to start with the "tutorial" of game development -- A 2D platformer game with a little bit of our own twist.
You play as the lab speciment, Satyr trying to escape from the lab to the end of the level by shifting between different phases of reality.
Introduction
My key contribution to the game is the Movement and the Shifting Mechanics of Satyr. While working with PhaseShift, I mostly focused on how it feels as a player to be moving around the level. Because the movement is the most important aspect of a platformer, I wanted the players to be able to precisely control Satyr's jump timing, landing point, shift timing and so on.
Movement
Godot's default movement script feels sluggish and not responsive. So I decided to implement my own movement script.
The two things that I implemented are CoyoteTimer and JumpBuffer. CoyoteTimer allows Satyr who walk off the edge to still be able to jump. While JumpBuffer allows Satyr to register a jump input slightlty before it lands on the ground. Both of these features allow players to have a better control over Satyr's jump.
Shifting Mechanics
Shifting between two worlds is done by pressing the shift key. The two worlds are build on two different tilemap layers, on top of each other. I implemented the shifting mechanics by simply playing a shifting animation while swapping the tilemap behind the scenes.
A challenge I faced is that I wanted to make it so that Satyr dies if it gets clipped into a wall after shifting. I came up with a solution by checking Satyr's movement. If Satyr is not on the ground, but not falling either, that means he is stuck and the death animation will play.
What I Learned
When hardcoding Satyr's movement, I wanted to give players a sense of complete control. To achieve this, I studied Celeste—arguably one of the best games when it comes to movement, and I learned a lot from it. For instance, acceleration that's too fast feels stiff and robotic, while acceleration that's too slow feels like constantly walking on ice. Similarly, if jump height is disproportionately high, it feels unnatural, but if it's too low, the jump feels sluggish and unsatisfying. In the end, with tons of play testing and relying on my own gaming sense, I managed to create a movement that I think is pretty good.