Developing mobile games is no longer a Padawan, not yet a master
Good day. Not so long ago, I wrote my first article about how I was brought into the world of indie game development and what it led to. During my thorny path, I made several games, but only clones of the famous puzzle became successful and more or less downloadable.
The second will be based on the article mentioned earlier, but everything was vague with the first, and how I decided to create a new game based on the old one using the cross-platform framework libGDX, Kotlin language and what came out of it, I want to devote this article . ')
Small game trailer
What to do?
This question every time confuses me, because a lot depends on the chosen path. There are no erroneous ways in the programmer's field of activity - even if the product you make fails, the invaluable experience gained in the process of creation will not go anywhere. But, given the fairly long period of my attempts to make something worthwhile (three and a half years with interruptions ranging from a month to five months), I would like to spend my time and energy on the original game that people will actually play.
I really liked the idea of ​​the last game, I was sure that if she brought it to mind and made her total progress, some success would be achieved. In my head the flow of thoughts was the following: I have already prepared and published a game in the App Store, slightly modified it, made fewer levels, pulled up the graphics - and you can promote it. However, letting go of Google Play was stupid, especially since it all started with him. Therefore, you need to make and Android version of the game. And only after the publication of this version, you can begin promotion.
Game "94" / Game "50" - Main menu
How to do?
At first, I began to look for information on whether it is possible to make the game without using third-party frameworks, or rather, if there is an Android equivalent of the Sprite Kit in XCode. Not. Apparently, Google decided that because of the large number of third-party game engines and frameworks, you should not bother to create your own. However, Android has an official 3D API called OpenGL ES , with the help of which it is possible to create complex and high-performance 2D and 3D games.
In short, OpenGL ES is an industry standard for graphical programming (3D) designed for mobile and embedded devices. The API is represented by a set of C header files that are provided along with a very detailed specification of how the APIs described in these headers should work. In fact, OpenGL ES is a fairly simple program for visualizing triangles.
This is an explanation from the book of a wonderful person by Mario Zechner called “Programming games for Android” . He so clearly describes all the subtleties of not only working with OpenGL ES, but in principle, the process of creating a game, that after reading many of the unclassified knowledge finally formed into one picture. This book provides the foundation that must be laid before the process of immersion in game dev begins. I sincerely regret that I had not learned about this book before, I could have avoided so many problems, but, of course, better late than never. If you recently became interested in developing mobile games and wondering where to start, then this book is the best way to start (again, in my humble opinion).
Game "94" / Game "50" - Level selection menu
In the process of reading the book, I increasingly understood that, in fact, consistently, step by step, the author describes not only the creation of the game, but also the creation of his game framework. He hid work with OpenGL ES behind interfaces that he later used to create the game. I felt that in my case there was no point in repeating his way to translate my idea into reality, and therefore I decided, after reading the chapter on creating a 2D game, to read the afterword. And what was my surprise when I realized that the author described the creation of a stripped-down version of his libGDX framework! I heard about this framework a couple of times, but I didn’t think that it would suddenly appear again in sight. This discovery excited me and I immediately began to study information about this "beast".
“The Beast” turned out to be very good - cross-platform, many useful libraries (for example, Scene2d for creating user interfaces), support for the excellent physics engine Box2d, the ability to work with the project in Android Studio (and in a couple of IDEs, but I wanted it in it). But the most remarkable thing is the support of the Kotlin language. I have long been eyeing this programming language, but still my hands did not reach anything to write on it. And here such an opportunity fell - to make your game on Kotlin.
The choice was made, but the last question remained - a cross-platform framework, which means I can make a build for both Android and iOS. Having estimated that it is easier to write the code once and make two versions than later and rewrite another code on Swift in Xcode and Sprite Kit, I decided to stop at the first option and set to work.
Game 94 / Game 50 - Training Selection Menu
How much to do?
Having understood the mistakes and drawbacks of my game “94” (I wrote about it in detail in my last article), but remembering the main idea, which I liked a lot and I still like, I decided to do the same game, getting rid of these minuses .
The main problem is a large number of levels. As I already wrote, I called the game “94” just because of the similarity with the name “94%”, thinking that people making search queries in the App Store for this game will only drive the numbers “9” and “4” , and thus my game will also fall into the search results. Explaining this name, I made the number of levels in the game - this is the main problem. I came up with a gameplay, a lot of obstacles and types of player movement, but I didn’t work out to distribute correctly across all these levels so that they would not look like each other. There was no dynamics when moving from one level to another, which makes you bored by the middle of the game. And the time to create and test all levels was spent prohibitively much.
Therefore, the first thing I did was rework the gameplay, make it more alive, filling each new level with several features at once, so that the player did not have time to get bored. The game should take possession of the user from the first levels, so that he was really interested. And so I came to 50 levels - well, a beautiful number, let the game be called that way (I decided not to depart from the idea of ​​the game without text, that's why the name was again made numeric).
I do not speak in detail about the game itself, since the features remain the same, and I wrote about them in my last article.
Game "94" / Game "50" - One of the levels
I don’t go into the details of the Kotlin programming process using libGDX, as it pulls into a separate article, I’ll just say that, based on the experience of the previous game, I did this much faster and more cheerful, even though the new language and framework that the second turned out to be with excellent documentation and I quickly mastered them).
For me, the main thing this time was the development speed, because I didn’t want to spend another half a year on a slightly modified, but still the same game, I wanted to start the promotion process faster, as this is a new area for me, and I am always tempted to recognize something new, not just in programming.
How to deal with graphics?
I could carry out all the described changes myself. Throughout the article up to this point, I showed screenshots from the game “94” and the game “50” for comparison. Here are some old and new icons:
The difference is striking, isn't it? So, the graphics are clearly not mine, I finally became convinced of this. I needed a man who would make me a graphic. It is clear that there is the same freelancing and you can quickly find a designer for a certain amount. But I began to save money on promotion, and spending on a designer was not part of my plans.
And then help was offered to me by my friend, who is engaged in video shooting and editing for quite a decent time. As he explained to me briefly the essence of the process:
To create visual graphic effects, Adobe After Effects was used, in which template plug-ins were loaded and modified in three-dimensional space. For the "planet" (player) created a key trajectory of movement. Similar actions were performed to create smaller objects that appear inside the “planet” at the moment of changing the type of movement. Further, all the resulting material is recoded from the project into a PNG graphic format with the presence of an alpha channel and a transparent background with a frame rate in accordance with the capacity of 64 frames in the atlas to load the game. Also created the background for the game, and the obstacles that need to be circumvented. Changed only the visual design and format.
In fact, it all comes down to creating frames, from which you need to make an atlas, and already an atlas is used by libGDX to create animation. With the documentation of libGDX in an embrace to understand the creation of the animation is not made.
Game "94" / Game "50" - One of the levels
The only thing that had to be studied in addition was the Texture Packer program, which packs individual frames into one atlas. I chose it, since it has support for many gaming frameworks, including libGDX - you can unload the atlas at once in the format of this framework, which is very convenient. The only problem is that it is paid, but there is a limited free version, which was enough for me (although I had to temper my appetites somewhere, which nevertheless affected the quality of graphics, but this is not terrible, the graphics are quickly fixable).
To further appreciate the difference of games on the schedule, I propose to watch a short video of the cutting of the game "94" and the game "50":
Gameplay "94"
Gameplay "50"
What is monetization?
The process of monetization I have already been debugged - it is always built-in advertising with the free distribution of the game. At first it was the built-in AdMob ad, then I got acquainted with such a cool thing like Appodeal, and introduced it into the game “94”, and of course I did not bypass the “50”.
I didn’t want to include this section in the article at all, but decided to warn those who use or intend to use this tool to increase revenue from embedded advertising.
At the time of this writing, the game was sent for review on Google Play and the App Store. From the beginning of May begins the advertising campaign.
The game was more dynamic, with improved graphics, with atmospheric music and missing text. For Android, I added support for Google Play Games Services - you can log in with your Google account right in the game and try to unlock 50 achievements. They are obvious - to pass each of the 50 levels from the first time (that is, without colliding with obstacles). I did not introduce Game Center for the sake of interest, how much users will be involved with the support of gaming services (Android) and without them (iOS). Although, again, the lesser involvement of the owners of Apple devices will not give a guarantee to make an unambiguous conclusion, but nevertheless, it seemed interesting to me to conduct such a study.
Game "94" / Game "50" - One of the levels
Build APK and IPA files is very simple. The APK is created from the Build / Generate Signed APK menu in Android Studio, the IPA is created using the RoboVM fork , since RoboVM itself has long been closed, and libGDX switched to the Multi-OS Engine , leaving support for the RoboVM. You need to write the necessary configuration in the build.gradle file for the ios module and start the build with the “gradlew createIPA” command.
Why did I use RoboVM fork and not moe? For some unknown reason, after the build of the IPA file using moe, physics did not work in the game, that is, Box2d completely fell off. I asked questions on the libGDX and moe forums, but I didn't get a clear answer there or there, so I went the other way and it turned out to be successful. I am sure that the problem with moe is solved, you just need to spend time on it. If someone faced a similar problem and solved it, I will be glad to discuss it.
The most important thing at the moment is the beginning of the advertising campaign. I have already ordered several reviews and will continue to do so for some time. If after the promotion an interesting material and distinct results are typed, then I plan to write an article - a report on the work done with charts and analysis of the result.
Game 50 - Pause and Moment Type Change
Game "50" - Training and the moment of changing the type of movement
Game “50” - Demonstration of one of the types of movement - pulling to the left side of the screen, giving an impulse to the player by pressing the left half of the screen.
Game "50" - Demonstration of one of the features of the game - changing the type of movement during the level.
A little bit about checking the game
As mentioned earlier, while I was writing this article, I sent the game for review on Google Play and the App Store. It is also worth mentioning that both versions were available for testing: Beta testing on Google Play (the game was available for download via the link) and testing using TestFlight in the App Store. Therefore, the tested versions were sent to the publication: in the case of Google Play, I simply upgraded the Beta version to Working, sent the tested version to the App Store for verification.
Google Play published the game on the same day a couple of hours later, but with the App Store I had great difficulties. Of course, I heard about the high requirements for applications and games in the App Store, but I did not think that I would spend a week on publishing my game. During this time, my game was rejected by about 10 points, and there were even repetitions, because of which I had to write great answers every time for a new one. And the response form in the Solution Center is some kind of curve - a lot of text cannot be sent at once, although I didn’t reach the limit on signs, I couldn’t attach files at all. We had to send the answer in parts, which looked a bit strange. At one of these moments of the dispute, they even called me on a mobile phone from California. After a brief discussion, I realized that the game would not be missed until I corrected the schedule, although the reasons for rejection had previously indicated other things in general.
I had to urgently deal with the graphics, since my friend did not have the opportunity to help me quickly. The rush was due to already purchased and ready-to-release reviews, so from now on I will not order promotion in advance until the game or application is published in the App Store.
Again, in such a ridiculous situation, I found myself due to sleep vigilance after the publication of the game “94”. It was published from the first time, no problems. But it was made using Apple products (XCode, Sprite Kit, Swift), so, as I now think, everything went smoothly.
At the moment both versions are published, so I got off lightly.
One of the reasons for the deviation was the screenshots, I had to work on them, it turned out well, at least I missed such screenshots of the App Store.At the same time for Google Play did the same.
Total
Of course, the game is not perfect and there are shoals, but still this is my best creation so far. However, you need to continue to develop and improve your skills.
I again received a portion of experience and new knowledge, strengthened my abilities in writing high-quality code, learned a new language and framework. I hope this article will inspire someone to start learning a new one or return to their abandoned project.
And as I wrote in my last article, the most important thing is to try and regret than not try, and regret even more. Thanks for attention!
PS
In the course of this article I cited many references, I think it is worthwhile to put them in one place: