Febrero 26, 2010, 05:23:16 PM Ultima modificación: Octubre 20, 2018, 07:37:09 PM por Johann
* 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. :)

 Muy buena en verdad, te felicito sigue as? ;) ;)...una pregunta Twister, puedo aplicarlo a un juego de plataformas en 3D?
Un foro donde hay de todo: http://fileceru.foroactivo.net (se necesitan moderadores para el foro)

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

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!

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

Me pasa igual que a death metal... debe ser que hago algo mal no se D: pon un ejemplo

Yo recuerdo haberlo probado y funcion?. Pero no me acuerdo qu? versi?n de GM us? (creo que la 8 ).
Vim.

yo tambien lo prob? en la version 8 D: y nada, debe ser que no es la version ._.

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.
Vim.

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

#10 Marzo 30, 2010, 09:15:26 AM Ultima modificación: Marzo 30, 2010, 09:56:13 AM por Ruisu~
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

Esperar? a ver si lo prueba alguien m?s y modificar? el script para eso que dices.

Gracias :)

Voy a probarlo en gm8 y edito, gracias x compartir el script XD XD XD
Un foro donde hay de todo: http://fileceru.foroactivo.net (se necesitan moderadores para el foro)

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?
Vim.

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: