Panda7, my October challenge game is finally finished. Sort of.
I started on 1st October and finished 10 minutes into the 1st of November.
This is the first game I’ve completed and by completed I mean the first game I’ve gotten to a decent playable state.
I feel like a Java pro.
I learn best by going head first into the unknown and making mistakes and this game was full of mistakes.
I started this project not confident with Java. It was fun and painful learning the quirks and weirdness of Java.
Although similar, Java is not C#. C# makes life a lot easier.
So many code re-writes.
After writing hundreds of lines of code, my brain tells me,
“You know what, I’m only going to tell you after you’ve spent 10 hours on code, a better way to do the whole thing”.
This happened about twice a week and had me moving large chunks of code all over the place. Fortunately, I have a preference for re-writing things rather than fixing them, so this wasn’t too painful and I was used to things now working so no unusual problems there.
The biggest code re-writes were;
- Splitting everything into Controller / Input / View.
- Moving all my sprite sheet slices and their destination rectangles into a single class. A class made up of nothing but static fields and methods.
- Game Logic got re-written a few times. It finally found it’s home in a method that returns after each successful logic execution. Gave my game that staggered one after the other effect.
- Removing my event system. The game was too small for an event system and the game logic also doesn’t traditionally run like a normal game. It only executes bit of logic per update (my normal games execute all logic)
Android.. horrible Android
Fragmentation. I know that word gets thrown around a lot with regards to Android.
Some things to know about Android
- There are a gazillion different versions
- There are a gazillion different screen resolutions
- There are a gazillion different screen aspect ratios
- All 3 of these are common
Originally I had coded the game to change all my screen elements to different sizes and different spacing depending on the size of the screen.
It worked, but it was messy. The code was messy (I was inconsistent) and the game screens were inconsistent. The last run of coding was re-doing the display system.
Essentially all I’ve done is designed it for a 480×800 screen and linearly scale it for different resolutions. It means it will look a bit silly for the more squarish screens with the extra space on the sides.
Weird bugs and debugging
When I first started making the game for Android I had crashes all the time. I had no idea what caused them and no idea how to fix them. The Internet helped a little. The biggest help was my house mate giving me mini lessons memory address and stack traces (I hadn’t learnt about it before in class, I am a still a current student after all). So thanks house mate for that. It made tracking down bugs a lot easier.
My game has HD and SD graphics. If your device is over 600px wide, the game will switch to HD mode. This was a problem in my emulator which only had 128Mb of RAM. I spent plenty of time fixing it, clearing memory and only loading images that needed it.
For some reason, Android 2.3.3 would constantly throw out of memory errors when loading HD Bitmaps.
Bitmap objects have a method called .recycle(). A lifesaver.
I started coding a screen overlay, a menu with things like “Go to title screen, mute sound/music, restart game”. Mid way through I remembered that Android has a menu button. That was incredibly easy to implement so I used that instead.
I ran into problems towards the end when I found out that later versions of android tablets don’t have menu buttons. It is still a problem I haven’t fixed yet. Not sure what to do.
The easiest part of the whole process for me. I spent a couple of hours designing the game visually in Adobe Illustrator. The benefit of working in vector is I can just click on objects and I have the x,y,w,h coordinates immediately.
Rects and Rectangles
The default class Android uses for rectangles is called Rects.
A Rect rectangle is defined by left, top, right, bottom. I think it’s the same in pygame.
I hate it.
I wrote a new Rectangle class which defines a rectangle as x,y,w,h. The way god intended.
It ended up being a great idea, things got done a lot quicker and the code was tidier.
They did a couple of extra things, take in pretty much any data type in the constructor.
They remembered their original size, which allowed me to have a absolute scale method. Very handy.
Adventure mode was meant to be a main feature in my game and it’s the thing I wanted to add more than anything but time just didn’t allow for it.
Now that the game is done and it is mostly nice code, it’s doable. So if I have the time I’ll add that.
My game is a free game. I needed to get some experience with monetization so to start with I’ve got advertisements. They’re horrible and ugly but I’m not going to make a dollar for the October challenge unless I have them.
They were quite a tricky to put in. I’m not familiar with Android and I learnt everything as I went along.
What I think I did was create my game view/surface independent of the typical Android way and I believe the Ads needed the typical way.
I ended up creating a layout Java code, added my Game View and Ad View to that in code.
The ad supplier I used was AdMob by Google. Besides the above, it was a painless procedure.
Publishing to Play Store
Incredibly simple process. I uploaded it at midnight and it didn’t appear on the store before I went to sleep. It was there in the morning so my guess is it takes about 4-8 hours to appear on the store.
That’s it for now.
If you read the whole thing, thanks for reading.
Please feel free to download it and leave positive feedback and click ads.
It’s here and it’s free https://play.google.com/store/apps/details?id=com.handsomegoats.panda7
Tags: admob, ads, android, app, coding, free, game, gamedev, Google, indie, java, ld, Ludum Dare, october challenge, play, play store, post-mortem, store