Expanding upon a previously produced game in OpenGL, I produced a DirectX implementation of spatial illusions, featuring 4 unique levels.
Previous low-level graphics API development conducted by myself utilised a specific development pipeline targeted towards 2D platformer gameplay. This work introduces an Entity Component System (ECS) to enforce modularity, where hierarchy and class structure was carefully designed to formulate individual gameplay layers such as collision, physics, and mesh rendering.
Three levels of the game feature a seamlessly integrated teleportation trigger to produce illusions such as an endless corridor, or a falling loop trap where the player repeatedly finds themself back where they started. The fourth level includes a dynamic environment, where block textures shift when out of the player view frustum.
Alongside a modular integration pipeline, the application also includes lighting which can be toggled, a skybox, a first person player controller, and varying geometries. There are also collectible crystals which promote the full exploration of the perplexing virtual environments.
DirectX 3D 11, C++, PC.
Fly to the Moon is a vertically endless 2D platformer that I created using C++ and OpenGL.
The player must hold space to use their jet pack to ascend through the sky, whilst trying to hit certain interactables whilst avoiding others. These affect the player in various ways, such as: increasing the player's score, reducing their speed, causing fuel leaks and fuel regeneration.
The higher the player ascends, the greater their score. As the player ascends, the background colour and ambient lighting darken significantly.
This game utilises a large portion of OpenGL's functionality, including unique vertex and fragment shaders, a projection matrix with a view (operated using a Camera class), texture loader, optimised vertex data, and shader programs. These have been used to create specific effects, such as the darkening game world whilst the UI, and the moon, remains at a constant light intensity. Fragment shaders have also been used to create effects such as changing colour of the background, and the fuel gauge using uniformed variables.
Additionally, there is a simple, but complete character controller with two textures depending on the direction they are facing, score and high-score tracking, scrolling clouds as well as a comprehensive collision and physics system. The physics system has two fundamental functions: adding force, and adding impulse. These are used as basic functions for player movement and responses to collisions. The collision system primarily works by checking the bounding boxes of the player compared to each platform within their range, and generating collision data for successful collision, such as the direction of collision (normal), and the magnitude of the collision (penetration). This is used to create a vector, which can be used to resolve the collision.
C++, OpenGL, PC Game
Fly to the Moon -
OpenGL / C++
Jelly Up! Clone - C++ / SFML
This is a clone of the original 'Jelly Up!' game, which involves a square moving horizontally on a platform, attempting to avoid the edges of platforms which do not have walls through jumping to the next platform, in order to avoid falling off the edge. Each time the player reaches the next platform, the score is incremented. As the player's score increases, platforms gradually get thinner, demanding faster reaction times.
This clone includes a title screen, shop (where different player colours are unlocked using the in-game currency) and two levels, where the second level includes an additional level of functionality. Both levels contain coins for the player to collect, challenging the player to choose between safety and collecting coins. In the second level, there are green and red diamonds. The green diamonds make every platform in sight have solid walls, and the red diamonds temporarily speed up the player, forcing the user to react faster to upcoming platforms.
I created this game in its entirety, developing systems such as an in-game shop, player movement and physics updates, infinite platform generation (with optimised memory usage and garbage collection), coin and diamond spawning. I also developed a 'Jelly Up Engine' class which handled all the base functionality, using scripts for each level to add individual functionality.
The game also includes a basic sound engine for sounds such as jumping, coin collection and shop purchases. There is also the feature of parallax scrolling, where the background moved downwards at a lower rate than the platforms in order to perpetuate the illusion of the player gaining altitude.
Since platforms generate infinitely to provide an infinite game loop, efficient memory management was non-negotiable. In order to free the application of statistical dependencies (based on the number of platforms generated), old platforms would be removed from the platform array as they go out of view of the player. This would constitute a major optimisation past a score of 14, since this is the number of platforms the player can see within a single frame, accounting for a buffer platform on either end of the platform stack.
C++ / SFML, PC Game
This snake clone is a console game made using C++. Since it is a console game, a large portion of the game logic is primitive.
This clone includes features such as:
A home screen with the ability to play, exit, view scores or reset the score sheet.
A snake which can be moved using WASD or the Arrow Keys.
Randomly spawning fruit, with the occasional powerup fruit denoted 'X' which gives two points and adds a length of 2 to the snake.
Game borders with collision which trigger the snake to pass through and emerge on the other side.
Snake-snake collision which results in the end of the game.
The ability to enter your name and score into the scoresheet upon the end of the game.
A score-sheet which orders data into descending order by score.
Basic sound for collision between the snake and the fruit.
C++, PC Game (Console)
Snake Game Clone - C++ Console Game
Multiplayer + Destruction Physics -Prototype
In recent weeks, I have been working on two separate aspects of game development: multiplayer programming, and destruction physics.
Player #2 is connected to a LAN server which is hosted by Player #1. Each player can see eachother's movements as well as changes within the environment. Upon shooting a ball at a cube, the cube spontaneously fragments and explodes.
Cube fragmentation is a relatively simple process. Fragments are spawned based on the desired number of chunks, using this value as a divisor to calculate the size of each cube fragment. Each cube is given a random material and controlled force depending on the point of impact on the cube.
Combining multiplayer functionality and physics reactions with a high number of gameobjects is computationally challenging, due to the requirement to produce so many fragments within a single frame. Through a combination of chunk queueing and object pooling, the client remains well above 800 FPS even at the frame where collison takes place, and the cube separates into 216 individual objects. Having tested on multiple devices connected to the same network, reliably low latency serves as the foundations for an upcoming local co-op multiplayer game filled with destruction and high explositivity!
The depiction is in a GIF format for size reduction, reducing perceived framerate. The demonstration project runs smoothly on both the host and client instance.
Whilst the original 'Panzault' was 2D, this is a 3D recreation of the game, created in Unity and C#.
For this project, I developed a basic environment, tank controller, enemy AI, powerups, explosion system, score system and complete game loop.
The player is a tank, which can navigate through the environment. There is an infinite wave of overhead enemy planes of two different types. Some fly directly overhead, whilst other specifically fly towards the game world, and can drop bombs on the player tank. The player must shoot planes to knock them off course, and prevent them from dropping bombs. The closer bombs get to the player, the more damage the tank takes. The tank also takes damage if hit by enemy aircraft.
The game also has two power-ups. The coins add to the player's score in the same way that hitting aircraft does. There are also red health powerups, which restore some of the player's health. However, collecting powerups inevitably distract the player from shooting enemy aircraft, resulting in an increased exposure to danger.
Creating this game demanded effective CPU and memory management due to the abundance of spawnable in-world objects such as aircraft, coins, health powerups, bombs and explosion visuals. As such, object pooling has been implemented in appropriate cases. I also developed an interactive tank controller, level system, multiple user interfaces and their functionality, and infinite levels with a fair difficulty curve.
Unity, C#, PC Game
Panzault Clone - Unity / C#
Outside the Box - C# Unity Game
Outside the Box, is a puzzle based game which is fully playable on Xbox and PC. The game was originally developed for console, but controls have been ported to support keyboard and mouse inputs too.
Within outside the box, the player must complete a series of five puzzles, increasing in difficulty, in order to escape the box. Initially, the player spawns within a 'waiting room', where there are elevator-style doors to allow the player into the puzzle room. The player must complete the puzzle, before the doors will open to allow them back into the waiting room.
Puzzles include: matching coloured boxes to their corresponding tiles, shooting a certain number of targets in the allotted time, assembling platforms to collect a gun in order to eliminate cylindrical enemies, a boss fight where you must defeat a cylindrical enemy spawning spacecraft, and finally a combination lock. The first four puzzles each give the player a number. In the final puzzle, the four numbers must be scrambled to determine the correct code, which finally allows the player to exit the puzzle room to an outdoor space, where the game ends.
Within this game, I created systems such as: the player controller including an item interact and basic weapon system, automatic doors which cannot be breached by the player, game logic for 5 puzzles, a comprehensive sound system, enemy AI, and complex player state logic. There is also a settings menu for controls such as volume and haptic feedback intensity.
Unity, C#, Xbox / PC Game
Interstellar Isles was the first console (Xbox) game I created as part of a group project, in which I was the project lead. The game involved a series of floating islands in space, which the player could navigate using their jump boost abilities. Asteroids falling through the sky threaten the player, and various landmarks on the islands.
There are three major islands, each with a special ability. One has the radio tower for turret communication, one has a jump pad, and one has the spacecraft (providing regenerative player health). The jump pad provides large jump boosts. Each island has a turret with a corresponding satellite, which the player must rotate towards the radio tower. All landmarks could be subjected to asteroid damage, which would restrict the player's unique abilities.
The player has a weapon which they can shoot asteroids with, and there are additional weapons available on other islands.
Within this project, I managed all project lead responsibilities including hosting team meetings, delegating tasks and responsibilites and ensuring deadlines were met in a timely fashion. I also designed a number of the game's core features and mechanics.
I also worked as one of two gameplay programmers, creating core features such as random island deviations through space, the damage animation states of all 9 landmarks, flow of the game from one state to the next, asteroid spawning, all collision events and an infinite wave system.
Unity, C#, Xbox Game
Backstreet Bash was created for a group project, where I worked as the programmer to develop gameplay mechanics. I was also responsible for any work relating to application flow, from the basic animations displayed on the intro screen, into the main gameplay loop, and finally to the lose-state.
I also worked with artists to ensure all necessary sprite-sheets were produced, and personally implemented the functionality to bring them to life. I also developed the animation system to swap between the idle state and shooting state for the player and enemy, accurately calculating the angle for the player's arm for an accurate depiction of aim.
The Godot Mono 2D game engine was used to create Backstreet Bash, allowing us to opt for a C# scripting solution rather than Godot's GDScript.
Godot, C#, Android Game
Don't Shoot the Messenger is a solo game created in Godot using exclusively free assets. This was also developed using C# as the scripting language.
Within the game, there are different enemy types, identifiable by their hat colour. They vary in terms of their speed, size, health points, and how much they damage the castle. Enemies move towards the castle entrances, in attempt to infiltrate.
Amongst the enemies, there will be a small number of green hat figures known as 'The Messenger'. These also seek to enter the castle, but with friendly intentions, and increase the health points of the castle.
Score is gained through number of enemies defeated, but if the player accidentally shoots the messenger, the game is over.
XP is gained through defeating enemies, which allow the player to level-up. There are five levels, with each new level giving the player access to another weapon within the shop. The weapons vary in terms of their fire rate, damage rate and accuracy. Some weapons also have unique characteristics.
Godot, C#, PC Game
Created in 2019, this was one of my first complete programming projects. It was created using Python and Tkinter.
The user can generate a random scramble pattern of length between 20 and 50. Additionally, if they are unfamiliar with the notation of the scramble pattern, a separate screen provides clarity. The timer can also be used without a scramble pattern, if the cube has been pre-scrambled or randomly scrambled. Upon starting the timer, the scramble (if present) is hidden from sight to prevent reverse engineering the scramble back to a solved cube. Once the timer has been stopped (upon solving the cube) the time is recorded in a time-sheet, along with the date and time of when this was achieved. This also reveals the scramble pattern, which can be useful if they wanted to replicate or improve upon a particularly good solve.
The scramble generator also carefully provides a variety of moves, void of inverse movements (which counter-act one another) to ensure that a valid scramble is produced. The minimum bound for the scramble length is 20, since this is the smallest number of unique Rubik's Cube turns required to ensure a complete scramble has been achieved (sometimes referred to as God's number)
The timesheet data is saved upon exiting the program, meaning the user can return to find their timesheet and averages intact. The statistics calculator conveys to the player their best solve time, average of 3, average of 5 and overall average solve time. The timesheet can also be erased in-application if the user desires a fresh start.
I created this at the age of 17 as an offline solution to online Rubik's Cube solve timers which I had used previously. It includes all of the regular functionality which is expected of a Rubik's Cube solve timer, with the addition of providing the notation for beginners or those unaccustomed to speed-solving.
Python / Tinkter, Windows Executable Application