<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-01-16T23:14:01+00:00</updated><id>/feed.xml</id><title type="html">Adam Grann</title><subtitle>Adam Grann is a game programmer based in Dundee.</subtitle><entry><title type="html">Audio Project Feedback</title><link href="/jekyll/update/2025/01/16/audioFeedback.html" rel="alternate" type="text/html" title="Audio Project Feedback" /><published>2025-01-16T03:09:57+00:00</published><updated>2025-01-16T03:09:57+00:00</updated><id>/jekyll/update/2025/01/16/audioFeedback</id><content type="html" xml:base="/jekyll/update/2025/01/16/audioFeedback.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/V0fn0oI1Bas?si=APUykjPe3xNPQY18" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<p><br /><br /></p>

<p>I just received my grade for my audio project.<br />
I was hoping to receive a B for the project, to inch closer to graduating with a 2:1 GPA, and I’m very pleased to say that a B is what I received! <br /><br /></p>

<p>Overall, the instructor thought it was a very good project. However, it had some glaring flaws, and I received a bunch of very helpful feedback, which I’ll be discussing in this post.</p>

<h1 style="font-size:300%;"> Feedback </h1>

<p><b>Point 1:<br />
<i>No evidence that you’ve engaged with your audio engine’s build process for audio files. Modern audio engines have specific build processes that dictate how sound files are packaged for your game. This is where knowledge of compressed file formats is vital for modern game audio implementation. Your project appears to use the default settings for all of its audio assets. (in Unity, these settings are defined in the Import Settings for audio assets)</i><br /><br /></b>
Okay, alright, you got me. I’ll be completely honest; I forgot. As a result, all of the audio files ended being converted to the same format, which completely undermines any optimisation done outside Unity. Which leads to the second point…<br /><br />
<b>Point 2:<br />
<i>Original sound files stored in a compressed format. This means those sounds will have been compressed twice; once when originally rendered, and a second time when you build the game.</i><br /><br /></b>
Like above, this could have been avoided by engaging with Unity’s build process for audio files.<br /><br />
<b>Point 3:<br />
<i>One or more spatialised sounds are stereo files. Applying audio engine spatialisation to a file that is already in stereo will usually cause problems, as stereo files usually have their own stereo information baked into the file. Attempting to apply audio engine spatialisation to a file that is already hard panned left (for example) in the file itself will result in the game spatialisation not working correctly. (specifically the enemy sounds)</i><br /><br /></b>
What I’m gathering from this feedback is that I should have made the hard panned enemy sound a mono file, which makes sense, since there’s no need for stereo capability for that particular file. Playing devil’s advocate, though, it gave the desired effect in my game.<br /><br />
<b>Point 4:<br />
<i>The background music does not loop cleanly. Either it has clicks or glitches at the loop point or (more commonly) the music is left to fade out before the loop restarts. (specifically m_danger has a short section of silence at the start, which is very noticeable when the sound loops)</i><br /><br /></b>
m_danger is the one, ominous tone heard on the second screen of the game. In this case, the fadeout is intentional; I tried to have it play continuously, but this ended up being incredibly annoying to listen to, so I changed it to be this way. The other music pieces may have problems too, which could have been solved by cutting them properly; I’m not an audio engineer, though, so I did the best I could.<br /><br />
<b>Point 5:<br />
<i>Code elements do not appear to be designed with scalability in mind. (a lot of the code relies on hard-coded values, which would make it very hard to scale this approach up to a larger project. Some examples are CameraPositioner’s hard-coded enemies, and the movementClips and voiceClips in AudioTester.cs; not only does the code expect these arrays to be a set size (e.g. line 71, voiceClips[Random.Range(0,2)]), but the arrays actually contain a variety of different sounds, used in different contexts)</i><br /><br /></b>
This specific point represents a crossroads I faced during development. One thing I haven’t mentioned is that I had to start over from scratch halfway through the project, as I wanted to utilize trademarked assets under Fair Use; this wasn’t allowed. This meant I didn’t have as much time to clean and optimize code as I’d have liked. So, I was left with a choice: Should I spend the extra time making the code scalable and expandable, or just go for something that works? In the end, I went with something that works for this particular project. That being said, scalability should always be a priority in any software project. I’d like to write a future blog post on scalability, so stay tuned for that!<br /><br />
<b>Point 6:<br />
<i>Reverb is applied individually to multiple game objects using the Audio Reverb Filter Component. This is a very inefficient way of implementing reverb. If you have multiple audio sources that you want to apply the same reverb settings to, the correct solution is to add a Reverb group in the Audio Mixer, and route those sounds to that group. This means you can run a single reverb process instead of individual processes for each sound, and can significantly save on CPU usage. (specifically the enemy and player game objects; this approach also makes it hard to cope with different environments, were you to expand the game in future)</i><br /><br /></b>
This one’s on me again, as I did not do much work with Audio Mixers, apart from applying a low-pass filter.</p>

