Project page

Speedroid3D, a futuristic racing game for Android


Status : Work in progress

-- 05/01/2010

I'm starting now a project of racing game for Android written entirely in Java using Google SDK.
This will be something between WipeOut and F-ZeroGX.

I decided to launch this project due to the fact that there is not many good game available on the Android platform, professionnal game studio are not really moving to Android.
This is the good point of it, compare to the over-satured iPhone market, a simple but good game will enjoy a far better visiblity on the Android market.

Considering the question whether to make a paid or free apps, I'm not sure yet. In fact it is too early to decide. If this game happens to be amazingly good I will try to sell it, If it's just average, I will give it for free on the Android market, and if it's absolute crap (what it is more likely it be) then I will just make it available on this page and release the source :)

Milestones for this project are:
04/04/2010 First release.
04/07/2010 First public release on Android Market.

Features:
- 3D real-time environment
- Fast-paced animation 30fps min
- Up to 20 oponnent at the same time
- Editable tracks
- Homemade high bpm soundtrack
- Network play(hopefully)

To start with this project, I will make a small and simple 3D engine featuring single texturing, vbo usage, flat lighting.
- Renderer module
- Scene management module

As for the track data structure, I don't want to create complex 3d studio-like tool to create tracks so the best way to go for now is to use a 2d tile based system, where track element can be put to form the whole track. The lack of third dimension will be later adressed by using another 2d map for height level.

-- 07/01/2010

First "big" problem to solve: let say there is ship in the game that is controlled by the player and that are objects called track element which are basically where the ship should be on: how do we detect that the ship is going out of the limit without killing performance by doing 100000 comparison each time ?

-- 09/01/2010

For the beginning of this project I will go for simples things(KISS), get something working rapidly and then refine it later. I already had enough experiences on past project to know what I am doing.
- Renderer finished
- Game general architecture (loops/callbacks) in place

-- 10/01/2010

I found out that OpenGL ES doesn't support the GL_UNSIGNED_INT type, so meshes are limited in vertices number to 65536.

-- 11/01/2010

Project is well advanced, now there are two main module to develop:
- Bitmap font handler to be able to display text on screen
- Track data structure
For this, I will go for a tile based system: each tile is a track element(ie: curve, straight line), so that a track can be described by a 2D map of elements.
Each map will be graphically described by a 2D map.

Example

For a curve:

ooolooo
oooL---
ooooooo

o is void
l is vertical straight line
- is horizontal straight line
L is a curve L form

Now, the L element description will look like that:

oooo..oooo
oooo..oooo
oooo..oooo
ooooo..ooo
ooooo.....
ooooooo...
oooooooooo
oooooooooo
oooooooooo
oooooooooo

where "." is where the track is.


-- 17/01/2010

I've implemented this idea for track description, and it works but obviously it doesn't give good results on curve because it is square based. I need another tile which is two triangle (track and void) for the curve to be more "curvy".

At least now I can display my first ever track in my game.

In the mean time what I need to implement now is bitmap font manager to be able to display text, by mapping text texture to translucent quads in front of the camera.

- Bmp font manager
- 3DS ship import and display
- Lap time calculation
- Track limit collision
After all those are done, I think I will have some pre alpha version.

-- 18/01/2010

- Bmp font manager done, some tuning needed but at least I get some text to show up.

-- 19/01/2010

I've got other ideas considering game design and features:
- Let people play their own tunes from sdcard while playing the game
- Variable daylight condition: it's easy to define atmospheric condition as paramater, ambient light, position of the sun(light vector), fog, skybox etc... in a parameter file then process the data to generate the track model with corresponding characteristics.

I will use a quad-tree or oct-tree structure to sort track element, storing direct neightbours as foliage to be able to directly access it, it is useful for many aspect of the game, for instance to quickly determine visibility area for performance issue so we only have to display the track element where the ship is on and its direct neighbour on each frame. No matter how long the track is, on each frame only 9 tracks elements will be sent to the renderer.

