Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: Twister en Febrero 26, 2010, 05:23:16 PM

Título: Generador de Mapas (Plataforma)
Publicado por: Twister en Febrero 26, 2010, 05:23:16 PM
* Nombre del creador: Twister
* Breve descripción de su función: Para su función, ejecuta el script con los correspondientes argumentos (explicados dentro del script) en un room vacío. El script se deberá ejecutar en el evento Create de un objeto.
* Versión GM utilizada:  :GM8: GM8 PRO, no se si funcionará en otras versiones.
* Código del Script:
[gml]////////////////////////////VARIABLES PARA EL GENERADOR//////////////////////////////////
//-------------------------------------------------------------------------------------//
// PASO 1: Reconocer Ancho y Alto de pantalla, llenar los bordes con Solidos.          //
// PASO 2: Crear algunos obstáculos.                                                   //
// PASO 3: Crear algunas plataformas.                                                  //
// PASO 4: Crear Agujeros                                                              //
// PASO 5: Crear Jugadores                                                             //
// Creado por ~Twister (Gameart) :: twister_cgm@hotmail.es                             //
//-------------------------------------------------------------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////

//ARGUMENTOS
//ARGUMENT0 == Plataforma Solida
//ARGUMENT1 == Plataforma No-Solida
//ARGUMENT2 == Parent de Solidos
//ARGUMENT3 == ID Objeto que ejecuta este script
//ARGUMENT4 == J1
//ARGUMENT5 == J2

//EJEMPLO :: GenerarLVL(SOLIDO,PLATAFORMA,solidos,Algoritmo,J1,J2)

//:: INICIO DE VARIABLES :://
var RoomX, RoomY, NumeroDeObstaculos, HayObstaculo, Obstaculo, Altura, Lineas, NumeroDePlataformas, Plataforma;
var Agujeros, Agujero, Distancia;

RoomX=room_width
RoomY=room_height
x=0;
y=0;

//:: PASO 1 ::// Bordes
for (i=0; i<RoomX; i+=32)     {instance_create(i,RoomY-32,argument0)}     //BORDE INFERIOR
for (i=0; i<RoomX; i+=32)     {instance_create(i,0,argument0)}            //BORDE SUPERIOR
for (i=32; i<RoomY-32; i+=32) {instance_create(0,i,argument0)}            //BORDE IZQUIERDO
for (i=32; i<RoomY-32; i+=32) {instance_create(RoomX-32,i,argument0)}     //BORDE DERECHO

//:: PASO 2 ::// Obstaculos
NumeroDeObstaculos=abs(random(RoomX/32)-4)
HayObstaculo=0;
Altura=0;

for (i=32; i<RoomX-32; i+=32)
{
Obstaculo=choose(0,32,64)
HayObstaculo=choose(0,1,2,3,4)
if HayObstaculo=1 && NumeroDeObstaculos>0
{
Altura=choose(0,1,2,3,4)
for (ii=0; ii<Altura; ii+=1)
{
instance_create(i,RoomY-64-(32*ii),argument0)
}
NumeroDeObstaculos-=1
}
}

//:: PASO 3 ::// Plataformas
Altura=0;
Lineas=round(RoomY/160)-1
NumeroDePlataformas=abs(random(RoomX/32)-4)

for (ii=1; ii<Lineas; ii+=1)
{
for (i=32; i<RoomX-32; i+=32)
{
Altura=choose(32,64)
Plataforma=choose(0,1,2,3,4)
if Plataforma=1 && NumeroDePlataformas>0
{
if !place_meeting(i,   RoomY-32-(160*ii)-Altura,argument2){instance_create(i,   RoomY-32-(160*ii)-Altura,argument1)}
if !place_meeting(i+32,RoomY-32-(160*ii)-Altura,argument2){instance_create(i+32,RoomY-32-(160*ii)-Altura,argument1)}

NumeroDePlataformas-=1
}
}
}

