Built to give designers control, this engine uses raycasted rendering to make retro style games.
An exercise in:
Decoupling a larger application
Following C++ guidelines and standards
Defensive coding to give designers plenty of freedom without the ability to break core systems.
Implementing programming patterns
UI/UX Design and Implementation.
Using ImGui I made a level editor to allow designers to place textured blocks where desired by safely editing the level data. Level data is stored in a simple .txt file.
This could lead the user to manipulate data in an invalid way that could crash the program. I wanted the user to have access regardless so I carefully programed the level reader so that it can detect incorrect data and appropriately handle the issue.
For example:
The order data is stored in doesn't matter and the reader just searches for keywords; if they aren't found the program will output an error and not load the level.
Protection against trying to use a texture outside the valid texture list causes the program to display a missing texture.
I decreased the resolution of the buffers and upscaled it just before it's displayed.
Raycasting samples textures vertically so by rotating the texture data by 90° I could improve data locality and save a couple milliseconds per frame.
Command pattern was used in the undo/redo implementation. By saving a stack of command pointers it's easy to undo/redo changes to the map; there are plans to use this to easily change hotkeys.
Sandboxed levels are made by inheriting a base class that has all systems needed for level creation.
Component pattern use to divide gameobject behaviour into components to allow for logic reuse.
Update loop pattern handles all per frame behaviour and input detection
Jira alongside Git and Github was used in project management. Any tasks or bugs were added to the board with a priority and tasks were done on a priority basis so any program breaking bugs or nessecary features were done first then slightly less important features and so on.
On Github, any commits were named based on the issue id alongside either the task name or a description of what changed eg. "[Raycst-35] Textures are read from Level". Commits were done little and often which really helped with debugging as the faulty code could be very easily found.