<p><br /><br /></p>

<p>Anyway, that’s all the feedback I got. Most of it was oversight on my part, a few points were due to choices I’d made. Hopefully, this post is useful in some way to you!</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">A Word on Scalability: Scope and You</title><link href="/jekyll/update/2025/01/16/scalability.html" rel="alternate" type="text/html" title="A Word on Scalability: Scope and You" /><published>2025-01-16T03:09:57+00:00</published><updated>2025-01-16T03:09:57+00:00</updated><id>/jekyll/update/2025/01/16/scalability</id><content type="html" xml:base="/jekyll/update/2025/01/16/scalability.html"><![CDATA[<p>As promised in my earlier blog post on <a href="https://adamgguk.github.io/jekyll/update/2025/01/16/audioFeedback.html"> my audio project</a>, this blog post will be about scalability in games programming, how it’s achieved, and its importance.<br /><br /></p>

<p><b>What is scalability?</b><br /><br />
The word scalability, according to Oxford Languages, means <i>“the ability of a computing process to be used or produced in a range of capabilities”.</i> Specifically, this refers to a piece of code’s ability to handle increasing or varying levels of demands, according to its utility.
For online games, this can, for instance, refer to properly managing server load (more players), while hardware scalability refers to designing the game to run properly on a wide range of devices and platforms.<br /><br />
The focus of this blog post, however, is on code scalability. In broad terms, code scalability refers to a series of principles a programmer should follow, in order to create code that works in a wide variety of scenarios/scopes, as well as code that will accomodate the increase of a game’s scope.<br />
Scalability also has a wide range of benefits, including ease of adding features, simplified debugging, reduction of technical debt, and the ability of less technically inclined people to tweak the code (not that I’d ever let an artist touch MY code).<br /><br /></p>

<p><b>An example of scalability</b><br /><br />
<i>QUICK NOTE: I will be using Unity-specific C# for these examples, but the principles apply for any OOP language.</i><br /><br />
Let’s take a look at some examples of good scalability and bad scalability.<br /><br />
Let’s say we’re building an enemy for an RPG. The simplest way to implement this enemy would be something like this:<br />
<br />
<i>
public class Enemy<br /><br />
{<br />
string enemyName = “Goblin” <br />
int level = 5;<br /><br /></i></p>

<p>  <i> public void Attack()<br />
 {<br />
  Debug.Log(“Goblin attacks!”) <br />
 }<br /><br />
}<br /><br /></i>
This code is very barebones, but implements an enemy class. However, it’s very, very bad and inflexible code - so bad, in fact, that the code-savvy among us are probably screaming furiously at the screen.<br />
In short order, the issues with the code are:<br /><br />
<b>Hard-coded, private values</b><br /><br />
We have an Enemy class, however both its name and level are hard-coded, which means it’s part of the code. Just like magic numbers, this is very bad for a few reason. The first reason is that we can’t manipulate it, and since we can’t manipulate it, we can’t test/balance it without going into the code and changing the value every time. It’s also hard for outsiders and non-coders to read, compared to a variable with a fitting name, such as “enemyName” or “enemyLevel”.<br /><br />
This leads to the second point - the code is hidden away due to its access level. Keeping as many variables private as possible is good, though in this case it’s bad. What if your designer wants the name to “Orc”? They’d have to go into the code to do it. With the “public” keyword, we could expose the variable in the editor, thus making it easier to change.<br />
In order to make the class scalable, we would create a new class that <b>inherits</b> from the Enemy class, and we can then define our variables there instead. However, there’s still another issue.</p>