ooooo
onnno
onsno
onnno
ooooo

n: neighbour
s: track element where the ship is on
o: other track element

Equivalent games on Android market

There are already a few racing games available on Android Market: Raging Thunder, SpeedForge3D, Wave Blazer.

Raging Thunder was downloaded 1000 to 5000 times and costs 3e which means it gave from 3000e to 15000e of revenue, take off the 30% for Google, the final figure is 2000 to 10000e for the game makers. Let's be honest, that's not a lot for a game that looks costly to make (many people and ressources invovle), the platform is not mature enough to be able to live as full time android programmer.
On the other hand, if I choose to sell my game for 1€ and I target 13000 downloads it will make a nice 10000e of revenue additionnal to money I earn from my current job. Which I nice because I didn't had to invest on anything except time.
I could also give it for free and maybe it will reach 100000 downloads, I think every developer is dreaming of making a software that would gather such a large user base on its own.
This figure is highly hypothetical and I should concentrate myself on quality because it's the key to everything.

-- 20/01/2010

I've made my first timed lap on Speedroid3d ! But I already have some performance issue that I need to solve as the game is averaging 30 fps right now with very few triangles (about 150).
One of the easy optimisation it to remove cosinus and sinus calculation that use the java math library which is extremely slow, instead I used precomputed value stored in array, cos[] and sin[], then I won't get all possible values, only integer value, but as it is only a game, we don't care about not getting the exact calculation results.(dont forget cos(x)=cos(-x) and sin(-x)=-sin(x) so you don't get out of bound exception ;) )

http://groups.google.com/group/android-developers/browse_thread/thread/c840c722e780064f?hide_quotes=no
Interesting (and sad) the HTC G1 has no FPU so using floating point calculation tends to kill performance rapidly. That's bad because with HTC Magic it's the most common Android device out there. I think I'll have to switch to a fixed point library. I can understand why HTC is making crippled phone (low storage memory, low cpu), they need people to buy their phone over and over each year because it's their business but that won't help Android to have users with crippled devices.

-- 21/01/2010

Track Collision resolved somewhat, making collision only on 2D space simplifies calculation troumendously. I need a bit more adjustement then I will be able to move on to my next task: improving graphics. I'm afraid that making completely procedural graphics will make the game monotonous and therefore boring.

For collision a will use "a posteriori" technique that will detect collision after it occured trigger a collision event for the target, then the ship will be taken back to the last "non-collisionned" state.
I try to make my game listner/event-based at maximum because it makes the code more readable and maintenable, isolating key process in separete modules, rather that putting the whole code in a big batch-style execution block.

I like the way city is generated in this vid.
http://www.youtube.com/watch?v=-d2-PtK4F6Y
But this kind of buildings are too complex to handle on a simple phone.

-- 24/01/2010

Collision detection against square (on a 2d grid) is easy to achieved: you just have to compare each corner to the collision point to make sure it is in the defined perimeter.
On the other hand collision against triangle is way more complicated.
http://www.blackpawn.com/texts/pointinpoly/default.html
I use a method close to the first described.

 
public boolean isOnTriange(float x1,float y1,float x2,float y2,float x3,float y3,float x,float y)
    {
        float a;
        float b;
        boolean s;
        boolean s2;
        //----------------------------
        if (x2-x1 != 0.f)
        {        
            a=(y2-y1)/(x2-x1);
            b = y1 - a*x1;
 
            if (a*x3+b > y3)
                s = true;
            else s = false;
 
 
            if (a*x+b > y)
                s2= true;
            else s2 = false;
 
            if ((s!=s2)&&(a*x+b != y))
                return false;
 
        }
        else
        {
            if (x1 > x3)
                s = true;
            else s = false;            
 
            if (x1 > x)
                s2 = true;
            else s2 = false;        
 
            if ((s!=s2)&&(x1 != x))
                return false;                
        }
 
        //-----------------------------
        if (x3-x2 != 0.f)
        {            
            a=(y3-y2)/(x3-x2);
            b = y2 - a*x2;
 
            if (a*x1+b > y1)
                s = true;
            else s = false;
 
 
            if (a*x+b > y)
                s2= true;
            else s2 = false;
 
            if ((s!=s2)&&(a*x+b != y))
                return false;        
 
        }
        else
        {
            if (x2 > x1)
                s = true;
            else s = false;            
 
            if (x2 > x)
                s2 = true;
            else s2 = false;        
 
            if ((s!=s2)&&(x1 != x))
                return false;                
        }
 
        //-----------------------------        
        if (x1-x3 != 0.f)
        {
            a=(y1-y3)/(x1-x3);
            b = y3 - a*x3;
 
            if (a*x2+b > y2)
                s = true;
            else s = false;
 
 
 
            if (a*x+b > y)
                s2= true;
            else s2 = false;
 
            if ((s!=s2)&&(a*x+b != y))
                return false;    
 
        }
        else
        {
            if (x1 > x2)
                s = true;
            else s = false;            
 
            if (x1 > x)
                s2 = true;
            else s2 = false;        
 
            if ((s!=s2)&&(x1 != x))
                return false;                
        }
        return true;
 
    }
 
 


The idea is that a point that is within the triangle area belongs to the half-plane that goes from one side of the triangle and contains the 3rd point of the triangle (and this for the 3 sides).

-- 25/01/2010

Now that I have a track and ship that can go around it without going off-road, I need to populate my track with graphic content that make it a beliveable. I don't want it to be flat as F-Zero SNES otherwise there will be no point in making a 3d game.
Populating the track with elements can be done in many ways. Professional games editors will have a tool ready for game designers to build their track and add whatever elements they want to the gameplay.
As only member of my developement team, my ressources are very limited. Therefore, my idea is to build the track general layout with the technique I described before, and then on top of that, add content generated automatically be some random functions to populate the track with elements to give some credibility to my environnement.
I don't really know if it has ever been done before in such a massive way. At least I give it a try. In the end I hope I will be able to claim to have like 20 tracks to people to race on.

Procedural city generation is a hyped subject:
http://www.youtube.com/watch?v=DE4cVrALNJM=related
http://citygen.net/

-- 26/01/2010

I think I will port my engine to the PC using jOGL for Java OpenGL bindings, developing for Android is easy, but I have to wait forever between each debugging attempt on the phone for my game to be pushed to the system.
It's better to leave the debugging on the phone for OS/gameplay/hardware scaling issue but I'm better off testing algorithms on the PC.

I just read this interesting article on Gamasutra about the failure of a game called Trepasser:
http://www.gamasutra.com/view/feature/3339/postmortem_dreamworks_.php

-- 27/01/2010

Aftermath: if this project is successful, I will probably try to reuse the work done for this project in another game. I find that racing games are especially convenient in the fact that I do not need to spend much time on level design or story plot, I can create race track in a few minutes and increase challenge by giving AI more power than human player. (That is if I manage to code my track generator and my IA) Therefore I'm planning that my next Android game will be another racing game, that will be called it "Downhill King", which is about racing on mountain roads. I will focus on achieving realistic car physic behavior, with weight transfer and stylish drift.
I'm planning this game to be finish in 4 month as most of the tools will be already built from this game.

-- 28/01/2010

Procedural generation is hard because it is totaly empirical, I don't know whether it will work or not, maybe I will happen to throw weeks of work because the effect is totally wrong (too artificial, too homogenous, doesn't scale)

