The idea have come from a renowned documentary about flying fish which escapes from hunter fish and hunter birds by either swimming or flying. First time I have seen this documentary clip on Youtube I thought using the incredible escaping maneuvers of Flying Fish as game mechanics would be so thrilling. After some time, I finally have opportunity to try it out, and Wingzy: The Flying Fish have just become publishable for mobile.
Technical aspects of Wingzy: The Flying Fish
I have been developing games with Unreal Engine for a quite long time now, but I wanted to give Cocos2d-x a try. Firstly I have installed it, then tried to build an old project of mine with it. After some effort, I managed to compile my project, but there were a bunch of inconsistencies. Therefore I decided to go with Unreal Engine 4.
I have chosen 4.27 since it was the last version I have tested and not had any issues with. More importantly, however, Unreal Engine stopped supporting 32 bit devices with its new release 5.0.
I have implemented a generic object pooling that is capable of holding actors, components, and user widgets, or any type of object if their creat and delete operations are inherited accordingly.
I think one of the most important thing in a game is movement since the player faces and feels it first when playing it. Therefore it was the most time consuming implementation of all.
I have implemented a base movement component holding a movement direction vector and a movement speed which are set with an interpolator, and a player character movement component derived from it. In player character movement component I have tried to imitate the real movement of the flying fish. It can swim with charge under water to escape from hunter fish but cannot speed up above it except for using gravitational force in -Z direction (In Unreal Engine: Forward Vector: (1, 0, 0) Right Vector: (0, 1, 0) Up Vector: (0, 0, 1)). So, the player can speed up under water and go higher above it and fly.
Wingzy’s movement component broadcasts a delegate to tell every poolable object that it has moved significantly in order for them to be pooled if they are distant enough. It has another crucial delegate that is used to know when to trigger floating origin.
Because Wingzy: The Flying Fish is an endless runner game level manager plays an important role. I have implemented one to generate the level procedurally.
There are two different AI actors in the scene which are hunter bird and hunter fish. They are controlled with a self made AI manager instead of Unreal Engine’s AI tools. Their actor class controls the actions and inherited UMovementComponent classes controls their movement.
Collectables and Boosts
There are two types of collectables in games which are energy and bomb collectables. Energy collectable fills player’s energy boost which is lost by speeding up, and bomb collectable fills the bomb boost that clears the nearby enemies.
After some significant movement made by Wingzy, floating origin is triggered in order to prevent glitches caused by floating point issues.
Because this release is a prototype I have implemented pre-play tutorials instead of in-game tutorials in order to save time.
Sound manager controls sound effects and musics.
Issues while development
Saving the game state
Android has introduced Scoped Storage for applications after SDK 30. This is a good update to the SDK which allows developers to read/write to application specific location without granting any storage permissions from the user. Since Unreal Engine didn’t modify their code base for supporting scoped storage I needed to implement a fix to the engine. I solved the issue by changing GetSaveGamePath function of SaveGameSystem class.
Wingzy: The Flying Fish is, for now, at its prototype state. We wish to continue its development by implementing the following points:
- Developing it further by making the gameplay smoother and adding different obstacles and collectables.
- Advertising it and reach more people.
- Adding more in game assets like particle systems, animations etc.
- Making the game 2.5D
- Different underwater world implementations and designs
Planned but postponed jobs
I will implement a mobile ads plugin instead of using plugins in order to get my hands dirty with native development, but since my first objective is not monetizing the game I postponed implementing ads.
Overall feelings and results
Not especially in game development but after whatever I do, I love looking at the final product after doing it. I think everyone does. Wingzy: The Flying Fish is not a complicated game to develop, but I am so happy to see it in a market.