Spore 2D (Animalicos)

Started by Windgate, May 17, 2009, 05:17:32 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

El nombre "Spore" es ambicioso, pero creo que es el nombre más corto y representativo para el proyecto.

Un alumno de 15 años tuvo la idea de programar un sencillo ecosistema en Bennu, y este fin de semana he estado programando e investigando las formas de recrear aspectos como la reproducción, el movimiento, el crecimiento, el contagio de enfermedades, la necesidad de alimentarse con otras especies...

El resultado es este "juego" donde 8 especies compiten por coexistir en la pantalla del PC.

He realizado diferentes modificaciones en las CONST del juego para obtener cierto equilibrio, espero que lo probéis y que modifiquéis a vuestro antojo. Y sobre todo aportar sugerencias por locas que sean, ya hemos pensado en meter relaciones simbióticas, parasitarias, etc. en este mundo virtual en el que los "animalicos" forman incluso países xD

Descargar aquí (100% listo para Linux/Windows):

http://www.mediafire.com/?wlmfxjhzmt2

PD: Tal y como está Bennu quizá convenga separar los Proyectos en 2D y 3D...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Prg

 ??? ??? ???

¿cuál de todos es?
hola mundo no es  ;D  ;D  ;D (ya lo bajé...)

suena muy interesante, sobre todo para tomar ideas de ambientación  ;)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

#3
lol, puse el link con la carpeta compartida entera, ya lo he rectificado:

http://www.mediafire.com/?wlmfxjhzmt2

Hay problemas de rendimiento cuando empiezan a ser miles de animalicos, creo que es por culpa de la función collision(), hago un uso muy intensivo de ella.

¿Hay implementada alguna alternativa a collision() que no consuma tanto? Por muy simple que sea seguro que me sirve, son simples cuadrados los que tienen que detectar la colisión.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Get_dist con todas las ids de procesos animales? get_xdist y get_ydist? restando coordenadas? Creo que esas opciones PODRÍAN ser más óptimas.
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)

laghengar

Hola, no se si has puesto collision en todos los frames; te lo digo porque podrías alternar su uso (por ejemplo: poniendo collision cada 2 frames ya ahorras mucho consumo) y haciendo un équilibrio entre número de frames y la percepción visual que se obtiene de ello puedes ganar bastante rendimiento.
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

Windgate

Drumpi, ¿Te refieres a hacer que cada animalico haga get_dis() para todos los procesos activos? Sigue siendo demasiada carga, ¿No? Me gustaría poder tener 2000 o más procesos funcionando a la vez, me causa dolor ver cómo el Warcraft III tiene a veces miles de modelos 3D funcionando por ahí y resolviendo colisiones de forma fluída mientras que mis cuadrados se ejecutan a trompicones.

Laghengar, parece bastante buena idea eso de limitar el uso de collision(), voy a hacer un par de pruebas y os kuento.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

laghengar

Tendrás que hacerte un estudio de cuantos frames saltarte para que el collision trabaje adecuadamente, hay que evitar que al final se acaben traspasando  ;D. Yo esto ya lo he hecho muchas veces y siempre da bastante resultado, lo recomiendo encarecidamente.
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

darío

Hola,

Lo he probado y puesto que mi ordenador no es muy potente casi enseguida se me pone lento...

Respecto de las colisiones, si te da lo mismo que tus procesos sean círculos en lugar de cuadrados, quizá podrías comprobar la colisión simplemente viendo si la distancia entre dos procesos es menor que la suma de los radios. Es una comprobación sencilla así que supongo que será más rápido que collision.
My sites:
Smart Fpg Editor - Painless FPG Edition for Bennu and PixTudio
fenixlib - .NET support for manipulating PixTudio, Bennu and Div graphic formats

Windgate

Es buena idea Dario, pero si 1000 procesos tienen que hacer esa comprobación con los otros 1000 procesos tenemos 1000000 de comprobaciones para cada FRAME;

Quizá sería todo más eficiente si usase un tablero sobre el que se muevan los animalicos, las comprobaciones de colisión podrían ser directamente sobre el tablero, y así evitar que todos los procesos tengan que hacer comprobaciones sobre todos cada vez, les bastaría con echar un vistazo a su "celda" del tablero y ver lo que tienen alrededor.

¿Alguien sabe a groso modo cómo está implementada la función collision? ¿Hace comprobaciones sobre todos los procesos activos cada vez que se invoca? Es que veo que resiente la eficiencia muy mucho...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

yo se como esta la collision...
pero probe el esquema de usar dist y la verdad tarda mucho igual... por el tema de la cantidad de chequeos...
hay que intentar otro metodo, por otro lado, agregue a la version que hice, nuevas features como madurez_sexual, con lo que da una edad minima para poder reproducirse... y alguna que otra cosa mas...
luego pongo el codigo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Yo tengo un algoritmo implementado en c de colisión de cajas, suficiente para cuadrados y rectángulos, a ver si lo encuentro y lo adapto a Bennu, seguro que saca máximo rendimiento al colisionado, a mí me fue de perlas en los primeros juegos c que hice para 486.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Drumpi

Hombre, yo porponía la solución de get_dist con todos los procesos porque supongo que collision tambien hace la comprobación con todos los procesos, y una vez que detecta dos muy próximos hace la comprobación a nivel de pixel, algo que en tu caso no necesitas.
Quizás exista un método: teniendo la lista de procesos, crear una matriz triangular de distancias entre ellos, y asi se puedan comprobar colisiones de forma rápida por la distancia, o no se, que cuando un proceso se mueva sume o reste su movimiento a sus correspondientes casillas... no se, estoy divagando.
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)

Windgate

Drumpi, lo que dices de la matriz y lo que sugiero yo del tablero viene a ser más o menos lo mismo xD

Ok Splinter, muy buena idea la edad mínima de reproducción. También habría que hacer que el valor de hambre se heredase de padres a hijos, si no se hace así cuando se quedan sin comida se siguen reproduciendo y la especie nunca muere.

Y luego tengo que meter las tablas de quiénes se comen a quiénes, relaciones simbióticas, etc. Tienen que ser tablas (Arrays o matrices), eso de que cada especie se alimente exclusivamente de otra es demasiado simple, la tabla le daría más juego.

Y si hago algún escenario la idea es que haya tierra, mar y aire, y por tanto especies terrestres, anfibias, voladoras... Mucho por hacer. Espero tu código Splinter, con que cuelgues el .PRG modificado yo me ocupo de integrarlo.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

splinter_work

Aca te pego el ultimo codigo que hice.

Como veras no es muy rapido el asunto, tengo que verificar si es por algo en la forma de recorer tal cantidad de procesos, o por la cantidad en si... no hice el calculo de cuantos procesos y cuantos chequeos realmente se hacen...
hay 128 maximo por especie...

fijate tambien que parte de lo que decis, lo hice, agregue algunos parametros como ser "eat" que indica el tipo de especie que uno puede comer...

te mando todo el paquetito de fuentes... limpios, en la carpeta bak puse los fuentes que no se usan actualmente.

otra cosa, en la carpeta "dll" tenes un archivo de 1.7mb que se llama mod_proc y es un archivo adobe, no se realmente que es, pero me parece que es basura.