Retrospective and statistics on Word Slinger

My game (Word Slinger) has been now for a little over three months in the Play store. It has now reached over 1000 (yes, you read correctly!) downloads. I think it’s pretty remarkable in the context what I had originally expected and hoped for.

My original goal was to learn to create an Android Game and upload it to Play store to have it available for anyone who would find it entertaining and interesting.

When I was creating the game I decided to push the goal a little bit further. I added some features like high scores, ads and eventually in app purchases. The idea was not to make money with it rather learn how to do it and _maybe_ cover some of the development expenses.

I am gonna analyze how it has succeeded so far. Here are some graphs about the progress.

Progress of downloads:

WS_installs_1Q2014

There’s nothing remarkable here really. The spikes in daily installs are due to the marketing campaigns I have run on FB.

Admob requests / clicks:

WS_admob_1Q2014

This chart boils down into few things. Clicks are very few, 62 total so far. Yes, people probably doesn’t like ads and are not clicking unless something very interesting comes up. I hope irritation (or should I say attitude?) doesn’t prevent from clicking something interesting. One thing that is not showing here is that almost all clicks are from the USA, almost 95%. Maybe the ads culture is developed further there than in EU?

It’s interesting how little revenue this creates. My game should have 1000 times more active users and if the clicks (and revenue) scale linearly then this could cover some of the costs, now it really doesn’t.

Income from the in app purchases:

WS_earnings_1Q2014

 

I have smudged the actual amounts but make no mistake about it, the total revenue is very very low. I barely got to the target of getting purchases so I could buy myself a cold beer. This is the scale of things 🙂 Nevertheless, at the start there was some action in IAP side but lately it’s next to none, like you can see it’s gone down by 75%.

This is the statistics (or some of it) for the first quarter for my game. One of the blog visitors said wisely that do games for fun, not for money. It has certain wisdom in it. Of course, by looking the numbers provided doesn’t proof anything else but having the money factor in place it causes more anxiety and maybe empty hopes.

Unfortunately I haven’t got any feedback how people like my game (or if they don’t). No feature requests or not even a single bug report. Maybe 1000 is a little too few to get to there? Anyways, inspired by the statistics I am planning to update the game and hopefully this yields more downloads and happy gamers.

In App Billing

In the last post I wrote about how I have been adding In App Billing to my game. During the Christmas I had enough time to finish and test the implementation. Thanks to my IAP testers as well!

Adding the In App Billing can done in few simple steps. You need to do the following (at least):

  1. You need to have Google Wallet merchant account
  2. Download Google play billing library with SDK Manager
  3. Add the application to the Developer Console
  4. Implement the workflow
  5. Test the application

A complete tutorial can be found here.

Unfortunately the example code provided by Google isn’t very good. It contains some bugs, some serious ones too, so you really need to know your workflow well and understand the example. The util classes you are going to import (if following the Google tutorial) as part of your app contain class named IabHelper. This class has a variable boolean mAsyncInProgress which is a flag to allow one Async call per time by the helper. This flag is modified by methods flagStartAsync and flagEndAsync which are package-private scope.

Well the class doesn’t do very good job since sometimes you get IllegalStateException when using the IabHelper. (Extra note: I personally don’t like this type of naming of the variables with scope because it prevents the use of code generation with modern IDEs like Eclipse).

You probably can find related articles and posts in different forums, like SO (StackOverflow) and some of them guide you to change the flagStartAsync and/or flagEndAsync to public and verify manually each time by calling that method so it will not throw an exception. Some say wrap your code with try catch blocks to prevent it.

Well, I think the code author wanted the flag to be handled internally and that’s the reason for package-private visibility. Surrounding the code with try catch is bad idea too because you are really not handling the real cause, rather just the symptom.

My solution was to tweak the code so that I appropriately call flagEndAsync in correct places of the code (IabHelper). You need to check this with your own flow but this is problem many other have found as well. One issue regarding the IabHelper is the fact that it throws NullPointerException if used in Emulator. In startSetup method:

replace:

