Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sistema De Partículas

Iniciado por ZüNdFoLGe, 15 de Marzo de 2006, 10:10:51 PM

« anterior - próximo »

ZüNdFoLGe

 Hace un tiempo había usado explosiones para un juego estilo 1942, y mas tarde decidí sacarlas a una clase para usarlas en mas juegos. Lo bueno de estas implementaciones es que solo con modificar parámetros puedes obtener otro efecto, es decir, pasar de una explosión a una cascada de agua con solo modificar la gravedad , el setup inicial de cada partícula y la paleta de colores. Es por esto que basta con pasar parámetros para, a partir de una implementación única, obtener diferentes efectos. E incluso optar por usar pixeles, modelos o sprites para representar en pantalla cada partícula.
El problema que estoy teniendo haciendo pruebas a 320x200, es que me aparecen 2 rectas perpendiculares en el núcleo de explosión. Eso significa que algo anda mal en el setup inicial de cada partícula. Como genero direcciones pseudoaleatorias al inicio, he contemplado el caso de borde de que la dirección sea 0, pero en este caso el eje sería "hacia adentro" y se vería como un punto, descartando que las rectas sean de eso.

Alguna sugerencia???




Exactamente la misma implementación, representando una posible aparición de sangre. He modificado los siguientes parámetros:
- gravedad : +3.5
- muerte de partículas al alcanzar la coordenada y=180 cuando ya no es posible incrementar la dirección de la partícula (a resolución de prueba de 320x200)
Esto genera rebotes que tienden a aplastar las partículas contra el piso, antes de que todas caigan.










En este caso no aparecen rectas perpendiculares :ph34r: , por ende el problema está al inicializar.

Otra cosa...uso Code::Blocks y no he podido renombrar la aplicación, cada proyecto que comienzo por defecto es nombrado por el Code y luego de modificar su nombre sigue apareciendo la aplicación con el nombre predeterminado. En este caso, no puedo cambiar el nombre de la aplicación en curso, y sin embargo sí el del proyecto (SDL_app).

Se aceptan cualquier tipo de sugerencias/comentarios. Si alguien tiene alguna paleta decente...que la postee almenos (ole).

Salu2  (ole)  

Pogacha

 No se me ocurre cual puede ser el problema, creo que tendras que mostrar un poco de codigo de la incialización.

Saludos.

TheAzazel

 Se me ocurre que eramos unos pocos buscando o queriendo hacer un sistema de particulas y encima sobre SDL....

si pudieras liberar el codigo..muchos lo agradecerian :P incluido servidor

(ole)  

ZüNdFoLGe

 El código de inicialización es este (paso por alto la clase vector para que quede mas visible):


void explosion::setup(particle* particles)
{

float lx, ly, dist;
double len;

for(long i=0; i< NUMPART; i++)
    {
    // coordenadas de origen

    particles[i].x = float(rand()%2+ 160);
    particles[i].y = float(rand()%2+ 100);

    // direccion inicial, pseudoaleatoria, (izq -) (der +)
    // si se cumple la condición, otro intento de que no sea 0
    if (!(particles[i].dirx = rand() % 21  - rand() % 21))
        particles[i].dirx= (rand() % 11 - rand() % 11);

     // le doy vida a la partícula
     particles[i].active=1;
 

     if (!(particles[i].diry = rand() % 21 - rand() %21))
     particles[i].diry= (rand() % 11 - rand() % 11);

     // potencia inicial

    dist = rand() % 20;

    lx = particles[i].dirx;
    ly = particles[i].diry;

    // distancia entre 2 puntos

    len = sqrt(lx*lx + ly*ly);

    // normalizo para asignar direccion

    if (len == 0.0)
        len = 0.0;
    else
        len = 1.0 / len;

    // asigno al vector direccion

    particles[i].dirx *= len*dist;
    particles[i].diry *= len*dist;

    // en caso de usar paletas acá va el color inicial
    }
}


En este caso: (y en el de 'diry')

if (!(particles[i].dirx = rand() % 21  - rand() % 21))
        particles[i].dirx= (rand() % 11 - rand() % 11);


si se cumple la condición y modifico el vector diry en vez de dirx las líneas quedan sólidas. En cambio si dejo como está las lineas tienden a abrirse a medida que se expanden las partículas.

En los shots anteriores hay 10.000 partículas. En estos hay solo 1.000 y las líneas no aparecen:









Es muy raro.  :ph34r:
De todas formas creo que 10.000 partículas es un disparate, el sistema estático con 10.000 partículas consume (en su pico máximo) 3480 KB a resolución de prueba de 320x200 (es un disparate) y con 1000 partículas 2790 KB (no es mucho, pero puede mejorar). No tiene mucha diferencia con el dinámico, ya que si hago partículas dinámicas, al morir tendría que dejarlas en memoria, para ganar rendimiendo y no usar delete, y a su vez para volver a usarla no pedir memoria nuevamente sino que revivir la que ya esté muerta. Al estar usando SDL tampoco puedo pretender miserias de consumo. Lo cual a la larga con no muchas partículas prácticamente es lo mismo.


Citar
si pudieras liberar el codigo..muchos lo agradecerian :P  incluido servidor

todavía no me animo a liberarlo, quiero cargarle varios efectos, de hecho ya tiene unos cuantos, pero algunos los tengo por separado, y ordenar todo en clases es lo que me está llevando tiempo. Como soy horrible haciendo paletas, este es otro problema...y ni se me pasa por la cabeza emplear otra cosa que me llevaría el doble de tiempo y de trabajo. En mi blog estoy escribiendo una serie de cómo empezar a hacer un sistema de partículas desde 0, con ejemplos y con código. De todas maneras cuando termine mi sistema lo voy a liberar  (ole)

Salu2

AgeR

 Se ve muy interesante. Yo soy uno de los que está interesado en un sistema de partículas en SDL, supongo que acabaré haciendo uno sencillo, tampoco quiero grandes cosas.

Bueno, a lo que iba, con respecto a lo de SDL_app, hay una función:
SDL_WM_SetCaption("Nombre de la Aplicación", NULL);


marcode

 El defecto de líneas que te sale seguramente sea debido a la forma de iniciar la dirección, prueba a escoger al azar los ángulos de dirección en lugar de la dirección de sus componentes x,y por separado.


// Cogemos al azar un ángulo en grados y lo pasamos a radianes
int grados = rand()%360;
float ang = (float)grados / 180 * PI;

//Escogemos una velocidad y hallamos la dirección para X e Y
float velocidad = 4.0f;
particles[i].dirx = sin(ang) * velocidad;
particles[i].diry = cos(ang) * velocidad;

Así ya deberían ir en todas direcciones por igual y sin efectos raros.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

ZüNdFoLGe

 marcode, estás en lo cierto  (ole)  . No se me había ocurrido trabajar las direcciones con ángulos, es muchisimo mas preciso y se ve mucho mejor. Ahora con 10.000 partículas y sin considerar muertes (empiezan a chocar contra las paredes) se ve mejor:









Desaparecieron las líneas  (ole)

Ager, he probado SDL_WM_SetCaption(..) y no hay caso. Estoy seguro que es el Code el que lo pone por defecto, lo mismo hace con OGL o con cualquier tipo de proyecto elegido por defecto. Tiene que haber alguna manera de sacarlo desde la misma ide, pero no la encuentro aún.

Salu2


Pogacha

 Se me adelantaron  :rolleyes:
No pude postear antes pero como ya lo tengo escrito aquí lo dejo:

void explosion::setup(particle* particles)
{

const int LadoDelAreaDeSurticion = 10.0;

const float VelocidadMinima = 4.0f; // para que no se te planten en el centro.
const float VelocidadMaxima = 20.0f;

float lx, ly, dist;
double len;

for(long i=0; i< NUMPART; i++)
    {
    // coordenadas de origen

// Para una fuente cuadrada mejor usar:
    particles[i].x = (rand()%LadoDelAreaDeSurticion)-LadoDelAreaDeSurticion/2+ 160;
    particles[i].y = (rand()%LadoDelAreaDeSurticion)-LadoDelAreaDeSurticion/2+ 100;

//Mejor calculamos un angulo
// el rand solo llega 32767, pero por las dudas lo controlamos
    float angulo = (rand()%((1<<15)-1)) * 3.141592f * 2.0f / (1<<15);

    float velocidad = rand()%(VelocidadMaxima - VelocidadMinima) + VelocidadMinima;

//Mejor calculamos un angulo
    particles[i].dirx = cos(angulo) * velocidad;
    particles[i].diry = sin(angulo) * velocidad;

    // le doy vida a la partícula
    particles[i].active=1;
 
    // en caso de usar paletas acá va el color inicial
    }
}

Saludos.

vicho

 es raro, normalmente con solo hacer el SDL_WM_SetCaption("algoalgo",NULL); despues de el SDL_SetvideoMode
deberia funcionar para cambiarte el titulo

ZüNdFoLGe

 

Que torpeza, lo había puesto antes de inicializar el modo de pantalla  (rules)

Salu2

vicho







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.