I feel good about the game engine that I've developed while working on Light Racer. The only big thing that will be different about Light Racer 3D is that instead of drawing 2D sprites, each object will need to be rendered as 3D. To me, this sounds very simple. I plan on modeling everything in the game in 3D Studio Max, developing custom bits of rendering code then merging the 3D world renderer with the existing code base and tweaking to perfection. I'm confident that this will work, yet I'm pretty bad with 3DS, I've never developed anything in OpenGL, much less ES, and I have no existing tools to help me on my way. There has been a lot of reading and experimenting done, but at the end of the day, I have a working scene and a working OBJ file importer that maps textures correctly.
The initial update (2.0.0) of Light Racer was very shakey. I'm not entirely surprised, though. When I put out a game or a new app, I like to watch for feedback or signs of acceptance over the first few days. With this update, I got a lot of negative feedback about how the update ruined the original game. I was confused by that because I specifically put in the time trial mode to try to follow up the original version. I had underestimated how much many people enjoyed the simplicity of Light Racer 1. The first update addressed that issue by adding in classic modes and response to the update has significantly improved.
The last 4 days of work were some of the most intense. Finishing up a project always is. The majority of the work was completing all of the little things like music, sounds, preferences, menu options, layout and UI tweaks and vibration. What's really interesting about the last few days is how some of the most critical bugs tend to pop up right then. For instance, when we added a how-to-play dialog to the game just today (on the release day), it brought up a massive bug where the user couldn't input any control at all. I figured out why that was happening but am still having a few problems with that now and then. Perhaps someone could explain why a thread waiting on a synchronized block gets stuck waiting even though the mutex is bring locked and freed by another thread many times over? Even with that, we managed to get everything together and get the game onto the market!
The past several days of work have been focused on two things: Achievements and Leaderboards. We implemented an AchievementsCalculator that was called after every round and each multiplayer match. The achievements themselves are simply stored as a set of SharedPreferences. I decided to go that route because of how much simpler the implementation is than using an SQLLite Provider. I used a Provider to do the stats on Wuzzle and I believe it's simply overkill for storing 15 booleans. The leaderboard was a little more complex. Fortunately I had written most of the code once before when doing the Online Multiplayer code for Wuzzle so it was a matter of copy, paste and modify. The client uses REST/JSON to communicate with the leaderboard server which is Ruby on Rails deployed using Phusion Passenger on Apache.
After becoming slightly demoralized at the number of hours it was requiring to get through this game, I decided to ask my brother to help out. He is in college right now for CS and we both thought it would be a good thing for us to work together on this. It turns out that it's been a great choice because he's really been doing a lot of great work and in turn, I'm getting more energized and motivated to finish this title off. The past 3 days have been spent working out the accessories of the game which include ending screens, opening screens, achievements, settings, pop-up notifications and other details. That's the vast majority of what remains of development, but I believe it's a very important part for having a well-polished product.
The past 7 days of coding has possibly been the most frustrating in the entire project. The fact of the matter is that writing really good, efficient real-time multiplayer code is hard if you've never done it before. I spent days ironing out the kinks and ended up reworking the protocol more than once. There were several times where I just threw my hands up and walked away from the computer. Major hurdles included: having to ditch TCP because of latency, finally getting around to learning NIO but having NIO problems on Android. All in all it was a tough week but at the end of it, I have a game that's at least playable at 30-60fps over WiFi without too many problems.
Upon last check of the Android market, there are over 4000 applications and games in total. One strange and interesting app that I've come across lately is called FaceIt. FaceIt is an app which listens to sound from the phone's microphone and shows a mouth which opens based on how much sound it's hearing.
According to my 2nd revised project plan for Light Racer 2, I was to have a release done on June 5. The core game has been done for a few weeks but the complexity and difficulty of getting the multiplayer system to work well has thrown that date right out the door. The last 4 days of work have been focused specifically on getting the basic multiplayer code to work. This means connecting two phones together, starting a game and playing it. Today I had a breakthrough, after weeks of work I was finally able to play against myself using my phone and emulator. There are tons of bugs and it's not yet complete but it was good to actually see it all working.
Developing a couple of screens with some networking code that can make them talk to each other sounds like a simple enough task on the surface, but when you set out to develop multiplayer menus that need to handle every kind of situation that can happen on a mobile device as well as be able to understand and respond to future protocol versions, it's a much more complicated job. I definitely underestimated this task, giving myself just two days to get it done. It ended up taking closer to six, and there are still a few problems that will need to be fixed before the final release. I believe that the design I used is sound and this code will hold up against the test of time.
After letting several people play the game, I've taken their feedback and incorporated it. I spent a lot of time debating how I was going to handle the continue screen. It was frustrating me because it was confusing to people and it wasn't going to work well to try to overlay an Android UI on top of it since it's still in-game. I also finally added in the new solo menus and added a new game mode based on the original light racer - Speed Trial mode.