"Is there a real-time strategy rhythm game?"
The answer is "not really"...So I made one.
Here's a short video describing the mechanics, below it is a technical rundown...
Every level has a Conductor which manages the triggering of events and sounds, it has an array of all the Commanders in the level.
The Commanders are what players control and they keep track of what Units are owned and able to be controlled by that Commmander.
Units are the game pieces that host a variety of components which determine their function.
A metronome audibly ticks in the level, the player is able to move the camera, select and move blue units, then target and attack yellow units. When within range, a sound is played in-time with the metronome to indicate a unit is making its attack against the enemy.
The rhythm aspect of the game makes use of the Quartz subsystem in Unreal, running on a separate audio tick from the game, leading to a beat delay from what's visually happening on screen vs what is being heard. It was also primarily designed to be used as blueprints and taught me some very humbling lessons in how not to integrate C++ created classes still being edited, as changing variable through code would often break existing blueprint iterations.
I leaned heavily into inheritance so that new units and mechanics could be added by simply adding new Unreal components to derived Actors.
I created a simple damage system instead of using Unreal's existing one, because I didn't need a lot of the features it had for the prototype.
This did give me a chance to learn in more detail how delegates work, since my main experience at this point was with the Unity event system.
I made a promise to only use simple, in-editor shapes so that I wouldn't get caught up on the art aspect the game as it wasn't necessary for the concept.
I did make use of Lumen, but for fast changing camera positions this wouldn't work because it takes time for the camera to be correctly exposed, leading to a very cinematic look, but doesn't work for faster gameplay RTS is known for.
Which is why games like Stormgate aren't using it either.
I made use of the in-built pathing, which isn't very smart and doesn't account for obstacles, but allowed me to focus on the rhythm aspect of the game. I did added a little coordinate offset so groups create formations, but this doesn't account for anything other than a flat plane.
REFLECTION
This project was hard. I learned a lot about the inner workings of event systems, the difficulties of working with 2 different threads and ensuring they worked "in sync". I spent a lot of time trying to create an integrated landscape-grid component that went nowhere.
Most of the internet doesn't like talking about Unreal Engine in terms of C++, a lot of tutorials are only bluepirint based, so I got very good at reverse-engineering from those. Due to UE5 being quite new there were a plethora of bugs or issues that I'd be stuck on for days.
Always double how much time you think you need! I scoped too big and it hurt me by the end. But the idea is solid and I now know how to do it better next time.
A solo developed app where the user can rotate and edit a 3D object.
The concept is to have the surface of the sphere deform based on an imported wave file, creating a unique spiky ball depending on the audio.
External Libraries:
In it's current state the ball simple rotates and can have it's complexity adjusted by using sliders.
The sphere is structured using rows and columns, which can be increased or reduced by using the sliders created in imgui to adjust the level of the detail.
The object can be rotated locally by pressing WASD.
After texture coordinates are assigned it uses a simple vertex and fragment shader to render the object.
I saw this as an amazing opportunity to learn more about binary file reading and audio programming!
So I created a simple reader for RIFF WAVE files which outputs PCM data, and all that's left on the data side is to revert that to sample data to be assigned to vertices.
The data reading took a while because I was having to figure all of this out myself. It can currently only read RIFF wave files, since I haven't accounted for different header contents.
This taught me a lot about file structures and interpreting the way data is stored, read, and written in memory. Actually learning HOW an istream and fstream performs their function and how to use them in the best way.
The endianness in the header was an issue I've never had to combat before, since it changes in certain lines. So implementing a way to correctly interpret and test for correct outputs was a doozy and taught me about bitwise operations, which I had never used before.
REFLECTION
I didn't forsee the local rotation "bug", which I'd fix by using rotation offsets in place of overwriting original coordinates.
I was aiming way too high trying to learn OpenGL and OpenALsoft at the same time, although they are purposefully similar, it just compounded confusion.
And next time I'm using an existing file reader because fighting with file formats has taken months off of my life.
Rock-Paper-Scissors meets Poker! Bet on each piece and have all your plans get radically changed as the dealer reveals their favoured choice. Buy and bluff your way to victory against AI opponents.
We used Agile and Scrum principles, having regular sprint meetings to update and review the project, adjusting goals to better adapt to issues that arose.
I was the Co-Project Manager responsible for meetings and project-level documentation (risk assessments, etc.). I used an audio system I coded in a previous project to manage the sounds.
I composed, mixed, and produced all the audio. I modelled the cards and created the flip animation.
We first went through a paper mock-up of the game which gave us a baseline in terms of testing and helped pin-point what needs work, which we did iterate on successfully.
REFLECTION
I'd put more of an emphasis on note-taking DURING development as there were many aspects that weren't communicated clearly due the size of the team and different work-styles.
There is a slight mis-match in aesthetics via texturing, and there is often a lot on screen which is not communicated clearly, which can lead to confusion regarding whatever is going on.
The mechanics themselves often left people confused (and even confused the team occasionally), hence the big red help button, which was the most we could do at the time but could definitely be better explained through a step-by-step tutorial.
This was a very stressful project due to some issues that arose within the team, but it was all handled constructively and I'm proud of what we were able to achieve.
Transport lost souls through the underworld! But be careful, there are plenty of hazards to slow you down and you're on the clock...
An arcade time-attack, train game. You control the acceleration and tilt of your train to avoid hazards and turn as efficiently as possible to keep your speed.
I programmed the audio system used for playing all the sound in the game in-time with events. It's a class that holds an array of a custom Sound objects which allow Unity audio objects to be manipulated in the editor. Each sound has a string identifier which can be called by the event system.
I composed, mixed, and produced all the music and sound effects used for menus, levels, and trains. I even modelled some of the environment such as rocks, cliffs, and dead trees.
REFLECTION
This taught me how to coordinate with different disciplines and how various systems come together. We had a lot of "fun" figuring out the quirks of Github and Unity...A lot of progress was lost more than once.
The system I had for audio did not scale well. It used a string to search and find the correct sound in an array, but with the hand-full of sounds we had, it worked quite well. I even got Unity to change the pitch of a sound with each consecutive tilt!
I'm SUPER happy with how this project looks and feels, and I hope I get the chance to work with my friends again at some point in the future.
Combat your Inner Demons with words of affirmation! A top-down, arcade, "shooter". Run around a pixel-art dream-scape and to find a Moment of Joy to exit the level.
My first ever game project which I'm still proud of. Created using Unity, I drew all the art assets, created all the music and sound effects, and coded all the enemies and controls.
The enemies were the most challenging bit, giving them all unique ways to mess with the player. The fiery demons charge at you, the blobs shoot negative words at you, and the tendril ones summon more enemies while keeping their distance.
They each feel unique visually and they have clear damage states that took FOREVER to draw and integrate with the state-animation in Unity. There was even a fun "feature" where you could shoot the negative words to cancel them, which was kept because I liked the theming around that.
REFLECTION
I prioritised art too much. The art was not a marked part of the project and the enemy AI pathing was clunky and didn't account for obstacles. The tiles didn't always align with physics colliders, which led to awkward overlaps, and in the executeable there's a bug that crashes the game when you win.
But despite all its flaws it's a project where I learned I could create whatever I wanted (within reason). And I will always have it on a pedestal, with all its flaws.