KnightLight
Role
Gameplay / Systems Programmer
Description
A 2D puzzle-platformer where you light your way through the darkness. Play as the Light, exploring an abandoned civilization where you find a suit of armor that seems to have magical properties. Suit up using the powers of the suit to channel your light magic to see what this strange place hides.
Contributions
The Editor
Using ImGui, I was in charge of designing and implementing a user-friendly and customizable editor for our C++ engine. This editor would be used as an interface for our designers, allowing them to iterate quickly and efficiently without needing to work directly with C++ code. Since our designers were used to Unity, I made the editor in a similar style to the Unity editor.
​
The editor included a Hierarchy window where you could select any entity in the scene. Each entity could be expanded to view its children entities.
When an entity was selected, the Inspector window would show all the components attached to the selected entity, and components could be added and removed.​​ Any component could be opened/closed, showing all properties that the component draws. ​


EditorShowcase
I also created a scene viewport which would render the game's framebuffer texture to an ImGui viewport texture as an image.
​
​The editor was not only made for the designers; I also built it with the other programmers in mind. Every Object class automatically had its own window, and all one had to do was simply override the Editor Render method, and render whatever they wanted to their window. This allowed for an easy view of any variable information in the editor for all systems and components.
​I created a scenes window that listed all the scenes as clickable buttons, allowing quick navigation to any scene. I created a similar window but for saves. I made a Windows tab where any window can be opened or closed.
I also made a texture browser where all textures in the assets folder are loaded and can be selected. To support debugging, I built an in-editor Console with color-coded logging. Finally, I made a control bar that allows for stopping, pausing, and stepping through the game.
Event and Input Systems

Using GLFW callbacks, I created an event system that allowed bindings of functions to user-created events. Using this system, I created an input system that tracked the current and previous states of all keys and mouse buttons. On KeyPressed/KeyReleased and MouseButtonPressed/MouseButtonReleased events, the states were updated. Using those states, I determined whether a key was down, up, or triggered. I also implemented static functions for quick access to a key's state and the position of the mouse in screen, window, or world coordinates.
Logging System
Using spdlog, I made a logging system that logs messages and debug information with time information. It outputted any logged messages to the in-editor console and color-coded it to match the severity level. The system also had trace functionality that outputted messages to a Trace.log file.
Player Controller
KnightLight features two different characters that you can play as: the Light and the Knight. The Light is faster, more agile, and can travel through pipes, but prone to death by spikes. The Knight is slower, heavier, and cannot move through pipes, but can walk over anything. I created the player's state machine, which included idle, move, jump, and fall states.
Sequence Manager
I created a sequence manager, which simulated inputs for a fixed duration. This was used for some cutscenes to make the player move on its own.
