Mi primera demo

Started by Yawin, January 15, 2011, 03:45:22 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

Quote from: Windgate on January 17, 2011, 09:12:55 PM
Vaya, sí que se ha escrito aquí en poco tiempo xD

Sobre lo de escribir caracteres tipo Matrix, ¿No se podía usar set_glyph ( ) para asignar a cada caracter un PNG o algo así?

Y otra cosa, he leído en Youtube que usas la mod_vlc y nunca he usado esa dll, ¿Es para el vídeo del principio o es para hacer algún tipo de sincronismo entre la emisión de bolas y la música del juego?

Te voy a dar un karma por ser tan freak y programar cosas tan raras xD

actualmente la set_glyph tiene un problema, que aun no pense como deberia ser... pero hace conversion de encoding al meter el glyph con lo que hay algunos caracteres que no se pueden setear...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

Una preguntita:
¿Hay alguna posibilidad de incluir archivos .cpp, de forma que si algo no lo se hacer en Bennu pueda hacerlo en C++?

Imagino que no, pero por probar...
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

si, con modulos = dll = librerias dinamicas.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

#18
Verás, la cosa es que he encontrado un tutorial para hacer metaballs en c++.
Todavía no lo entiendo, pero cuando lo haga, lo entenderé en c++. No se como compilarlo en una librería .dll; pero, en cualquier caso, tendrían que ser funciones, pero lo que yo necesito es un proceso que sea la bola.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Quote from: SplinterGU on January 17, 2011, 10:50:12 PM
Quote from: Windgate on January 17, 2011, 09:12:55 PM
Vaya, sí que se ha escrito aquí en poco tiempo xD

Sobre lo de escribir caracteres tipo Matrix, ¿No se podía usar set_glyph ( ) para asignar a cada caracter un PNG o algo así?

Y otra cosa, he leído en Youtube que usas la mod_vlc y nunca he usado esa dll, ¿Es para el vídeo del principio o es para hacer algún tipo de sincronismo entre la emisión de bolas y la música del juego?

Te voy a dar un karma por ser tan freak y programar cosas tan raras xD

actualmente la set_glyph tiene un problema, que aun no pense como deberia ser... pero hace conversion de encoding al meter el glyph con lo que hay algunos caracteres que no se pueden setear...

Por este tipo de cosas prefiero generar los ficheros "a mano" ;D
No sé qué tiene que ver el encoding en esto ¿no se supone que set_glyph pedía el valor del caracter al que asignar el gráfico? O sea, yo le digo "mete este gráfico en la posición 4", de tal forma que, vale, es un caracter de control, pero si hago un write(0,0,0,0,chr(4)) me dibujará ese gráfico (igual que el de "retroceso" se representa con una flecha a la izquierda o "retorno de carro" con una flecha doblada en ángulo).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

significa que si pones un set_glyph en el 138 no lo va a poner en el 138... (138 por decir un numero)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

Hola, tengo otro problema más para la lista.
Ya he entendido como van las metaballs y estoy intentando hacerlas, pero un bucle me da problemas (he comprobado que es el bucle):

process esc_1()
private
int malla[resol_X][resol_y],i,j;
int mb1,mb2,ms1=70,ms2=70;
end
begin
set_mode(resol_x,resol_y,16);//,MODE_FULLSCREEN);

mb1=metaball(10,10,ms1);
mb2=metaball((resol_x-40),(resol_y-40),ms2);

for(i=0;i<640;i++)
for(j=0;j<480;j++)
malla[i][j]=ms1/fget_dist(i,j,mb1.x,mb1.y);
malla[i][j]+=ms2/fget_dist(i,j,mb2.x,mb2.y);
end
end

loop
frame;
end
end

process metaball(x,y,int mas)
begin
loop
frame;
end
end



La cosa es que ese bucle:

for(i=0;i<640;i++)
for(j=0;j<480;j++)
malla[i][j]=ms1/fget_dist(i,j,mb1.x,mb1.y);
malla[i][j]+=ms2/fget_dist(i,j,mb2.x,mb2.y);
end
end


Tiene que hacer 307200 vueltas antes del primer frame. Y, claro, igual es eso lo que casca.

¿Qué puedo hacer?

______________________________


edit: He estado buscando por el foro cómo hacéis para incluir física en vuestros programas y no he entendido ni papa. ¿Hay alguna librería (a ser posible oficial, o al menos que esté tanto en windows como en linux) que me recomendéis?

Es que quiero hacer el siguiente efecto:

QuoteDe coordenadas aleatorias de fuera del mapa salen disparadas en dirección al centro de la pantalla unas esferas hechas a base de bolitas destelleantes. Al chocar entre ellas, las bolitas salen desperdigadas por toda la pantalla, como si fuese un choque en el espacio, mientras empiezan a emitir destellos en plan psicodélico.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Es posible que casque porque fget_dist devuelva cero, lo cual da una división por cero que es imposible resolver para el ordenador, y de una excepción.
Lo que ya no sé es si eso se terminó controlando en la mod_math y ese tipo de operaciones devuelve MAX_INT o MAX_FLOAT o lo que sea.

