Dado que SDL solo trabaja en 2D las particulas no seran mas que los pixeles de la pantalla (o un conjunto de estos formando cuadrados pequeños o circulos pequeños), para empezar hay que comenzar por como se estudian los mivimientos (puesto que lo que podemos hacer unicamente es mover las particulas pues es lo que se va a ver en pantalla) en fisica y la respuesta es que con vectores, como SDL trabaja en 2D sera mas sencillo que en 3D puesto que los vectores solo tendran dos componentes, cada particula debera tener al menos un vector posicion y despues puedes hacer que cada particula tenga ademas un vector velocidad, incluso un vector aceleracion y ya subiendo la dificultad incluso una masa y vectores de fuerza. Ahora es cuestion de aplicar la matematicas y la fisica a las particulas y calcular el nuevo vector de posicion, y las nuevas propiedades de la particula en cada momento, como interactuan unas con otras, que comportamiento deberan tener.... Lo siguiente es que dependiendo del tipo de particula que quieras hacer (lluvia, fuego, arena, ...) decidas si representar la particula como un pixel, como un punto de varios pixeles, como una raya.... Ahora a dibujar las particulas, si no vas a usar imagenes para hacer las particulas (me refiero a imagenes en archivos externos al programa, lo cual seguramente permitira una mayor flexibilidad del sistema de particulas) una opcion es crear una superficie y dibujar en ella pixel a pixel o dibujando pequeños rectangulos la particula y usar esta superficie como particula (de este modo todas las particulas serian iguales y solo tendrias que hacer un blitting a la pantalla en las coordenadas que le correspondan a la particula) este metodo es una buena opcion cuando todas las particulas sean iguales (arena por ejemplo) pero si las particulas son para, por ejemplo, un fuego cada una debera tener un color entre amarillo y rojo diferente (un fuego no es solo rojo o solo amarillo, tiene tonos naranjas...) una opcion es dibujar directamente en la superficie de la pantalla las particulas dibujando los pixeles que sean necesarios (aqui es necesario o usar doble buffer para evitar el parpadeo o antes copiar la superficie de la pantalla a otra superficie, tambien deberas tener cuidado con el codigo para dibujar las particulas para que compruebe lo mas rapido posible todas las particulas y las dibuje tambien lo mas rapido posible, contra menos codigo y mas rapido se ejecute el codigo mejor por lo que habra variables que, por ejemplo, en vez de int deberan ser register int...).
Espero que esto te pueda ayudar con el sistema de particulas. Aprovecho para decirte que para poder comprobar el tiempo que tarda en ejecutarse cada funcion y las veces que es llamada (por lo que te comentaba de la necesidad de que los pixeles de las particulas estuviesen dibujados en el menor tiempo posible) puedes usar el profiler:
http://www.chuidiang.com/clinux/herrami ... ofiler.php
Edito: no me acuerdo si era en los ejemplos o donde era pero me parece que en uno de los ejemplos hay funciones para dibujar un pixel de un color determinado en una superficie en las coordenadas que se quiera.
- Código: Seleccionar todo
int reemplazar_color(SDL_Surface *src, Uint32 remover, Uint32 reemplazo){
register unsigned short int b;
register unsigned int x, y;
b= SDL_MUSTLOCK(src);
if(b == 1){
if(SDL_LockSurface(src) < 0){
return 0;
}
}
for(x = 0; x <src>w; x++){
for(y = 0; y <src>h; y++){
if(obtener_pixel(src, x, y) == remover){
colocar_pixel(src, x, y, reemplazo);
}
}
}
if(b == 1){
SDL_UnlockSurface (src);
}
return 0;
}
int colocar_pixel(SDL_Surface *src, int x, int y, Uint32 pixel){
register unsigned short int b;
b= SDL_MUSTLOCK(src);
if(b == 1){
if(SDL_LockSurface(src) <0>format->BytesPerPixel;
Uint8 *p = (Uint8 *)src->pixels + y * src->pitch + x*bpp;
switch(bpp){
case 1: *p = pixel;
break;
case 2: *(Uint16 *)p = pixel;
break;
case 3:
if (SDL_BYTEORDER == SDL_BIG_ENDIAN){
p[0]=(pixel >> 16) & 0xff;
p[1]=(pixel >> 8) & 0xff;
p[2]=pixel & 0xff;
}
else{
p[0]=pixel & 0xff;
p[1]=(pixel >> 8) & 0xff;
p[2]=(pixel >> 16) & 0xff;
}
break;
case 4: *(Uint32 *) p = pixel;
break;
}
if(b == 1){
SDL_UnlockSurface (src);
}
return 0;
}
Uint32 obtener_pixel(SDL_Surface *src, int x, int y){
int bpp = src->format->BytesPerPixel;
Uint8 *p = (Uint8 *)src->pixels + y * src->pitch + x * bpp;
switch(bpp){
case 1: return *p;
break;
case 2: return *(Uint16 *)p;
break;
case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2];
else return p[0] | p[1] << 8 | p[2] << 16;
break;
case 4: return *(Uint32 *)p;
break;
default: return 0;
break;
}
}
Hay tienes las funciones necesarias para colocar pixeles en una superficie que las obtuve de algun ejemplo o algun codigo de losers juegos y tambien las vi en un manual y entre un codigo y otro y algunas cosas que creo que cambie consegui esas tres funciones que tenia guardadas en el disco duro. Como veras algunas variables se declaran como regoster para que si es posible se guarden en los registros de la CPU para que el acceso a ella sea mas rapido y las funciones son cortas y con poco codigo y usando punteros.