The more I code, the more I think that in developement, especially indie developement, the most important thing is speed: how fast can I code thing, speed is what keeps things interesting, I don't want to be stuck on a problem for days otherwise I'll be bored and scrap that project, I need to code things where I can see the result easily (and boast about how a great coder I am) that's why I enjoy making games and not text editor or middlewares. Speed is also important to reach the market, who care about a project that is 10 years graphics and gameplay will be outdated. Speed is also what's make a good programmer: everybody can achieve any project no matter what it is, but good programmer will be able to do it in less time than the bad one.
The good programmer is fast at:
- analyzing problems
- finding good solutions
- turning solutions into algorithms
- use and reuse common design
- making readable, bug free, reusable, standard enforcing code
- making a program that do what it is suppose to do and nothing else
That involves using right tools that brings the greatest productivity, using the right library when needed (licence wise), reuse the code. The good programmer is also able to decide to spend time/money on some area that will later set a better productivity.
All those things don't come naturally although some are more naturally gifted than others. I think most come from experience, and that's what my projects are for.
That said I think I'm a very slow programmer. I often find my self doing things the hard way, reinventing the wheel on each project. For instance I still wonder what is the fastest and easy on memory way to make resizable array of primitve data.

-- 31/02/2010
I have a few skyscrappers to show on my track.
I am now thinking about using Cell-Shading rendering, that would be original, and would hide a bit how cheap my models are :) Might be too expensive without shaders though.
After 1 month of developement (during my spare time), I've little a glimpse of what my game could be.