<p><b>Writing specific code in non-specific class</b><br /><br />
Did you notice that the code in the Attack-function specifically mentions “goblin”? This is an example of using specific code in non-specific classes. Say we have an Animal-class, and we’d be looking to define a bunch of different animals that inherit from this class. If we then have a function in the Animal-class called Bark, that would mean every class that inherits from Animals would be able to bark, which is great for dogs, but not so great for elephants.<br />
The point I’m trying to make is that you want to define the <b>overarching</b> variables and functions in the base classes, and then add <b>specific</b> variables and functions in their children.<br /><br />
Using these principles, we would then have code that looks like this:</p>

<p>public class Enemy<br /><br />
{<br />
public string enemyName; <br />
public int level =;<br /><br /></p>

<p>  <i> public void Attack()<br />
 {<br />
  Debug.Log(enemyName + “ attacks!”) <br />
 }<br /><br />
}<br /><br /></i></p>

<p>and<br /><br />
<i>
public class Goblin : Enemy<br /><br />
{<br /></i></p>

<p>  <i> public void GoblinChop()<br />
 {<br />
  insert code here <br />
 }<br /><br />
}<br /><br /></i></p>

<p>Using these principles, we have now designed a very simple system that can accomodate several different kinds of enemies. So let’s quickly go over some other principles that are good to follow:<br /><br /></p>

<p><b>Keep the code clean and commented</b><br /><br />
I cannot stress the importance of clean, commented code, especially if others have to read it. This can save <b>hours</b> of work. Strive to stick to naming conventions, use sensible variable- and function names, and make sure to comment <b>why</b> the code does what it does.<br /><br />
<b>Reuse code wherever possible</b><br /><br />
Having to learn new functions takes time, so why not reuse the ones you already know? This is where <b>generic programming</b> and <b>templating</b> comes in handy, as we can define template functions which we can then define when we need to!<br /><br />
<b>Strive for simplicity</b><br /><br />
Whenever you write new code, you should ask yourself the following question: “Is this too complex? Could this be done in a simpler way?” The answer is usually yes. While complex code is great to show off to others, simple code is easy to ready and, in many cases, will be easier to maintain. Therefore, stick to simplicity.<br /><br /></p>

