
Grenouille
2023
Introduction
Play as the heroic frog Grenouille! Hop, leap, and fight your way through the swamp to destroy the factory polluting your home.
​
Grenouille is a 2D platformer game inspired by Rayman Legends. The player takes control of the frog Grenouille and, with his extraordinary abilities, aims to destroy the factory that pollutes his home. His abilities include, running, hopping, swinging his club, ground slam, hover, wall climb, and more.
Contribution
​My role during this project was to implement many of the gameplay mechanics, as well as the SFX and VFX. I also fixed some issues in the in-house engine the school provided, for example, fixed white outlines on sprites, added changing resolution, improved sound engine, and added stencil buffer support for death screen.​​ Another thing I added was automatic batching of sprites to optimize rendering, this was especially important due to the sheer number of objects in the world.
​
A large part of my time was spent on creating and polishing the mechanics of the player. It started first with creating an object that can collide with the environment. However, we early-in had a problem with the collisions where you could climb on walls. This is because when the player moves, it could overlap two different colliders at the same time. At that moment, the system doesn't know which collider to prefer when pushing away the player. The solution to this was to move the player first horizontally, check collisions, then move vertically, and check collisions once again.
​
I added functionality for SpriteSheet because we decided to do 2D rendering instead of 3D to simplify certain aspects. SpriteSheet simply traverses an image by changing UV coordinates. Event functionality was also added to the SpriteSheet that calls an event when a certain frame is reached.​
​
A big concern that was discovered was that the player's physics behaved differently depending on the frame-rate of the game. The way it worked before was that we were using a friction constant, which lowered the player's speed every frame. The issue occurs when you try to multiply this value with the delta-time to make it independent between frames. To fix this, I removed friction and implemented another way to “simulate” friction. When the player stops moving, a fixed amount instead reduces their speed.
​
Another main-focus I had was to implement the camera, which went through a lot of iterations to make it feel right. When the player runs, the camera lags behind, so the player can see more of the level ahead. However, one complicated feature Rayman has was predefined movement on the vertical axis that changes depending on the layout of the level. I deemed this too much work for the other disciplines, and instead decided to implement some system that detects when to move the camera vertically. ​When the player is above or below some limit, then the camera starts to move.​​



