[NEW UPDATE n°5]
Final implementation
Now that the demo is already available to play here I can write about the final stage of implementation.
Collisions
I forgot to mention about collisions in my previous updates. In order to reduce impact on performance, I created two layers: player and enemy. On the enemy layer, both enemy airplanes and bullets were added; while the player was on the player layer. Then, on the collision matrix, I selected to only consider collisions among those two for the game.
Skills Manager
I talked a little bit about this section in a post where I found a strange error. The main idea was to develop a manager who could show to the player a few options to enhance some skills (like in most roguelike games)
I wanted to create a system who could manage different levels of bonus/buffs based on the skill. For that purpose, I implemented a scriptable object with this information so it was easy to modify in the future.
When the selector skill is called, it chooses 3 possible skills at random and then shows the lesser bonus first (level 1). Once the player selects a skill, this skill is removed; so later if the player selects a bonus involving the same skill, it will show a next level bonus (level 2)
In order to do that, I created a dictionary where the keys are the different skills (speed, armor, roll, dash) and a ‘queue’ as a value. In this queue, the different bonus/buffs levels are listed in order. So, when the queue is called, it takes the first element, and then continues when the next when is called again to the same skill.
That is why I got the strange behavior that I detailed in my previous post.
Implementation of the scene
With every system created, it was time to put everything together. This moment was the most fun for me, because you can see how your idea takes form in front of you. Also, I have always had fun by integrating graphic and sound assets in a game.
At the beginning, I wanted to make a procedural or random generated landscape. But because of not having so much time, I decided to take a simple solution:
I make a strip with the different assets that rolls according to the time of the round. Each round (At least in the v0.1 demo version) takes 60 seconds. This stripe calculates the required time to go from beginning to end (the portal) in those 60 seconds.
When the player reaches the end, the GameManager stops the game and activates the skill selection screen. (the round end is a time based event)
In the initial design, at the end of the round an aircraft carrier would appear triggering the end of the round. With little time, I needed to make a decision since I didn’t have the asset to do that. So then I started to look for other assets and I found that an alien portal would be great for the end of the round (Also, I’m a big fan of Stargate SG-1)
Sound FX and music are elements that are important for the player experience. At least, they should be aligned with the theme or the idea that I want to transmit with the game. It was great to find chiptone, it helped me a lot in producing some sounds.
Finally, I realized that making an HTML5 version of the game at this stage would be preferable. So it could be easy for everyone to try it. In future updates I will implement the PC and Android versions since I used the new player input, it seems easier to apply new means of controlling the game.
Balancing and trying the game
Thanks to the fact that every important parameter is implemented on scriptable objects, it was easy and useful to change and try different things. I think that the game might require more fine tuning in the future though.
These screenshots show some of these scriptable objects: wave config has the information about a particular wave, and the round is implemented by using a list of those wave configs.
Next!
I will write about the ideas of future updates and my general experience with #myfirstgamejam in a postmortem post. But I must say that I am happy that I chose this jam as my first game jam. It was great to learn from this experience and watch how the community tries to help each other.
Thanks to everyone!