views:

387

answers:

2

I've been playing this flash game and after I'd gotten over the initial ('lol, fire') reaction I started to wonder how I could replicate this contact-mutate behaviour in programming. I guess it's a little like the honeypot xkcd.

I was thinking of starting with a scenario where particles deflect off each other and the containing walls. The sequence would start with a set number of 'mutant' particles, and when these mutants collide with regular particles they'd become mutants themselves. I could work in some more fun things later.

My problem is how to get started with this. I'm planning to do it in C# using the Drawing elements of .NET (although I'm fairly new to C# - if there's a different part of .NET I should use let me know) but if there's any general papers on it I'd be interested to read them (if they're available online of course).

Thanks, Ross

+3  A: 

I think you are on the right track with what you are thinking, some particles in a box would do fine here. I can't imagine you would find papers on such a specific and simple case but perhaps for some of the techniques required, but an implementation of the backend should be relatively simple compared to a renderer.

To move the particles around a simple method is Euler iteration, where you store the positions and velocities. position = position + velocity*dt; where dt is the change in time since the last frame. It is best to keep dt fixed, and interpolate between points for the renderer if you can... this will reduce stability issues and make collision detection easier.

To reflect a particle off of a wall, check if its x components or y components of position will exceed the bounds and then flip the sign of the other component of the velocity, e.g.

if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound) 
    velocity.y_component = -velocity.y_component;

if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound)
    velocity.x_component = -velocity.x_component;

If you have constant dt, this works quite well, but if it varies you will need to do something more complicated. find the collision point with the box and reflect the part of the vector outside the box in the face that was collided with.

For colliding the particles with each other a distance check is probably best, triggering reflection once the distance is too small. i.e. If they get too close they collide. Reflect the velocity components as though the particles were spheres, so the normal for reflection is the difference of their positions.

You may find this article on gamedev useful too...

Hope this helps.

jheriko
+1  A: 

Why not have a look at the classic Asteroids game as a starting point? Here is alink to one that doesn't use DirectX and is in c#

http://www.codeproject.com/KB/GDI-plus/asteroids.aspx

Khadaji