if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0).isEmpty()) {

with :

List queryIntentServices = mContext.getPackageManager().queryIntentServices(serviceIntent, 0);
if (queryIntentServices != null && !queryIntentServices.isEmpty()) {

This is probably because the Emulator packageManager cannot find the InAppBillingService intent and the returned list is null. This works without the check in real device if you have followed the tutorial and implemented it correctly.

Testing the purchase flow is whole another story. I will not get down to that now.

This is how my game currently looks. There’s few less buttons than before and few new ones. “Get hints” -button initiates the Google In App Billing flow and “Use Hint” -button uses a Hint if you have them left. For UI consistency I changed the “Exit” -button to similar “Quit” -button as in Main Screen and I removed “Next” -button which takes you to next level then you have completed the level. Now you just tap the screen to do so.

What do you think?

Image

Time for a retrospective

My game is now officially in BETA phase. The game is called WordSlinger and I have sent it to a bunch of friends who are so kind to help me testing the game.

It seems that there’s no good way of building a network of BETA testers or doing BETA. If you publish the game in Google Play then anyone can download it and play. I have understood that it’s possible to create a Google+ Group to which you can invite people and have them to test your application. I don’t have Google+ account and I didn’t feel I want to create it just for this. I solved the problem by creating a release build, signing it with my key and sending it via email to bunch of friends. I wonder how everyone else is doing this?

So, it took approximately a full month of time creating the game. I have done everything from scratch and by myself. I used FreeSFX library to find nice sound and that’s what they are credited for. Thank you FreeSFX. The month I refer here is full working time. In calendar time it’s a lot more but since I have a day job and other hobbies I was mostly working in the evenings and weekends.

I haven’t had any other costs if you don’t count the time. I am not sure if there was a developer fee for Google Play account but if there was it was quite small. If I would want to calculate the time spent as a cost then the cost is one man month. In Finland (where I live) the cost for average developer would probably vary between 3000 – 5000 euros / month. Having said that, you could get a similar game developed cheaper too. Specially because I spent a lot of time to learn things and building the engine, rather the game.

It goes without saying that if I would be doing this for money then I probably would never get even and definitely it would be much harder road to do this as for a living with these type of figures. But since my goal was to learn and have fun, not to make money, I am very happy. I am happy and I have learned a lot. I would like to turn things around and ask: Are these things (that I have learned) worth the time and possible cost of 3000 – 5000 euros ? I think they are…

I have learned:

  1. How to create an Android Activity
  2. How to run and debug it
  3. How to deploy it to emulator and real device
  4. How to utilize local database
  5. How to handle application life cycle
  6. How to draw on Canvas and to use Bitmap
  7. How to create Sounds
  8. How to read user input and gestures
  9. How AsyncTask and Threading works
  10. How Google AdMob adds can be used
  11. How Scoreloop social platform can be integrated
  12. How to draw simple buttons and logos with Gimp
  13. How to create a custom font and use it
  14. How to create a release build and sign it
  15. How to use Proguard and how to configure it
  16. How to calculate screen coordinates for different resolutions

And the list goes on. I have probably missed a lot of good points but this gives perspective. One of my goals was to learn something that I can utilize in my everyday work. If I would be doing something with Android all the stuff above WILL help me immensely. That is nice as well.

Anyways. Here are some screenshots from my game in BETA phase:

Screenshot_2013-11-10-23-13-41

Screenshot_2013-12-01-19-51-14

Screenshot_2013-12-01-19-51-51

Achievement “Avowed Intent Retracted” unlocked

I have been up from early morning to late evening, not even going outside to check what is happening. Okay, I have been slacking a bit too. I did eat and watch some football to relax my mind.

The main game is coming along quite nicely. I have been raising my ambition level once again. I am definitely not happy with bare bones implementation. I will be putting it to Google Play just to know what it takes. Along with that I have multiple more advanced ideas.

This is how the main screen looks currently. I have drawn some better(?) buttons and I did a custom font thingy. I am not sure how one is supposed to do these in games but I drew my custom font and I was thinking to show some of my texts in the game with this a bit more fancy looking purple with white shadow font. Objections?

Image

It seems there is a whole lot of things to consider when drawing directly to the “screen” and I am starting to have doubts that this is the right way. Having a game engine would probably solve at least some of the issues. At least if it’s any good. Mine isn’t since I have to implement every small thing by myself. Like I am having MASSIVE trouble when doing a “High Score” -screen since I need some keyboard, keys and then I need code check the key events and stuff.  And I need to draw all that too!

There’s already stuff for this in the API but since uh, this is custom engine, I am out of luck. Or skill? Probably both. It looks like I am in the edge of rebuilding this whole thing in some already proven engine or then I have to do some heavy refactoring to my engine. Either of the options do not seem very nice.

Other problem I already had was with gestures. I have a instructions page and it’s a bit longer what I expected and it needs some kind of scrolling. Well, would you mind adding a component provided by Google? I wouldn’t but it doesn’t fit in because I draw directly to the bitmap by using Canvas. If anyone knows how to do it, it would be really nice to hear.

Oh well. This is what development is. Let’s see how things proceed. Now where is my bottle of beer…