De todas formas 307200 vueltas son bastantes (yo hice una prueba de 1000 divisiones por frame y me iba a 300 y pico FPS), pero lo único que puede pasar es que vaya lento y se congele, pero no que se cierre de golpe.
En ocasiones, cuando un proceso hace demasiadas operaciones para hacer durante un frame, es posible que salte la ventana de aviso de que el programa no responde, pero si le das a cancelar y tiempo suficiente se ve que no está colgado. Me pasó con la carga de algunos ficheros hace mucho tiempo, una vez que terminó de cargar, el programa volvió a su velocidad normal.
Esto último no vale cuando hablamos de un bucle, en ese caso, la única opción es cambiar el ordenador por una "granja de ordenadores" ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Yawin

mmm yo con que vaya a 60fps va que chuta. El problema es que os explico:

Lo que quiero hacer es el efeto de dos metabolas. Las metabolas son bolas con masa, que al acercarse la una a la otra sufren los efectos de las masas cercanas y se les deforma su superficie. Asi se crea un efecto.... estilo las gotas de agua al fusionarse la una con la otra, etc...

Para ello, tengo que calcular cuales son los puntos con una masa determinada. Los que tengan esa masa, la tienen porque son la superficie de la bola, y por tanto hay que pintarlas.

Esto me obliga a calcular qué ocurre en cada uno de los píxeles de la pantalla.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Fede

¿Estás seguro que vas a poder hacer eso?

Yo intenté hacer un efecto de descomposición de granitos de arena en una imagen y lo dejé cuando vi la velocidad que alcanzaba.

Calcular lo que ocurre en cada uno de los píxeles de la pantalla requiere mucha potencia de cálculo.

Podrías hacer pruebas con cálculos más simples para ver que tal vá, y si ves que la velocidad es buena, te metes a hacer filigranas.

Te lo comento desde mi mas humilde experiencia.  :)

Saludos.
Si quieres ser sabio, aprende a interrogar razonablemente, a escuchar con atención, a responder serenamente y a callar cuando no tengas nada que decir.

Yawin

A ver, sé que en c++ se puede hacer con una velocidad de ejecución genial. Asi que si no puedo hacerlo con bennu, tendré que buscar la forma de meterlo en una librería .dll xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Yawin: No te digo que no lo hagas, sino que te advierto de un posible fallo que te puede dar.
De todas formas, recuerda que las funciones PUT son relativamente lentas, así que te doy un par de sugerencias para que, una vez que lo termines y veas que funciona, hagas pruebas para ver si mejora el rendimiento:

-Se puede acceder directamente al buffer de datos del mapa (MAP_BUFFER) y modificarlo a mano. Teóricamente es más rápido que usar PUT pero también más peligroso (trabajar con punteros siempre es peligroso).
-Otra opción es acceder al menor número posible de pixels del mapa, así que en lugar de calcular cada punto, podrías calcular sólo aquellos que sean lo suficientemente cercanos a una metabola, y los capaces de sufrir una alteración por la proximidad de otra.
-Si puedes, trata de dibujar varios pixels a la vez, creo que debería reducir el trabajo de PUT. Lo digo porque si el centro de una metabola no se modifica (no lo sé) podrías usar un MAP_PUT y pintar 4x4, 8x8 o 16x16 pixels de golpe.

No estoy seguro de cuán efectivo sería esto, pero si puedes probarlo, te serviría para aprender.

Fede: en ese caso, lo suyo sería tener una lista de pixels en movimiento, de forma que sólo se borre la posición anterior de cada uno y se pinte la nueva. Tampoco sería recomendable usar procesos, serían demasiados, pero creo recordar que había una demo en DIV de un efecto nieve que iba realmente bien de velocidad para la época.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Quote from: Fede on January 18, 2011, 06:50:11 PM
¿Estás seguro que vas a poder hacer eso?

Yo intenté hacer un efecto de descomposición de granitos de arena en una imagen y lo dejé cuando vi la velocidad que alcanzaba.

Calcular lo que ocurre en cada uno de los píxeles de la pantalla requiere mucha potencia de cálculo.

Podrías hacer pruebas con cálculos más simples para ver que tal vá, y si ves que la velocidad es buena, te metes a hacer filigranas.

Te lo comento desde mi mas humilde experiencia.  :)

Saludos.

yo hice la inversa a lo que decis, dibujar una imagen en pantalla a partir de granos o fragmentos de pantalla que van moviendose y rotando por toda la pantalla, y la velocidad esta barbara.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

Mira Drumpi (y cualquier otro que le interese). Estoy siguiendo este tutorial:
http://escena.org/wiki/page/Tutoriales__Programacion__Metaballs/

Sólo hasta 2D, claro. Voy a hacerlo primera mente como he pensado ya uqe no veo otra forma de hacerlo. Si veo que va más lento iré mirando qué hacer. Pero primero lograr algo. Si veis algo que se pueda hacer, no dudéis en decirmelo, que os compensaré con un karma xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Fede

Vale. Reconozco que la velocidad no era tan mala.

El problema era como corría en la wiz.  ;D

Aquí va el ejemplillo que hice.
Si quieres ser sabio, aprende a interrogar razonablemente, a escuchar con atención, a responder serenamente y a callar cuando no tengas nada que decir.