I will soon have to get my hands dirty and a use 3d modeler to models race ship (here it's a fighter taken from somewhere)
My procedural city is ok, I can generate tower from all size with as many faces as possible, I have to find simple texture that would look good on buildings, I have to add to possibility of rectangle shape building.

Note that I could have done something like that in far less time, like when I was learning programing: stuff the code in one big function and just throw it away when I realize I need to redo everything just to make a slight change.
This time the code is very clean (at least I hope), this is a real game engine, for instance: creating a track is as simple as editing a text file (litteraly), I can add as many ship as I wan to my environement, I can plug my "chase camera" to follow any entity in the world I created, off course the most interesting thing to follow is the ship controlled by the player.

On the project schedule, I know too much how projects are delayed to add more feature, to get ready, and end up never being release. Therefore I would rather discard features than delay anything. In two month there will be engine features freeze: no more work on the game logic only, gfx, gameplay, level design and presentation, and in 5 months the public release, in one way or another.

-- 01/02/2010

My next move will be the light system: light is important to the 3d illusion as it give the feeling of volume. My scene will be illuminated with the sun light. Lighting calculation is expensive but can be mostly precalculated as most of the elements are fixed objects, in fact the only dynamic thing the ship.
I also can try to use hardware opengl to manage light (then I would only turn it on for moving objects), but I often prefer to use software lighting, as it allows more finely tuned effect. All commercial games use custom lighting system, not the opengl hardware one, especially since shaders enable fully programable rendering.

Another thing I am considering is slopes, flat track seems boring, but slopes add complexity not quite on rendering, basically it is just some added height on my meshes, but because I need to calculate the height for the ship on each frame, taking into account the triangle where the ship is on. I also have to calculate orientation of the ship so the nose is not pointing into the ground.
Furthermore, if I want to do things well, I will then have to set acceleration and speed as 3 components vector and not only two, and set a force that is attracting vessels to the ground but not making them sink into it. Off course it had some computational complexity I don't know if my poor G1 will be able to handle it.


Et voila ! See how some lighting bring immediately a more realistic feel to the scene. Code is not very clean but I've implemented formulas in a correct way.
That's because we are used to perceive volume of objects by their shade, a world without it is somewhat disturbing for our brain.

-- 02/02/2010

About commercial concern, I'm willing to try to make little money out of my game but to sell paid apps I would have to have solid game content: tons of tracks, single player content like championship, challenging IA, test and retest gameplay to make sure the balance is fine considering my audience target (casual or hardcore gamer), I need to build really good graphics that will make people want to buy this game rather than any other. And all this efforts could end up in a big failure if I dont't sell any good.
In the other hand, I studied "PapiJump" business a bit, everyone who owns an iPhone or an Android phone has play this game at least once. This game is original as it is extremly simple, the guy who made this game must have done it in a Week-End, each-time someone play this game he can send his score to a web page, where he can see his place in a ladder. Obviously the game is so simple that nobody would ever bought it, still, the guy who made this game must surely have made lot of money with it, because every time someone sends his score, he lands on a page with google adsense in it.
The game is fine because it fits smartphone user habits. I don't think that common users will play a game for hours like on a gaming console, they will be much more likely to play like a few minutes when waiting for a train or in a queue line. For this kind of use, instant fun is needed, start the game and play, no fancy menus, no story plot, campaign.
And that would simplify my task a lot, except that I would need to build a solid web structure.
It will make my project easier, just focus on making a time attack game with like 10 tracks, with world record for each track and a ladder for say the last 1000 sended lap time (or race time) (so that people will still feel likely to send their time even if they are too crappy to beat the world record).

iPad ? Another battle for Android

Finally Apple released its tablet computer. Success is not guaranteed, after all, previous attempt on eBooks and Tablet PC for the mass market where not much of a success to say the least. Still, Apple's marketing power can built new market from the ground up as seen with the iPhone, let's not forgot the failure of the AppleTV, which was supposed to bring MacOSX for HD TV but was to closed/limited to be of any interest (who wants to buy a movie player that can't decode divx ?)
But as independant developer I recognize how Apple ecosystem is a great media to diffuse homebrew software (free or paid): large user community (and willing to pay for apps), centralized app store, standard api and devices.
Let's be honest, Google with Android is only trying to follow Apple footstep: Android Market is just like the AppStore, just years after, rich but close API to ensure consistent behavior user experience through all apps, (slightlty less) close ecosystem to ensure security and captivity by making sure your not getting your software from anything outside the main
Market place. In fact I only like the Google way because it's a bit more open (no bounding to crapware like iTunes, less censorship on the market place, open-source)
With the iPad, Apple might be capable of bringing a new market to life, Android can follow through, and enter this new market (with others Tablet PC manufacturer). And this will bring new opportunity for developers not only for iPhone but also for Android. In another way, anything that makes Android being important, is good for Android developers and this is new iPad becoming a new market is good for Android as it's a way for Tablet PC manufacturers to build an opposition.
Maybe iPad is the starting point a new war theatre in this mobility era, the war of the Tablet computers, let's hope Apple will not make a Blitzkrieg.

-- 04/02/2010

I'm currently working on procedural tree rendering: I'm trying to generate tree meshes by using only computer algorithms. It works pretty much like building generation: I generate 2 points of a side then rotate it to make the other side and then rotate the whole quad to another direction until I reach 360 degree.
The difference is that I choose to make more than one segment: there are 3 segment tree trunk, base foliage and top foliage, I project horizontally the upper base foliage vertices and lower top foliage vertices so that it became "enlarged".

Now the thing is that every single tree is the same, I can randomize generation parameters to make each tree look slightly different:

-foliage projection parameter: the tree foliage can become larger
-trunk segment height: the trunk can be higher
-foliage height: how tall is the foliage
-Rotation: rotate the whole tree
Maybe I should set a variable number of segments to allow more complex shapes

I could generate random texture like brown noise and green noise to see how it would look on the meshes not just flat brown and green texture.

The main drawback of my method is that since I start from a rotation to generate the mesh, trees are inevitably symetric.

As for the building I generate my trees on a grid with variable density, it is very regular: looks ok on a city but will look awkward in natural landscape, (unless it is a man made plantation). I should set a variable density and randomize a little bit tree placement (maybe by moving the generated tree slighty in x or y at random)

One problem I have to solve is to prevent elements from overlapping each other. For now I only use a method to put away triangles that would appear on top of my road track but this is not sufficient (for instance some building are half on road), I will have to make a data structure that will keep track of every element I have put on the tile and forbid any more structure to be generated within radius for any elements.

-- 06/02/2010
For now, I have a few objectives:
- Adding height dimension (ie: slopes), I think I can't avoid implemtening it, I'd rather have 3d dimension than weapon. All other racing game implement it, I can't be lazy on this feature. That's a big part, and most of the work done will need some adaptation.
- Particles system
- Overlapping avoiding mechanism

On particles system, technically particles are simple to implement but, I need to think well its implementation if I want it to be general purpose and performance wise.
For now I only use Vertx Buffer Objects (VBO), I can set my particles sprite as material and call it(glBindTexture) for each particles, with glTranslate depending of the particle position. Trouble is OpenGl calls are expensive and I try to avoid them, for instance the city is composed of one big object containing all buildings, with the texture building as material. Implementing particles as single objects will not break my current rendering logic but will create performance issue(the same problem I face over and over)
OR I can create a new "dynamic" path where meshes are not cached but loaded to the GPU every frame.

-- 07/02/2010
I'm going to first work on the particles system. I've watch some other particles system on youtube and I must say it's quite depressing. I alway see impressive things on wathever subject, I'm interested in.
Back in the days where information was not so easy to reach I could be me more confident about my own skill but each time I search for something I see people still at school achieving amazing things. Whatever, It's just the sign that I should browse the web less and work more. :)

This game demonstrates how there's no need for fancy graphism to make an amazing product:
http://www.youtube.com/watch?v=JD3HezVwWIo&feature=rec-fresh+div-r-3-HM
The key why this game is so good looking is the light handling: there are soft shadows that appears on each element, each element can cast shadow on each other and a bit of radiosity (precomputed), for instance, it's when a white element with an orange element on top, the shadow will appear slightly orange as if each elements is a light source that casts its color. In real life objects reflect part of the light they receive in their color. This his rarely taken into count in real-time CGI because it rely on very expensive calculations, of course here it's heavily precomputed.

-- 08/02/2010
I've ported the demo VIP2 http://www.sesse.net/vip2-linux/ to my linux X86-64bits (needed a few hacks), http://www.youtube.com/watch?v=SemDlkHxJow , I still enjoy this demo 10 years after it was made. Before, I use to think demomaking as some kind of sorcery. I didn't understand how some special effect where done like moving texture, deformed mesh, picture noise, some 2d effects, now by seeing the source code I understand that it is simple and straightforward: no caching (vbo), just real-time feed data, simple texture applied in a smart manner.
It will surely not be as efficient on a massive scale with tons of 3d mesh in the field, in generic scene but who cares, demos are not made to be generic or useful, but every piece of code is here to create one special effect on one short sequence.

-- 14/02/2010
I've finally made my heightmap class to work. This class has no purpose on its own since I don't want to use a heightmap as background for my race track. Instead I will be using it to describe the height of my track on each point.

-- 15/02/2010

Here is what a rendered heightmap looks like. I don't know why but I feel like going to the mountains and ride a snowboard.

Now I've tried to map my heightmap to my race track (with less elevation). I must say that the result is a bit...awkward. I need to work things out.

-- 16/02/2010
http://www.youtube.com/watch?v=cDbex2JzSPU
A big part a my inspiration comes from this game: Star Wars Racer
I love the feel of speed in this game, the very simple gameplay with no weapon, the simple background. The POD look just stupid, why would anyone in the future ride two rocket hold by a simple rope ?

-- 17/02/2010
Now my next steps are:
-Do some 3d model of ships in Wings3d
-Add shadow for the ships, I'll go for simple things like projected texture
-Preliminary works on AI
-Complete 3d gameplay
I'm dropping network support.
I have to go fast now because by the 04/04/2010 there will be a feature freeze on the engine. I will then concentrate on the graphical content.

-- 22/02/2010
I've found an interesting tutorial about Wings3D (in French):
http://axvaude.free.fr/tutoriaux/wings1/tutwings00.htm
It's pretty close to what I'm trying to realize (space ship).

-- 28/02/2010
I've just finished my first very own 3d model (642 triangles)




Well I must confess that it's slightly inspired by the Blue Falcon from F-Zero...
I have used Wings3d as modeler, the tutorial above has been extremely useful to understand the way 3d object can be generated, which tool and which transformation to used in order to achieve a certain effect, keyboard shortcuts, everything. It was really a great help.
I must say that Wings 3D is an incredibly easy soft to create 3d model it's amazing how intuitive it is, I've tried before Lightwave, Maya and 3D Studio Max, but all these software are really complicated with tons of menus and options that I can't even understand, I never felt comfortable with them, yet Wings 3d is simple and easy to use, few menus (only the necessary), modeling using surface subdivision is also very intuitive, it's just like making a sculpture except that you can go backward if you make a mistake :)
I made the texture with the incredibly professionnal tool: MS Paint (UV maps generated automtically by Wings 3D), wireframe is visible because present on the texture, it should be filled when texturing is complete.

From the project point of view, I've validated the complete 3d model creation and import process. Therefore I can now add more and more 3d hand-made model to my game.
Once again, I've found a solution that relies on the 2D tile that I choose as the structure of my tracks. The problem is solve by stating the idea that my ship should always aim to the next track tile that is closer the exit of my track element and this for each track element. Let see if it works.

-- 03/03/2010
For the resolution of my AI problem, I will as usual try to split the problem into smaller and simpler ones:
1. For each track tile element, I will have to find an exit, that is a tile that is the last tile before landing on the next track element.
2. When an AI controlled ship enters a track element, It will be assigned a way point that lead to the exit of the tile element.
3. When assigned a way point, a ship will then change direction in order to align with the way point direction thus while still accelerating.

1. Can be solved quickly by defining manually the exit for testing purpose, but it will later be best to have procedure able to detect exits (it's not a trivial problem because it also depends on the track orientation.
2. I have explain the algorithm that should solve this above.
3. I should determine the angle between the way point direction and the ship orientation and then rotate the ship left or right in order the reduce this angle.(Acceleration always on except if this angle seems to "large")

-- 07/03/2010
My IA is working (more or less), AI controlled ship are to complete laps without getting stuck, although at a not very fast pace.
I have implement hardware lighting for the ship and it should work for every dynamic object in the scene. I also have implemented inter-entity collision.

-- 08/03/2010
Interesting Wipeout clone for iPhone(uh!):
http://www.youtube.com/watch?v=QMmYrsZizZY
http://www.youtube.com/watch?v=nR5enLkLlYg&NR=1
I'd like to see opposition so I can steal good ideas from others, and I can see where they fail.
Here I find that textures are ugly, ship design is weird, and track design is boring. (Hope I can do better)

-- 09/03/2010
How to determine ranking ?

Great now that we have many ship that racing around together, how do we know who is the winner ? I can count lap, but of course within the same lap, it hard to tell who is ahead and who is beyond: the solution I found is to compute for each ship the overall distance that ship went though during the race(adding the distance between each track tile center) and at the end, add the distance within the tile that the ship is now on. Then all I have to do the know the ranking is to sort ship by this numeric value.

-- 10/03/2010

Let see: now race are taking place in urban environnement with some trees, I'd like to add more variety to this with: desert, canyon, mountain, forests, water(with reflection), tunnel, night, it will bring a more professional appeal to my game and give me opportunities to achieve various sweet rendering effects.
I will also had borders so the track will be physically separated from the environnement.

Loading time in mobile games

One understated subject is loading time: in mobile game, people usually have very little time to spend, so loading time should be short so that no time is wasted. I found out that loading texture is very slow, it already takes about 10 seconds to start game with almost no textures, I can't imagine when I will be loading 512*512 textures. I should see how I can speed up things, otherwise I will have to choose between loading time and fine textures.

These people are working on a WipeOut Clone and they made a blog (reminds me of somebody):
http://www.protoxide.mobi/

-- 18/01/2011

Oups ! This project has been put to sleep for a very long time :( I shall revive it. I need to end this project so I can move to another one.
- First by porting this program to the Galaxy S, I've noticed stranges behavior, that should be fixed.
- I should handle application lifecycle states properly, that is to say, handle onPause, onResume state without crashing.

-- 26/01/2011

- Fixed few glitches on the Galaxy S, now run properly.
- Added billboard and alpha blending to the game engine to have some fancy particle effect!
To be able to finish something I shouldn't be looking to add too much new features. I'd rather release a minimalist game and the enhance it after, or maybe switch to a new project.

-- 27/01/2011

They are some points that I need to work out as prioriy now:
- City generation: all building are looking the same, and texture looks poor although I wanted it to be suggestion more than realy appearance, this is not sufficient to give a realy urban feel. I can do much better than that.
- Overall the game feels small, small building, small track, I don't think that gameplay with fast moving ship suits narrow tracks.
- Ship handling on the phone feels poor, gameplay is a complex mix of element (controls, inertia, speed) that will make the game enjoyable.

-- 28/01/2011
Another thing I'd like to work on is the GUI user interface. They are a few java OpenGL GUI libraries but I'm not sure how they will adapt to Android and my game logic.

A GUI is made of text or visual elements that receive events and react to it.
event->element->canvas
One hardest part will be to link a touch event (that is 2d screen coordinate) to that actual 3d OpenGL GUI element that is clicked.

-- 01/02/2011
Time is running. This project will not reach commercial quality anytime soon. In order to be able to move to another project, I'm planning to release the final version on the 01/03/2011. It will be freely available on the android market and the source will be released on this page.

-- 23/02/2011
Fixed a design flaw in the game where game and 3d engine where tightly coupled in the same class.

-- 26/04/2011
Ouch haven't been working on this project for a long time.

I need to work on my openGL Gui interface.
I want gui objects to be "touchable", so the user can navigate through game menu with his Android phone.

-- 02/10/2011
Applet tryout:
 
<applet code="org.jdesktop.applet.util.JNLPAppletLauncher" width=640 height=480
archive="http://jogamp.org/deployment/jogamp-current/jar/applet-
launcher.jar,<a href ="
http://jogamp.org/deployment/jogamp-current/jar/gluegen-rt.jar,http://jogamp.org/deployment/jogamp-current/jar/jogl.all.jar">">http://jogamp.org/deployment/jogamp-current/jar/gluegen-rt.jar,http://jogamp.org/deployment/jogamp-current/jar/jogl.all.jar"></a>
<param name="codebase_lookup" value="false">
<param name="subapplet.classname" value="JoglViewer">
<param name="subapplet.displayname" value="JOGL Applet">
<param name="noddraw.check" value="true">
<param name="progressbar" value="true">
<param name="jnlpNumExtensions" value="1">
<param name="jnlpExtension1" value="http://jogamp.org/deployment/jogamp-current/jogl-all-awt.jnlp">
<param name="java_arguments" value="-Dsun.java2d.noddraw=true">
<param name="jnlp_href" value="applet-joglviewer.jnlp">
</applet>
 


-- 14/11/2011

Shifting this project : make a simple time attack game with online hall of fame.

-- 16/11/2011
Focus on the gameplay : I know graphism will be subpar, but at least I'll concentrate on delivering a nice game experience:
- Sense of speed : large fov
- Inertia : feel the mass of the ship going through corners
- Large track : I don't like the narrow track as it is, hard to play and not interesting to bounce constantly on walls
To create richer track, I hesitate between higher definition grid or cubic spline interpolation, I might go for the two options. (cubic spline allows for arbitrary level of detail, which is exactly what I am looking for, instead of having to write grid data file with different resolution)
Interesting site: http://www.necrosoft.nl/