|
|
| Generador de mazmorras 3D (Conway) | |
|
+3luckyer07 ErichZann elPatrixF 7 participantes | Autor | Mensaje |
---|
elPatrixF Soporte
Reputación : 327 Mensajes enviados : 1296 Edad : 32 Premios :
| Tema: Generador de mazmorras 3D (Conway) Dom Jul 15, 2012 6:09 pm | |
| Ahora saben para que era esto xdd : [Tienes que estar registrado y conectado para ver este vínculo]
Para resumir: Este aporte es un ejemplo avanzado de un generador de mazmorras semi-aleatorias en 3D. Utiliza procedural-y-exhaustivamente las extensiones Array, Raycast, Surface y opcionalmente Lua+; además de extensiones de uso genérico como Popup object, MT Random, y Strings, Contadores y actives. Sigue las reglas del juego de la vida de conway con las reglas B3/S12345.
Aquí llego el patrix a complicarse la vida con ejemplos y aportes estrafalarios Resulta que como empezaron mis vacaciones de invierno, estoy teniendo "proyectos de fin de semana" todos los días El proyecto de hoy es una mazmorra en 3D generada aleatoriamente. Y no hay combinación más explosiva que hablar de 3D y aleatorio al mismo tiempo Utiliza principalmente las extensiones Array (Para almacenar la información del mapa generado), Surface (Para dibujar el plano de la mazmorra), Raycasting Object (Para dibujar la vista 3D de la mazmorra, y poder recorrerla en primera persona) y MT Random object (Alias, el mersenne twister, para generar números más aleatorios que los que da la función random() del mmf2).
Me tomó un buen tiempo descubrir el funcionamiento de la extensión Raycast, pero es una extensión interesante que consume pocos ciclos de cpu, en comparación con otras de similar calibre como el Mode 7 ex o los mismísimos Lens . Lo que me sorprendió bastante de este experimento es lo lentos que pueden llegar a ser los arreglos, o los bucles anidados. Descargar: OP, nuevo link actualizado más abajo
El mapa se genera usando las reglas del juego de la vida de conway, donde nace una célula cuando tiene 3 vecinos, y sobrevive con 1, 2, 3, 4 o 5 vecinos. (B3/S12345). Cabe aclarar que esta forma de generar el mapa no garantiza que todos los puntos de la mazmorra sean alcanzables, por lo que usar este marco implicaría o bien prediseñar los mapas de forma tal que siempre haya un camino, o dotar al jugador de un pico y una pala para cavar su propio camino en caso de quedarse atascado El mapa generado por defecto es de 128x128 píxeles; pero se puede cambiar arbitrariamente. Eso sí, hacerlo más grande hará que tarde mucho más en generarse el mapa (Mucho, MUCHO, más). Este ejemplo está todo agrupado, comentado, y explicado como para entender básicamente el procedimiento de cada función. Todavía no tuve la oportunidad de probarlo desde una CPU más lenta, pero asumo que no puede haber mucha diferencia de FPS, más allá de lo que le puede tomar generar la mazmorra Si les vá muy lento, pueden marcar la opción machine independant speed desde el mfa para acelerar un poco el proceso.
En fin, el experimento ha sido un éxito, y les dejo lo que llevo hecho hasta ahora para que investiguen por su cuenta. ¡Saludos! :afro:
UPDATE: 16/07/2012
OK! Nuevo ejemplo funcionado, ahora con funciones lua, 5 veces más rápido Me costó bastante, pero al fin logré programar todo para que funcione con Lua. Y acabo de confirmar que tarda muchísimo menos, en hacer exactamente lo mismo. Y eso que aún se toma la molestia de copiar todo el contenido del arreglo en el Lua, sobre el Array en MMF2 - Código:
-
-------------------------------------------- function MZ(x,y) if x<1 then return 0; end if y<1 then return 0; end if x>xsize then return 0; end if y>ysize then return 0; end return M[x][y]; end -------------------------------------------- function rand(i) return math.random(i)-1; end -------------------------------------------- function uno(i) if i<1 then return 1; else return i; end; end -------------------------------------------- function piso(i) return math.floor(i); end ------------------------------------------ --Funciones propias -- ------------------------------------------ function vecinos(x,y) v=0; if MZ(x-1,y-1) >0 then v=v+1; end if MZ(x,y-1) >0 then v=v+1; end if MZ(x+1,y-1) >0 then v=v+1; end if MZ(x-1,y) >0 then v=v+1; end if MZ(x+1,y) >0 then v=v+1; end if MZ(x-1,y+1) >0 then v=v+1; end if MZ(x,y+1) >0 then v=v+1; end if MZ(x+1,y+1) >0 then v=v+1; end V[x][y] = v; end -------------------------------------------- function transformar(x,y) if V[x][y]==3 then M[x][y] =1; end if V[x][y]<1 then M[x][y] =0; end if V[x][y]>5 then M[x][y] =0; end V[x][y] = 0; end ------------------------------------------ --Variables Globales -- ------------------------------------------ M = {}; V = {}; xsize = 1; ysize = 1; ------------------------------------------ --Funciones referenciadas -- ------------------------------------------ function iniciar(X,Y,S) for i=1,X+2 do M[i] = {}; for j=1,Y+2 do M[i][j] = rand(uno(S-1)+1); end end for i=1,X+2 do V[i] = {}; for j=1,Y+2 do V[i][j] = 0; end end xsize = X; ysize = Y; end -------------------------------------------- function simular(n) for z=1,n do for x=1,xsize do for y=1,ysize do vecinos(x,y); end end for x=1,xsize do for y=1,ysize do transformar(x,y); end end end end -------------------------------------------- function get(i) x = 1+piso(i % xsize); y = 1+piso(i / xsize); return M[x][y]; end ------------------------------------------ --Procedimiento final -- ------------------------------------------ function start(x,y,d,s) iniciar(x,y,d); simular(s); return "OK!"; end -------------------------------------------- --LuaFunctionN( "Lua+", "get", X+(Y*MapWidth( "Config" ))) El código lua está incrustado en el MFA, adentro de un string. Para ahorrar archivos Los controles básicos son los mismos de siempre, con dos o tres bonus tracks adicionales: Las flechas para girar y avanzar, la tecla shift para correr, tan rápido como la luz deje (Ojo, easter egg acá ). Además de esto agregué algunos controles para cambiar el mapa: Enter para generar un mapa nuevo, espacio para sumar ciclos de simulación, retroceso para generar una semilla nueva (Para generar con la tecla de espacio) y el pad numérico para ajustar el tamaño del mapa. Sólo que está MUY bugueado. Hay que rezar para que funcione, y desconozco por que me encuentro a mi amigo el cartel de error genérico, cada dos por tres. Dios quiera que a ustedes, queridos colegas, no les salte este error tan seguido como a mí. Al menos, cada dos por tres funciona No tengo la certeza, pero creo que la culpa la tiene el Lua+, o mi programación defectuosa
Última edición por elPatrixF el Mar Jul 17, 2012 12:48 am, editado 3 veces | |
| | | ErichZann Moderador
Reputación : 334 Mensajes enviados : 1414 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Dom Jul 15, 2012 6:38 pm | |
| Super cool!
tengo un mesh de un zombie, animado y todo, por si le queres agregar... | |
| | | elPatrixF Soporte
Reputación : 327 Mensajes enviados : 1296 Edad : 32 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Dom Jul 15, 2012 10:44 pm | |
| Seh, pero sería complicado combinar el raycaster con un mesh 3D. Habría que calcular las áreas visibles de cada posición, convirtiéndolo en un sprite plano pero gracias por la ofrenda quizá haga un juego con este "motor", una especie de "miner's dungeon 3D" o algo por el estilo xdd | |
| | | luckyer07 Moderador
Reputación : 195 Mensajes enviados : 1573 Edad : 32 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Dom Jul 15, 2012 11:09 pm | |
| :O quedo regenial , donde aprendes todo esto elpatrix ? bueno todavia no he llevado cursos de informatica , facil algun dia aprendere todo esto | |
| | | nachosniegenserio 10 como Maradona
Reputación : 10 Mensajes enviados : 907 Edad : 28 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Lun Jul 16, 2012 2:31 am | |
| | |
| | | Zonacas Super-Moderador
Reputación : 558 Mensajes enviados : 2871 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Lun Jul 16, 2012 3:28 am | |
| | |
| | | elPatrixF Soporte
Reputación : 327 Mensajes enviados : 1296 Edad : 32 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Lun Jul 16, 2012 3:28 pm | |
| gracias gente, ¿Alguno que sepa más o menos me da una manito con Lua a ver si puedo acelerar el proceso de generación de mazmorras? Es que no tengo idea de como manejar funciones compartidas y comunicar variables entre el programa en lua, y el programa en MMF2 PD:A 320x180, para el que quiera un boost de pixelación. [Tienes que estar registrado y conectado para ver este vínculo] | |
| | | elPatrixF Soporte
Reputación : 327 Mensajes enviados : 1296 Edad : 32 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Mar Jul 17, 2012 12:40 am | |
| OK! Nuevo ejemplo funcionado, ahora con funciones lua, 5 veces más rápido Me costó bastante, pero al fin logré programar todo para que funcione con Lua. Y acabo de confirmar que tarda muchísimo menos, en hacer exactamente lo mismo. Y eso que aún se toma la molestia de copiar todo el contenido del arreglo en el Lua, sobre el Array en MMF2 - Código:
-
-------------------------------------------- function MZ(x,y) if x<1 then return 0; end if y<1 then return 0; end if x>xsize then return 0; end if y>ysize then return 0; end return M[x][y]; end -------------------------------------------- function rand(i) return math.random(i)-1; end -------------------------------------------- function uno(i) if i<1 then return 1; else return i; end; end -------------------------------------------- function piso(i) return math.floor(i); end ------------------------------------------ --Funciones propias -- ------------------------------------------ function vecinos(x,y) v=0; if MZ(x-1,y-1) >0 then v=v+1; end if MZ(x,y-1) >0 then v=v+1; end if MZ(x+1,y-1) >0 then v=v+1; end if MZ(x-1,y) >0 then v=v+1; end if MZ(x+1,y) >0 then v=v+1; end if MZ(x-1,y+1) >0 then v=v+1; end if MZ(x,y+1) >0 then v=v+1; end if MZ(x+1,y+1) >0 then v=v+1; end V[x][y] = v; end -------------------------------------------- function transformar(x,y) if V[x][y]==3 then M[x][y] =1; end if V[x][y]<1 then M[x][y] =0; end if V[x][y]>5 then M[x][y] =0; end V[x][y] = 0; end ------------------------------------------ --Variables Globales -- ------------------------------------------ M = {}; V = {}; xsize = 1; ysize = 1; ------------------------------------------ --Funciones referenciadas -- ------------------------------------------ function iniciar(X,Y,S) for i=1,X+2 do M[i] = {}; for j=1,Y+2 do M[i][j] = rand(uno(S-1)+1); end end for i=1,X+2 do V[i] = {}; for j=1,Y+2 do V[i][j] = 0; end end xsize = X; ysize = Y; end -------------------------------------------- function simular(n) for z=1,n do for x=1,xsize do for y=1,ysize do vecinos(x,y); end end for x=1,xsize do for y=1,ysize do transformar(x,y); end end end end -------------------------------------------- function get(i) x = 1+piso(i % xsize); y = 1+piso(i / xsize); return M[x][y]; end ------------------------------------------ --Procedimiento final -- ------------------------------------------ function start(x,y,d,s) iniciar(x,y,d); simular(s); return "OK!"; end -------------------------------------------- --LuaFunctionN( "Lua+", "get", X+(Y*MapWidth( "Config" ))) El código lua está incrustado en el MFA, adentro de un string. Para ahorrar archivos Los controles básicos son los mismos de siempre, con dos o tres bonus tracks adicionales: Las flechas para girar y avanzar, la tecla shift para correr, tan rápido como la luz deje (Ojo, easter egg acá ). Además de esto agregué algunos controles para cambiar el mapa: Enter para generar un mapa nuevo, espacio para sumar ciclos de simulación, retroceso para generar una semilla nueva (Para generar con la tecla de espacio) y el pad numérico para ajustar el tamaño del mapa. Sólo que está MUY bugueado. Hay que rezar para que funcione, y desconozco por que me encuentro a mi amigo el cartel de error genérico, cada dos por tres. Dios quiera que a ustedes, queridos colegas, no les salte este error tan seguido como a mí. Al menos, cada dos por tres funciona No tengo la certeza, pero creo que la culpa la tiene el Lua+, o mi programación defectuosa Voy a tener que actualizar el post principal En fin, todos los días se aprende algo nuevo Todavía se puede mejorar mucho más este código, hasta se puede prescindir por completo tanto del arreglo como del surface, pero ya he pensado lo suficiente por hoy. Me merezco un descansito de mente Son la una de la mañana, ya puedo dormir en paz zzzzzzzzzzzzzz | |
| | | luckyer07 Moderador
Reputación : 195 Mensajes enviados : 1573 Edad : 32 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Mar Jul 17, 2012 12:54 am | |
| a mi me funciono a la primera , creo que toca una renovacion de compu .... joder que loco esta el nuevo ejemplo , funciona mucho mas rapido que el anterior .... me mate de risa al escuchar el sonido de una moto al correr a demasiada velocidad , y una pregunta se pueden mejorar las texturas de las paredes y el suelo ?? | |
| | | Zonacas Super-Moderador
Reputación : 558 Mensajes enviados : 2871 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Mar Jul 17, 2012 6:46 am | |
| Muy bueno Pero estoy seguro que el Patrixf no será capaz de hacer una simple calculadora Ahi tiro eso... [Tienes que estar registrado y conectado para ver esa imagen][Tienes que estar registrado y conectado para ver este vínculo] | |
| | | ErichZann Moderador
Reputación : 334 Mensajes enviados : 1414 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Mar Jul 17, 2012 9:27 am | |
| No pude correr el .exe, no hubo forma... Pero lo vi en el .mfa, no pude apreciar del todo el aumento de velocidad, porque no veo como se genera, solo veo cargando... Porque lo corro con F7, si lo corro con F8... Crash. Anduve corriendo una rato... +R ------------------------------------------------------- - Zonacas escribió:
- Muy bueno
Pero estoy seguro que el Patrixf no será capaz de hacer una simple calculadora [Tienes que estar registrado y conectado para ver este vínculo] Jaja, yo pienso lo mismo :/!/: de hecho, estoy por terminar la mía y no creo que NADIE, sisi dije NADIE, la pueda superar.... | |
| | | elPatrixF Soporte
Reputación : 327 Mensajes enviados : 1296 Edad : 32 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Mar Jul 17, 2012 12:26 pm | |
| Podés hacer la generación de mapa manualmente pulsando primero la tecla "retroceso" para tirar una semilla, y luego manteniendo pulsada la tecla "espacio". La tecla "enter" automatiza todo esto desde la función "iniciar" con los cuatro parámetros predefinidos. Como detalle, cuanto más grande sea la variable Densidad("Config") más esparcidos quedarán los puntos en la semilla, y le tomará más ciclos de generación llenar todo el mapa de laberintos; pero los patrones resultantes serán "localmente" más simétricos y detectables. ... ¿No estarán tratando de convencerme de que entre al concurso de calculadoras no? jajaja | |
| | | ErichZann Moderador
Reputación : 334 Mensajes enviados : 1414 Premios :
| | | | Zonacas Super-Moderador
Reputación : 558 Mensajes enviados : 2871 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Mar Jul 17, 2012 5:42 pm | |
| | |
| | | modelcf Adicto a MMF Zone
Reputación : 63 Mensajes enviados : 1049 Edad : 28 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Sáb Jul 21, 2012 6:35 pm | |
| alguien que tenga la extension raycast que me la pueda pasar? probe esto en mi notebook donde si tengo esa extension pero aqui en mi pc no la tengo , me gusto mucho el generador de calabozos, y quiero probar algo para hacer calabozos al azar de otra forma... | |
| | | ogrk Novato
Reputación : 0 Mensajes enviados : 50 Edad : 34 Premios :
| Tema: Re: Generador de mazmorras 3D (Conway) Sáb Sep 22, 2012 10:23 pm | |
| Woow la verdad que yo apenas me estaba liando en como hacer mi propio mapa con el raycaster object, y ahora sales con que ya se puede hacer un generador de mazmorras xd. Muchas gracias por haber compartido tu trabajo | |
| | | Contenido patrocinado
| Tema: Re: Generador de mazmorras 3D (Conway) | |
| |
| | | | Generador de mazmorras 3D (Conway) | |
|
Temas similares | |
|
| Permisos de este foro: | No puedes responder a temas en este foro.
| |
| |
| |
|