<p>That concludes my blog post on scalability.</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[As promised in my earlier blog post on my audio project, this blog post will be about scalability in games programming, how it’s achieved, and its importance.]]></summary></entry><entry><title type="html">Unity and Audio</title><link href="/jekyll/update/2024/12/16/audioSubmitted.html" rel="alternate" type="text/html" title="Unity and Audio" /><published>2024-12-16T03:09:57+00:00</published><updated>2024-12-16T03:09:57+00:00</updated><id>/jekyll/update/2024/12/16/audioSubmitted</id><content type="html" xml:base="/jekyll/update/2024/12/16/audioSubmitted.html"><![CDATA[<p>Today, I uploaded my final submission for the audio module at university.<br />
While I’m very pleased at how it ended up, it had a rough start.<br />
Basically, I didn’t read the assessment brief, and tried to recreate Abe’s Oddysee, assets and all!<br />
Because of this, I had to start over in the middle of the project.<br />
In the end, I created a similar project with free-to-use assets.<br /><br /></p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/V0fn0oI1Bas?si=APUykjPe3xNPQY18" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<p><br /><br />
The project contains spatial localisation, attenuation, reverb and many other interesting audio buzzwords.<br />
The core design principle for the game was “simplicity”. Basically, I wanted to see how effective Unity’s built-in audio handler was at processing audio for a simple project.<br />
While this meshed well with the scope of this project, if it were to be any bigger, I would have implemented third-party audio software, like Wwise or Fmod.</p>

<h1 style="font-size:200%;"> A brief overview of the project </h1>
<p><img src="/assets/CMP407system.png" alt="System architecture" style="width:750px;height:400px;" /><br /><br />
The core of the project is a dynamic music system, which plays music based on the player’s position relative to the enemy.<br />
It’s based on a state-machine, and looks like this:<br /><br />
<b>Calm</b><br />
There are no enemies near the player. The music player will play short pieces of music every 10-15 seconds.<br />
<b>Danger</b><br />
There is an enemy one screen away. The music fades to a very ominous track, and footsteps can be heard from the next screen over.<br />
<b>Imminent danger</b><br />
There is an enemy on screen. The music fades to an oppressive track, which will loop as long as the player remains. In the background, a timer is started - more on that later.<br />
<b>Hunted!</b><br />
An enemy has seen the player, and is actively hunting the player. The music switches to a frantic track which will override any other state, until either the enemy or player is dead.<br />
<b>Dead</b><br />
The player has died. A short, disappointing track plays.<br /></p>

<h1 style="font-size:200%;"> A word on music transition </h1>

<p>The singular most challenging part of this project was to seamlessly transition between the “imminent danger” and “hunted” tracks.<br />
While you can ask Unity to wait until an audio piece has ended to play another, it’s a bit more difficult to get it to play an audio track exactly at a specific time.<br />
For this project, I wanted the music to be played at the end of the current bar* of music.<br />
In order to calculate the length of a bar, I had to do a few rudimentary calculations.<br /><br /></p>

<p>First, I calculated the tempo of the track via Garage Band on my iPhone, which turned out to be 110 BPM.<br />
Then, I divided this number by 60, in order to get the beats per second.<br />
With the beats per second calculated, I simply had to multiply by 4, in order to get the duration of a bar.<br />
I then started a timer when the player enters the “danger” state, and when this timer reaches the calculated duration, it can change to the “hunted” track.<br />
<i> * A bar of music is the amount of beats indicated by a time signature. For 4/4 time signature, this is 4 beats, while for 3/4, it would be 3 beats.</i><br /><br /></p>

<p>And that concludes my project!<br />
Thanks for reading.</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Today, I uploaded my final submission for the audio module at university. While I’m very pleased at how it ended up, it had a rough start. Basically, I didn’t read the assessment brief, and tried to recreate Abe’s Oddysee, assets and all! Because of this, I had to start over in the middle of the project. In the end, I created a similar project with free-to-use assets.]]></summary></entry><entry><title type="html">Cause &amp;amp; Consequence</title><link href="/jekyll/update/2024/12/12/causeAndConsequence.html" rel="alternate" type="text/html" title="Cause &amp;amp; Consequence" /><published>2024-12-12T06:00:57+00:00</published><updated>2024-12-12T06:00:57+00:00</updated><id>/jekyll/update/2024/12/12/causeAndConsequence</id><content type="html" xml:base="/jekyll/update/2024/12/12/causeAndConsequence.html"><![CDATA[<p><img src="/assets/cause.png" alt="Cause &amp; Consequence" style="width:750px;height:400px;" /><br /><br /></p>

<p>Cause &amp; Consequence is my honours project.<br />
It is a 2D sandbox game with a dynamic crime AI, based on Fuzzy Logic.<br />
As the sole developer, I will be producing all aspects of the game.<br />
In the following months, you will be able to follow the development on my blog!</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Hello World!</title><link href="/jekyll/update/2024/12/12/helloWorld.html" rel="alternate" type="text/html" title="Hello World!" /><published>2024-12-12T03:09:57+00:00</published><updated>2024-12-12T03:09:57+00:00</updated><id>/jekyll/update/2024/12/12/helloWorld</id><content type="html" xml:base="/jekyll/update/2024/12/12/helloWorld.html"><![CDATA[<p>Now, I know what you’re thinking: “What an incrediby unoriginal title!”. 
And you’re completely right. But there’s a saying among programmers:<br />
<br />
“No need to reinvent the wheel.”
<br /><br />
So behind this timeless saying, I present my very first blog post.<br /><br /></p>
<h1 style="font-size:300%;"> Who am I? </h1>
<p>If you’ve stumbled upon this blog, or simply haven’t bothered to read the name printed no less than 4 times on the front page, I guess short introductions are in order.<br />
My name is Adam Grann, and I am a Danish programmer based in Dundee, Scotland.<br />
I’m currently enrolled at Abertay University, where I’m studying Computer Game Applications Development (CGAD), which I’m looking to finish with a 2:1 GPA this summer.
<br /><br /></p>
<h1 style="font-size:250%;"> What kind of programmer are you? </h1>
<p>I consider myself to be a generalist. That means I can do (or learn to do) pretty much anything regarding programming.<br />
I like to think of myself as a “life-long” scholar, and am of the belief that one can never know enough about anything.<br /><br />
That being said, I have a special fondness for 2D games in all shapes and sizes.<br />
I believe there’s an innate craftsmanship to these games that (mostly) can’t be replicated by 3D games (generalizing I know).<br />
Don’t get me wrong though; I still love 3D games - I just prefer 2D.<br /><br />
I love collaborating in teams, as there is a massive amount of knowledge one can glean from working with others.<br />
I’m also fond of working on my own, as that lets me live out my ideas and test new methods.</p>

<h1 style="font-size:300%;"> Why Scotland? </h1>
<p>Time for a bit of a rant! <br />
Scotland is a great country of innovators and trendsetters. They’ve long realized that video games are here to stay;
that’s why they have great traditions, industry and education when it comes to games.<br /><br />
Denmark, on the other hand, is way behind.<br /><br />
Until recently, there were only a handful of video game-centric educations, and none of them had very good reputations.
There’s also been next to no support from the government, who have been trying their best to pretend like the industry doesn’t exist,
even though it’s the single largest form of media in the world.<br /><br />
As there were no options suitable for me in Denmark, I decided to relocate to Scotland to realize my dream of becoming a game programmer.
<br /><br />
And that concludes my very first blog post!
<br />
In the future, I’ll be looking to share tips, tricks and observations from my journey as a programmer.<br /><br />
So stay tuned!</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Now, I know what you’re thinking: “What an incrediby unoriginal title!”. And you’re completely right. But there’s a saying among programmers: “No need to reinvent the wheel.” So behind this timeless saying, I present my very first blog post. Who am I? If you’ve stumbled upon this blog, or simply haven’t bothered to read the name printed no less than 4 times on the front page, I guess short introductions are in order. My name is Adam Grann, and I am a Danish programmer based in Dundee, Scotland. I’m currently enrolled at Abertay University, where I’m studying Computer Game Applications Development (CGAD), which I’m looking to finish with a 2:1 GPA this summer. What kind of programmer are you? I consider myself to be a generalist. That means I can do (or learn to do) pretty much anything regarding programming. I like to think of myself as a “life-long” scholar, and am of the belief that one can never know enough about anything. That being said, I have a special fondness for 2D games in all shapes and sizes. I believe there’s an innate craftsmanship to these games that (mostly) can’t be replicated by 3D games (generalizing I know). Don’t get me wrong though; I still love 3D games - I just prefer 2D. I love collaborating in teams, as there is a massive amount of knowledge one can glean from working with others. I’m also fond of working on my own, as that lets me live out my ideas and test new methods.]]></summary></entry><entry><title type="html">Network Project</title><link href="/jekyll/update/2024/12/12/networkProject.html" rel="alternate" type="text/html" title="Network Project" /><published>2024-12-12T03:09:57+00:00</published><updated>2024-12-12T03:09:57+00:00</updated><id>/jekyll/update/2024/12/12/networkProject</id><content type="html" xml:base="/jekyll/update/2024/12/12/networkProject.html"><![CDATA[<p><img src="/assets/network thumbnail.png" alt="System architecture" style="width:750px;height:400px;" /><br /><br /></p>

<p>This is a simple server/client game created in Unity.<br />
Basically,  you just launch the server, and then you can connect to it.<br /><br /></p>

<p><a href="https://manblast.itch.io/network-project">Download link.</a></p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Audio Project</title><link href="/jekyll/update/2024/10/25/audioProject.html" rel="alternate" type="text/html" title="Audio Project" /><published>2024-10-25T21:25:57+00:00</published><updated>2024-10-25T21:25:57+00:00</updated><id>/jekyll/update/2024/10/25/audioProject</id><content type="html" xml:base="/jekyll/update/2024/10/25/audioProject.html"><![CDATA[<p><img src="/assets/audio.png" alt="Audio Project" style="width:750;height:300px;" /><br /><br />
<br />
This is a 2D platformer prototype, developed for the game audio module at university. <br /><br />
It has a dynamic music player which reacts to the situation the player finds themselves in. It also has spatial audio and reverb.<br /><br />
I received a B for this project. <br /><br />
<a href="https://manblast.itch.io/unity-audio-project">Download link.</a></p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[This is a 2D platformer prototype, developed for the game audio module at university. It has a dynamic music player which reacts to the situation the player finds themselves in. It also has spatial audio and reverb. I received a B for this project. Download link.]]></summary></entry><entry><title type="html">Battlefield Bash</title><link href="/jekyll/update/2024/10/25/battlefieldBash.html" rel="alternate" type="text/html" title="Battlefield Bash" /><published>2024-10-25T21:25:57+00:00</published><updated>2024-10-25T21:25:57+00:00</updated><id>/jekyll/update/2024/10/25/battlefieldBash</id><content type="html" xml:base="/jekyll/update/2024/10/25/battlefieldBash.html"><![CDATA[<p><img src="/assets/battlefieldBash.png" alt="Battlefield Bash" style="width:750;height:300px;" /><br /><br />
<br />
Battlefield Bash is a turn-based prototype which utilizes Fuzzy Logic to determine the enemy’s actions.<br />
I made it for the AI module at uni. <br /><br />
<a href="https://manblast.itch.io/battlefield-bash">Download link.</a></p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Battlefield Bash is a turn-based prototype which utilizes Fuzzy Logic to determine the enemy’s actions. I made it for the AI module at uni. Download link.]]></summary></entry><entry><title type="html">HLSL Shader</title><link href="/jekyll/update/2024/10/25/hlslShader.html" rel="alternate" type="text/html" title="HLSL Shader" /><published>2024-10-25T21:25:57+00:00</published><updated>2024-10-25T21:25:57+00:00</updated><id>/jekyll/update/2024/10/25/hlslShader</id><content type="html" xml:base="/jekyll/update/2024/10/25/hlslShader.html"><![CDATA[<p><img src="/assets/shader.png" alt="Shader Showcase" style="width:600px;height:300px;" /><br /><br />
<br />
A shader I created for a module in uni.<br /></p>

<p>It is written in HLSL, and contains two lights (one directional, one spotlight), a heightmap, and a directional blur. It also contains shadowmaps and a wireframe mode. All parameters can be manipulated. <br /><br />
<a href="https://manblast.itch.io/shader-showcase">Download link.</a></p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[A shader I created for a module in uni.]]></summary></entry><entry><title type="html">Rollio</title><link href="/jekyll/update/2024/10/25/rollio.html" rel="alternate" type="text/html" title="Rollio" /><published>2024-10-25T21:25:57+00:00</published><updated>2024-10-25T21:25:57+00:00</updated><id>/jekyll/update/2024/10/25/rollio</id><content type="html" xml:base="/jekyll/update/2024/10/25/rollio.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/3aw3fqUCw_c?si=bITxCJTzO2l--UFB" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<p><br />
Rollio is a game I made in collaboration with a team of skilled designers, artists and a programmer. <br /><br />
I was responsible for prototyping the gameplay mechanics and animation system, as well as implementing all 2D elements (including the UI) and audio.<br /><br />
<a href="https://aberdillo.itch.io/rollio">Download link.</a></p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Rollio is a game I made in collaboration with a team of skilled designers, artists and a programmer. I was responsible for prototyping the gameplay mechanics and animation system, as well as implementing all 2D elements (including the UI) and audio. Download link.]]></summary></entry></feed>