This is a reverse-chronological listing of most of the things I've worked on. Alongside each project is a list of some of the new things I learnt during development, as well as links to all relevant pages. For a briefer overview of just the most important projects, see my Portfolio. Many of the games are available from my itch.io page.
2016 |
Mirror - One Hour Game Jam #68 - 3rd 1HGJ. The theme was Mirror. Play (HTML5) | Timelapse | Forum page.
Tweetjam - PICO-8 programs in 140 characters or less! See the collection.
Salvage - One Hour Game Jam #62 - My second 1HGJ. The theme was Jetpack. Play (HTML5) | Timelapse | Forum page.
Castle - One Hour Game Jam #60 - My first 1HGJ! The theme was Castle. Play (HTML5) | Forum page.
Generating and solving 3D nonogram puzzles [Year 4 Honours Project] - Voxelizing polygonal meshes with a raycasting-based approach, 3D logic puzzle solvers, designing algorithms for various interesting sub-problems. Award winning.
Download (Windows) | Dissertation | Video | Blog: Proposal | Blog: Demo, dissertation and download |
Blog: Finding the compositions of n | Blog: Finding every configuration of blocks in a line.
LowRezJam 2016: Micro Pico - Collection of 14 quick-fire PICO-8 microgames; making one game a day for 14 days straight. Play (HTML5) | Blog | Video | PICO-8 forum page | Jam results | GIF timeline.
Perspective Detective - Augmented Reality on PlayStation Vita [Year 4 Coursework] - Intro to AR on PlayStation Vita; refresher on complex matrix transformations; building camera vectors relative to AR markers; puzzle design. Blog | Video.
PICO-8 Projects: TinyText, MiniText, 3Text, PicoPalette - Sprite-based text rendering, making pixel art fonts, pixel dithering. Blog | PICO-8 forum: fonts | PICO-8 forum: palette.
Full Name - First Twine game. Play (HTML) | Blog: How it works.
Super Speed Neo (Prototype) - First time doing gameplay programming in 3D; first 1st-person game; basic driving AI (avoiding collisions and performing overtake maneuvers). Download (Windows) | Blog.
Tweetjam - PICO-8 programs in 140 characters or less! See the collection.
Salvage - One Hour Game Jam #62 - My second 1HGJ. The theme was Jetpack. Play (HTML5) | Timelapse | Forum page.
Castle - One Hour Game Jam #60 - My first 1HGJ! The theme was Castle. Play (HTML5) | Forum page.
Generating and solving 3D nonogram puzzles [Year 4 Honours Project] - Voxelizing polygonal meshes with a raycasting-based approach, 3D logic puzzle solvers, designing algorithms for various interesting sub-problems. Award winning.
Download (Windows) | Dissertation | Video | Blog: Proposal | Blog: Demo, dissertation and download |
Blog: Finding the compositions of n | Blog: Finding every configuration of blocks in a line.
LowRezJam 2016: Micro Pico - Collection of 14 quick-fire PICO-8 microgames; making one game a day for 14 days straight. Play (HTML5) | Blog | Video | PICO-8 forum page | Jam results | GIF timeline.
Perspective Detective - Augmented Reality on PlayStation Vita [Year 4 Coursework] - Intro to AR on PlayStation Vita; refresher on complex matrix transformations; building camera vectors relative to AR markers; puzzle design. Blog | Video.
PICO-8 Projects: TinyText, MiniText, 3Text, PicoPalette - Sprite-based text rendering, making pixel art fonts, pixel dithering. Blog | PICO-8 forum: fonts | PICO-8 forum: palette.
Full Name - First Twine game. Play (HTML) | Blog: How it works.
Super Speed Neo (Prototype) - First time doing gameplay programming in 3D; first 1st-person game; basic driving AI (avoiding collisions and performing overtake maneuvers). Download (Windows) | Blog.
2015 |
Need For Seed: Undergrowth - Ludum Dare 34 Entry - First game built in/for the PICO-8 fantasy console; first time programming in Lua; first time creating pixel art and sound effects; first post-compo game jam update.
Play (HTML5) | Ludum Dare page | Blog: post-mortem/results/favorites | Video: Timelapse | GIF Timeline.
Report on Business Innovation in the Games Industry [Year 4 Coursework] - A 3400 word report focusing on employee mental health, recent indie game design trends and the rising importance of Twitch and YouTube. Blog: Read it, stats.
Well I'm Not A Monster - Ludum Dare 33 Entry - First game built in Unity; designing a local multiplayer game about player interaction; using game design to facilitate conversation; HTML5 deployment.
Play (HTML5) | Ludum Dare page | Blog: Design, Tech, Ratings.
Particle FX Editor - First application with a full GUI (using the TGUI library for SFML); highly modifiable particle effects simulation; proprietary file format and generic base code for platform-independent implementations.
Download (Windows) | Blog | Video.
AMPS: A Musical Platforming Symphony [Year 3 group coursework and beyond] - Leading a team of 7 students; PhyreEngine; multi-platform development (PC and PS4); demoing a game to the public; visual design for player feedback and gratification; music-based game mechanics; designing level data suitable for level designers to work with; and many other things.
Download Game & Level Editor (Windows) | Blog: Dev story | Blog: Particle FX Editor | Blog: Level Editor |
Blog: What I worked on | Video: Game Trailer.
Procedural Methods [Year 3 Coursework] - What L-systems are and how they can be used to generate content; turtle graphics interpretation of 2D L-systems onto a dynamic texture; creation of an algorithm for additive terrain faulting: adding triangles to a mesh dynamically based on intersections with a cutting plane; Delaunay triangulation; height-based biome terrain coloration; post-processing to create a pencil-sketch effect.
Download (Windows) | Blog: Turtle Graphics and L-systems | Blog: Catalogue of 30 L-systems | Blog: Additive Terrain Faulting | Blog: Pencil-sketch post-processing effect | Video: Overview | Video: Catalogue of 30 L-systems.
Deep Trouble - A game played solely through sound [Year 3 Coursework] - Introduction to 3D sounds; designing a soundscape for player interaction and feedback; XAudio2 and X3DAudio; understanding the limitations of sound and how it affects gameplay; understanding the WAV file format; audio effects: panning, filters, sound cones; audio mixing: source voices, submixing, the audio graph. Download (Windows) | Blog: Overview and game design | Video.
Play (HTML5) | Ludum Dare page | Blog: post-mortem/results/favorites | Video: Timelapse | GIF Timeline.
Report on Business Innovation in the Games Industry [Year 4 Coursework] - A 3400 word report focusing on employee mental health, recent indie game design trends and the rising importance of Twitch and YouTube. Blog: Read it, stats.
Well I'm Not A Monster - Ludum Dare 33 Entry - First game built in Unity; designing a local multiplayer game about player interaction; using game design to facilitate conversation; HTML5 deployment.
Play (HTML5) | Ludum Dare page | Blog: Design, Tech, Ratings.
Particle FX Editor - First application with a full GUI (using the TGUI library for SFML); highly modifiable particle effects simulation; proprietary file format and generic base code for platform-independent implementations.
Download (Windows) | Blog | Video.
AMPS: A Musical Platforming Symphony [Year 3 group coursework and beyond] - Leading a team of 7 students; PhyreEngine; multi-platform development (PC and PS4); demoing a game to the public; visual design for player feedback and gratification; music-based game mechanics; designing level data suitable for level designers to work with; and many other things.
Download Game & Level Editor (Windows) | Blog: Dev story | Blog: Particle FX Editor | Blog: Level Editor |
Blog: What I worked on | Video: Game Trailer.
Procedural Methods [Year 3 Coursework] - What L-systems are and how they can be used to generate content; turtle graphics interpretation of 2D L-systems onto a dynamic texture; creation of an algorithm for additive terrain faulting: adding triangles to a mesh dynamically based on intersections with a cutting plane; Delaunay triangulation; height-based biome terrain coloration; post-processing to create a pencil-sketch effect.
Download (Windows) | Blog: Turtle Graphics and L-systems | Blog: Catalogue of 30 L-systems | Blog: Additive Terrain Faulting | Blog: Pencil-sketch post-processing effect | Video: Overview | Video: Catalogue of 30 L-systems.
Deep Trouble - A game played solely through sound [Year 3 Coursework] - Introduction to 3D sounds; designing a soundscape for player interaction and feedback; XAudio2 and X3DAudio; understanding the limitations of sound and how it affects gameplay; understanding the WAV file format; audio effects: panning, filters, sound cones; audio mixing: source voices, submixing, the audio graph. Download (Windows) | Blog: Overview and game design | Video.
2014 |
DirectX11 Shaders [Year 3 Coursework] - Understanding the programmable pipeline: vertex, hull, domain, geometry and pixel shaders; uniform and proximity-based tessellation; creation of a per-primitive wireframe mode based on proximity to a control point; introduction to post-processing effects (specifically blur and edge detection); displacement mapping to create a terrain from a heightmap; height-based terrain coloration.
Download (Windows) | Blog 1: Uniform tessellation, post-processing | Blog 2: Proximity-based tessellation and wireframe.
ClassGen - A scripting language and compiler for generating C++ classes [Year 3 Coursework] - Introduction to Bison and YACC; understanding the different stages of a compiler; understanding syntax and semantics; designing a language to solve a problem; using Backus-Naur Form to describe a grammar; writing interpreters, symbol tables, parse trees and artifact generators in ANSI C. Download | Blog.
PongOut - A networked multiplayer game [Year 3 Coursework] - Introduction to networking; event-based I/O with WinSock and WSAAsyncSelect; designing a communication protocol; calculating latency and establishing a simulation time scale; prediction and interpolation; mirroring the view for different clients; handling disconnects and reconnects robustly.
Download (Windows) | Blog.
Spirit Shift - Ludum Dare 30 game jam entry - First game jam; first time working with other people on a project (1 other programmer, 2 artists); introduction to GameMaker Studio; transforming multiple viewports (scaling, translating, zooming, preserving aspect ratio).
Download (Windows) | Ludum Dare page | Blog: Overview | Blog: Viewport transitions | Blog: Ratings | Video.
Voronoi tessellation generator - Partitioning a plane to create a Voronoi diagram. Download (Windows) | Blog | Video.
PC port of Oh God Why - Texturing sprites and playing audio in SFML; linking Box2D and SFML to run together.
Download (Windows) | Blog | Video.
Oh God Why, a procedurally generated platformer on PlayStation Vita [Year 2 Coursework] - Designing a complex level generation algorithm from the ground up; introduction to Box2D; working with the official Sony Computer Entertainment documentation and sample code to get save files working on PlayStation Vita; building stand-alone software for non-devkit PlayStation Vitas; saving and restoring the state of a game; loading screens; sounds and music on the PlayStation Vita; making a robust sprite animation system; advanced features of Box2D such as bodies with multiple fixtures, performing raycasts and creating joints. Blog: Overview | Blog: Tile map generation | Blog: Box2D body generation | Blog: Enemies and collectables.
Parallelised recursive quad tree [Year 2 Coursework] - Quad trees and recursive structures; introduction to multi-threading: mutexes, semaphores, channels, condition variables; understanding CPU cache usage; sharing information between threads safely; starting and stopping threads safely; introduction to Boost; introduction to SFML; introduction to benchmarking.
Download (Windows) | Blog | Video.
Making a 3D scene in OpenGL [Year 2 Coursework] - Rendering text in the environment and relative to the window; loading and rendering models; skyboxes; connecting modular level segments; generating geometry; basic infinite terrain; calculating shared normals; manipulating the matrix stack; hierarchical modelling; contextual controls; the stencil buffer; reflections; shadows; types of lighting and attenuation. Download (Windows) | Blog: Overview, part 1 | Blog: Overview, part 2 | Video.
Download (Windows) | Blog 1: Uniform tessellation, post-processing | Blog 2: Proximity-based tessellation and wireframe.
ClassGen - A scripting language and compiler for generating C++ classes [Year 3 Coursework] - Introduction to Bison and YACC; understanding the different stages of a compiler; understanding syntax and semantics; designing a language to solve a problem; using Backus-Naur Form to describe a grammar; writing interpreters, symbol tables, parse trees and artifact generators in ANSI C. Download | Blog.
PongOut - A networked multiplayer game [Year 3 Coursework] - Introduction to networking; event-based I/O with WinSock and WSAAsyncSelect; designing a communication protocol; calculating latency and establishing a simulation time scale; prediction and interpolation; mirroring the view for different clients; handling disconnects and reconnects robustly.
Download (Windows) | Blog.
Spirit Shift - Ludum Dare 30 game jam entry - First game jam; first time working with other people on a project (1 other programmer, 2 artists); introduction to GameMaker Studio; transforming multiple viewports (scaling, translating, zooming, preserving aspect ratio).
Download (Windows) | Ludum Dare page | Blog: Overview | Blog: Viewport transitions | Blog: Ratings | Video.
Voronoi tessellation generator - Partitioning a plane to create a Voronoi diagram. Download (Windows) | Blog | Video.
PC port of Oh God Why - Texturing sprites and playing audio in SFML; linking Box2D and SFML to run together.
Download (Windows) | Blog | Video.
Oh God Why, a procedurally generated platformer on PlayStation Vita [Year 2 Coursework] - Designing a complex level generation algorithm from the ground up; introduction to Box2D; working with the official Sony Computer Entertainment documentation and sample code to get save files working on PlayStation Vita; building stand-alone software for non-devkit PlayStation Vitas; saving and restoring the state of a game; loading screens; sounds and music on the PlayStation Vita; making a robust sprite animation system; advanced features of Box2D such as bodies with multiple fixtures, performing raycasts and creating joints. Blog: Overview | Blog: Tile map generation | Blog: Box2D body generation | Blog: Enemies and collectables.
Parallelised recursive quad tree [Year 2 Coursework] - Quad trees and recursive structures; introduction to multi-threading: mutexes, semaphores, channels, condition variables; understanding CPU cache usage; sharing information between threads safely; starting and stopping threads safely; introduction to Boost; introduction to SFML; introduction to benchmarking.
Download (Windows) | Blog | Video.
Making a 3D scene in OpenGL [Year 2 Coursework] - Rendering text in the environment and relative to the window; loading and rendering models; skyboxes; connecting modular level segments; generating geometry; basic infinite terrain; calculating shared normals; manipulating the matrix stack; hierarchical modelling; contextual controls; the stencil buffer; reflections; shadows; types of lighting and attenuation. Download (Windows) | Blog: Overview, part 1 | Blog: Overview, part 2 | Video.
2013 |
Twin-stick shooter on the PlayStation Vita [Year 2 Coursework] - Introduction to programming for the PlayStation Vita; programming 2D physics; handling collision detection and response for large numbers of objects; creating a spacial partitioning system; creating a particle emitter; touch input; analog input (sticks); more advanced use of inheritance; lots of work with pointers. Blog | Overview video | Particle effects video.
Lee and A* pathfinding algorithms [Year 2 Coursework] - Introduction to pathfinding; working with the standard console; more detailed look into different data structures and their uses; the Lee algorithm; the A* algorithm. Download | Blog | Video.
Prototype musical tower defense - Seamlessly looping MP3 files in Flash; dynamic layered music. Play (Flash) | Blog.
Infinite runner in Flash [Year 1 Coursework] - Introduction to ActionScript3; basic sprite animation; music and sound effects; basic procedural generation; creating a buffering system; more advanced state machines; parallax scrolling. Play (Flash) | Blog.
Sudoku on the Game Boy Advance [Year 1 Coursework] - Rendering sprites; having a menu system; state machines; further features of programming for the GBA such as layers and tiles. ROM download | Blog | Emulator.
Lee and A* pathfinding algorithms [Year 2 Coursework] - Introduction to pathfinding; working with the standard console; more detailed look into different data structures and their uses; the Lee algorithm; the A* algorithm. Download | Blog | Video.
Prototype musical tower defense - Seamlessly looping MP3 files in Flash; dynamic layered music. Play (Flash) | Blog.
Infinite runner in Flash [Year 1 Coursework] - Introduction to ActionScript3; basic sprite animation; music and sound effects; basic procedural generation; creating a buffering system; more advanced state machines; parallax scrolling. Play (Flash) | Blog.
Sudoku on the Game Boy Advance [Year 1 Coursework] - Rendering sprites; having a menu system; state machines; further features of programming for the GBA such as layers and tiles. ROM download | Blog | Emulator.
2012 |
Modelling a 3D environment in Maya [Year 1 Coursework] - Introduction to 3D modelling in Maya; understanding the asset creation pipeline; how models are constructed from primitives (triangles!); different types of lighting. Blog | Video.
Tetris on the Game Boy Advance [Year 1 Coursework]- Introduction to Object Oriented Programming; understanding low-level architecture (particularly graphics: frame buffers and double buffering, color palettes, rendering text); bit-wise logic; user input. ROM download | Blog | Emulator.
Tetris on the Game Boy Advance [Year 1 Coursework]- Introduction to Object Oriented Programming; understanding low-level architecture (particularly graphics: frame buffers and double buffering, color palettes, rendering text); bit-wise logic; user input. ROM download | Blog | Emulator.