//:: PASO 4 ::// Agujeros
Agujeros=round(RoomX/160)
Agujero=0
AgujeroX=0
for (j=0; j<RoomX; j+=32)
{
AgujeroX=j
Agujero=choose(0,0,0,0,0,0,0,0,0,0,1)
if Agujero=1 && place_free(j,RoomY-32) && place_free(j,RoomY-64) && Agujeros>0
{
Agujeros-=1
with(argument0)
{
if x=argument3.AgujeroX && y=room_height-32
{
instance_destroy()
}
}
}
}

//:: PASO 5 ::// Jugadores
Distancia=-1
ID=instance_create(RoomX,RoomY,argument4)
with(ID)
{
if ((!place_free(x,y) || place_free(x,y+32)) || distance_to_object(argument5)<(room_width/2)) && !place_meeting(x,y+32,argument3)
{
do
{
x=random(room_width) y=random(room_height)
move_snap(32,32)
}
until
place_free(x,y) && !place_free(x,y+32)
}
}
ID.visible=1
ID2=instance_create(RoomX,RoomY,argument5)
with(ID2)
{
if ((!place_free(x,y) || place_free(x,y+2)) || distance_to_object(argument4)<(room_width/2)) && !place_meeting(x,y+32,argument3)
{
do
{
x=random(room_width) y=random(room_height)
move_snap(32,32)
Distancia+=1
}
until
place_free(x,y) && !place_free(x,y+2) && distance_to_object(argument4)>(room_width/2)-Distancia
}
}
ID2.visible=1

//ELIMINAR CONFLICTOS
with(argument5){if !place_free(x,y){instance_destroy()}}
//ESCENARIO CREADO
instance_destroy()
object_delete(argument3)

[/gml]

PD: Es bastante mejorable el script, y se podría optimizar mucho más pero no me he parado a hacerlo por falta de tiempo :-[
PD2: Como de costumbre, se agradecen créditos pero no son necesarios. :)
Título: Re: Generador de Mapas (Plataforma)
Publicado por: soccer2008 en Marzo 22, 2010, 05:39:56 AM
 Muy buena en verdad, te felicito sigue as? ;) ;)...una pregunta Twister, puedo aplicarlo a un juego de plataformas en 3D?
Título: Re: Generador de Mapas (Plataforma)
Publicado por: deathmetal en Marzo 22, 2010, 09:37:16 PM
lo probe para gm 6 y no se ejecutaba el juego xD enfin le heche un vistaso al script y esta muy bueno lastima que no pude verlo en accion porq no tengo gm8
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Twister en Marzo 24, 2010, 12:03:21 PM
Buenas!

Soccer2008, podr?as adaptarlo para usarlo en un juego 3D sin problemas en principio. Ya me contar?s :)

Y Deathmetal, no s? si funcionar? en otras versiones el script, est? hecho en GM8 Pro :(

Gracias por los comentarios!
Título: Re: Generador de Mapas (Plataforma)
Publicado por: deathmetal en Marzo 24, 2010, 05:18:24 PM
si, presisamente lo probe en gm6 registrado para ver si funcionaba y avisarte

pero o mi maquina no lo soporta (porque no me sale ningun error) o no se :) simplemente el juego no se ejecuta como si entrara en un bucle al principio del juego
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Ruisu~ en Marzo 29, 2010, 08:01:34 PM
Me pasa igual que a death metal... debe ser que hago algo mal no se D: pon un ejemplo
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Wadk en Marzo 29, 2010, 11:45:05 PM
Yo recuerdo haberlo probado y funcion?. Pero no me acuerdo qu? versi?n de GM us? (creo que la 8 ).
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Ruisu~ en Marzo 30, 2010, 05:39:05 AM
yo tambien lo prob? en la version 8 D: y nada, debe ser que no es la version ._.
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Wadk en Marzo 30, 2010, 06:43:29 AM
Como v? que hay problemas en hacer funcionar el script, intent? hacerlo funcionar otra vez pero no pude... :/ jurar?a que antes pude hacerlo :( no s? que estar? haciendo mal esta vez.
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Twister en Marzo 30, 2010, 08:29:05 AM
Me resulta muy extra?o que no os funcione, de hecho, lo acabo de probar en un nuevo proyecto en GM8 y me funciona sin problemas. Os adjunto mi prueba para que comprob?is si lo estabais usando correctamente :P
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Ruisu~ en Marzo 30, 2010, 09:15:26 AM
el error tiene como origen la diferencia entre la longitud del sprite del bloque -w- ese deberia ser otro argumento xD porque yo utilizo bloques de 16 y capaz los de los demas problemas tambien

EDIT:
este deber?a funcionar en todos, a no ser que los player tambien deben ser iguales a los bloques D: o no se, es algo en el sprite X_X tube que cambiarle el mask al otro player (que en realidad es la instancia que utilizo para terminar el nivel) para que sea como seria por default, o sea, como viene.

////////////////////////////VARIABLES PARA EL GENERADOR//////////////////////////////////
//-------------------------------------------------------------------------------------//
// PASO 1: Reconocer Ancho y Alto de pantalla, llenar los bordes con Solidos.          //
// PASO 2: Crear algunos obst?culos.                                                   //
// PASO 3: Crear algunas plataformas.                                                  //
// PASO 4: Crear Agujeros                                                              //
// PASO 5: Crear Jugadores                                                             //
// Creado por ~Twister (Gameart) :: twister_cgm@hotmail.es                             //
//-------------------------------------------------------------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////

//ARGUMENTOS
//ARGUMENT0 == Plataforma Solida
//ARGUMENT1 == Plataforma No-Solida
//ARGUMENT2 == Parent de Solidos
//ARGUMENT3 == ID Objeto que ejecuta este script
//ARGUMENT4 == J1
//ARGUMENT5 == J2
//ARGUMENT6 == alto y/o ancho de los bloques

//EJEMPLO :: GenerarLVL(SOLIDO,PLATAFORMA,solidos,Algoritmo,J1,J2)

//:: INICIO DE VARIABLES :://
var RoomX, RoomY, NumeroDeObstaculos, HayObstaculo, Obstaculo, Altura, Lineas, NumeroDePlataformas, Plataforma;
var Agujeros, Agujero, Distancia;

RoomX=room_width
RoomY=room_height
x=0;
y=0;

//:: PASO 1 ::// Bordes
for (i=0; i<RoomX; i+=argument6)     {instance_create(i,RoomY-argument6,argument0)}     //BORDE INFERIOR
for (i=0; i<RoomX; i+=argument6)     {instance_create(i,0,argument0)}            //BORDE SUPERIOR
for (i=argument6; i<RoomY-argument6; i+=argument6) {instance_create(0,i,argument0)}            //BORDE IZQUIERDO
for (i=argument6; i<RoomY-argument6; i+=argument6) {instance_create(RoomX-argument6,i,argument0)}     //BORDE DERECHO

//:: PASO 2 ::// Obstaculos
NumeroDeObstaculos=abs(random(RoomX/argument6)-4)
HayObstaculo=0;
Altura=0;

for (i=argument6; i<RoomX-argument6; i+=argument6)
{
Obstaculo=choose(0,argument6,argument6*2)
HayObstaculo=choose(0,1,2,3,4)
if HayObstaculo=1 && NumeroDeObstaculos>0
{
Altura=choose(0,1,2,3,4)
for (ii=0; ii<Altura; ii+=1)
{
instance_create(i,RoomY-argument6*2-(argument6*ii),argument0)
}
NumeroDeObstaculos-=1
}
}

//:: PASO 3 ::// Plataformas
Altura=0;
Lineas=round(RoomY/argument6*5)-1
NumeroDePlataformas=abs(random(RoomX/argument6)-4)

for (ii=1; ii<Lineas; ii+=1)
{
for (i=argument6; i<RoomX-argument6; i+=argument6)
{
Altura=choose(argument6,argument6*2)
Plataforma=choose(0,1,2,3,4)
if Plataforma=1 && NumeroDePlataformas>0
{
if !place_meeting(i,   RoomY-argument6-(argument6*5*ii)-Altura,argument2){instance_create(i,   RoomY-argument6-(argument6*5*ii)-Altura,argument1)}
if !place_meeting(i+argument6,RoomY-argument6-(argument6*5*ii)-Altura,argument2){instance_create(i+argument6,RoomY-argument6-(argument6*5*ii)-Altura,argument1)}

NumeroDePlataformas-=1
}
}
}

//:: PASO 4 ::// Agujeros
Agujeros=round(RoomX/argument6*5)
Agujero=0
AgujeroX=0
for (j=0; j<RoomX; j+=argument6)
{
AgujeroX=j
Agujero=choose(0,0,0,0,0,0,0,0,0,0,1)
if Agujero=1 && place_free(j,RoomY-argument6) && place_free(j,RoomY-argument6*2) && Agujeros>0
{
Agujeros-=1
with(argument0)
{
if x=argument3.AgujeroX && y=room_height-argument6
{
instance_destroy()
}
}
}
}

//:: PASO 5 ::// Jugadores
Distancia=-1
ID=instance_create(RoomX,RoomY,argument4)
with(ID)
{
if ((!place_free(x,y) || place_free(x,y+argument6)) || distance_to_object(argument5)<(room_width/2)) && !place_meeting(x,y+argument6,argument3)
{
do
{
x=random(room_width) y=random(room_height)
move_snap(argument6,argument6)
}
until
place_free(x,y) && !place_free(x,y+argument6)
}
}
ID.visible=1
ID2=instance_create(RoomX,RoomY,argument5)
with(ID2)
{
if ((!place_free(x,y) || place_free(x,y+2)) || distance_to_object(argument4)<(room_width/2)) && !place_meeting(x,y+ID2.sprite_height,argument3)
{
do
{
x=random(room_width) y=random(room_height)
move_snap(argument6,argument6)
Distancia+=1
}
until
place_free(x,y) && !place_free(x,y+2) && distance_to_object(argument4)>(room_width/2)-Distancia
}
}
ID2.visible=1

//ELIMINAR CONFLICTOS
with(argument5){if !place_free(x,y){instance_destroy()}}
//ESCENARIO CREADO
instance_destroy()
object_delete(argument3)


y hay bastantes cosas que se pueden simplificar xD
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Twister en Marzo 30, 2010, 09:33:47 AM
Esperar? a ver si lo prueba alguien m?s y modificar? el script para eso que dices.

Gracias :)
Título: Re: Generador de Mapas (Plataforma)
Publicado por: soccer2008 en Marzo 30, 2010, 05:05:02 PM
Voy a probarlo en gm8 y edito, gracias x compartir el script XD XD XD
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Wadk en Marzo 31, 2010, 02:30:07 AM
Logr? que funcionara, parece que se tranca si los dos objetos dados como s?lidos no est?n marcados como tales.
Por cierto, ?el ancho y alto de los bloques no podr?a ser obtenido autom?ticamente?
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Ruisu~ en Marzo 31, 2010, 05:21:36 AM
eso mismo pens? xD pero luego me di? flojera hacer todo eso asi que lo hice en una variable -w- (que vago xD) y lo de los solidos tambien lo not? D:
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Wadk en Marzo 31, 2010, 06:22:02 PM
Todo eso qu??
No bastar?a con esto
ancho=sprite_get_width(argument0.sprite_index);
y lo mismo para el alto (si es necesario, porque veo que ped?s el "alto y/o ancho")?
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Ruisu~ en Marzo 31, 2010, 08:03:11 PM
lo de alto y/o ancho es porque los bloques son normalmente cuadrados ._. y yo pens? en poner muchas veces argument0.sprite_height -w- ahora veo que me puedo simplificar aun mas xDD
Título: Re: Generador de Mapas (Plataforma)
Publicado por: Wadk en Marzo 31, 2010, 08:15:12 PM
Supuse que era por eso, pero no necesariamente son siempre cuadrados...
Título: Re: Generador de Mapas (Plataforma)
Publicado por: juan pablo en Abril 04, 2010, 02:26:06 PM
esta super bueno :P para haceer un platafomas con nvl dif. y sin un solo camino
Título: Re: Generador de Mapas (Plataforma)
Publicado por: albertgames en Noviembre 30, 2010, 05:08:19 PM
como funciona todo estto?? me estoi iniciando en game maker...
Título: Re: Generador de Mapas (Plataforma)
Publicado por: mitmaty en Mayo 23, 2011, 01:52:24 AM
si funciona