Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: onixander en Octubre 14, 2013, 06:31:59 AM

Título: Proeblema con un array (Solucionado)
Publicado por: onixander en Octubre 14, 2013, 06:31:59 AM
buenas... el tema es asi, tengo pensado un juego done el terreno sea al mejor estilo terraria, con bloques de 16*16, ya tengo terminado el generador del terreno y esta funcionando bien, excepto por una cosa, al llegar al ultimo bloque tendria que crear un objeto llamado "obj_grass" y no lo hace... dejo el codigo y el archvio del GM para ver si alguien me podria dar una mano

//Creación de variables
global.grid_id=ds_grid_create(room_width/16,room_height/16)
ds_grid_clear(global.grid_id,0)
var array_x,total_x,total_y,xx,yy,cont,xx_prev,stone;
total_x=room_width/16
total_y=room_height/16

//Generación de datos

for(xx=0;xx<=total_x;xx+=1){ //Calcula aleatoriamente la cantidad de bloques en cada linea, y la asigna a un array
    if(xx==0){       
        array_x[xx]=random_range(15,21)}
    if(xx>0){
        array_x[xx]=array_x[xx-1]+random_range(-2,3)
        while(array_x[xx]>25){
            array_x[xx]=array_x[xx-1]+random_range(-2,3)}}}
           
           
for(xx=0;xx<=total_x;xx+=1){ //determina si el bloque es piedra, tierra, o pasto, asignando valores 1,2, o 3 a cada celda
    cont=0
    for(yy=total_y;yy>=0;yy-=1){       
        if(cont<array_x[xx]){
            if(ds_grid_get(global.grid_id,xx,yy+1)==2 or ds_grid_get(global.grid_id,xx-1,yy)==2){ // si, hay una piedra cercana, hay mas probabliddades de que sea piedra tambien
                stone=choose(1,2,3,4)
                if(stone==1){
                    ds_grid_set(global.grid_id,xx,yy,2)}
                else{
                    ds_grid_set(global.grid_id,xx,yy,1)}
                cont+=1}
            else{
                stone=choose(1,2,3,4,5,6,7,8) //si no hay piedra cercana, hay menos probablididades de que sea piedra
                if(stone==1){
                    ds_grid_set(global.grid_id,xx,yy,2)}
                else{
                    ds_grid_set(global.grid_id,xx,yy,1)}
                cont+=1}}
        if(cont==array_x[xx]){ //la ultima celda deberia ser pasto
            ds_grid_set(global.grid_id,xx,yy,3)}}}
           

           
//Creación de objetos
       
for(xx=0;xx<=total_x;xx+=1){
    for(yy=total_y;yy>=0;yy-=1){
        if(ds_grid_get(global.grid_id,xx,yy)==1){
            instance_create(xx*16,yy*16,obj_dirt)}
        if(ds_grid_get(global.grid_id,xx,yy)==2){
            instance_create(xx*16,yy*16,obj_stone)}
        if(ds_grid_get(global.grid_id,xx,yy)==3){
            instance_create(xx*16,yy*16,obj_grass)}}}
       
Título: Re:Proeblema con un array
Publicado por: Ulises en Octubre 14, 2013, 06:36:00 PM
Un código interesante, lo has echo tu?
Onixander, he mirado un poco el código por encima, espero poder ayudarte: a ver, tienes como condición que el "cont" sea equivalente al "array_x"; si debugearas un poco el código te darías cuenta que esto nunca va a suceder, porque array_x devuelve una fracción, debido al random_range. Por tanto, prueba sustituyendo todos los random_range por irandom_range y obtendrás que todos los bloques hasta el final de tu room son "grass".
Para solucionar lo último, se me ocurre que podrías parar el contador cuando la condición anterior se cumpla, por ejemplo con un "yy = 0" . El código completo sería el siguiente //Creación de variables
global.grid_id=ds_grid_create(room_width/16,room_height/16)
ds_grid_clear(global.grid_id,0)
var    cont, array_x ,total_x,total_y,xx,yy,xx_prev,stone;
total_x=room_width/16
total_y=room_height/16
//Generación de datos

for(xx=0;xx<=total_x;xx+=1){ //Calcula aleatoriamente la cantidad de bloques en cada linea, y la asigna a un array
    if(xx==0){       
        array_x[xx]=irandom_range(15,21)}
    if(xx>0){
        array_x[xx]=array_x[xx-1]+irandom_range(-2,3)
       while(array_x[xx]>25){
            array_x[xx]=array_x[xx-1]+irandom_range(-2,3)}}}
           
           
for(xx=0;xx<=total_x;xx+=1){ //determina si el bloque es piedra, tierra, o pasto, asignando valores 1,2, o 3 a cada celda
  cont = 0
    for(yy = total_y ;yy>=0;yy-=1){
        if(cont<array_x[xx]){
            if(ds_grid_get(global.grid_id,xx,yy+1)==2 or ds_grid_get(global.grid_id,xx-1,yy)==2){ // si, hay una piedra cercana, hay mas probabliddades de que sea piedra tambien
                stone=choose(1,2,3,4)
                if(stone==1){
                    ds_grid_set(global.grid_id,xx,yy,2)
                    }
                else{
                    ds_grid_set(global.grid_id,xx,yy,1)}
                cont+=1}
            else{
                stone=choose(1,2,3,4,5,6,7,8) //si no hay piedra cercana, hay menos probablididades de que sea piedra
                if(stone==1){
                    ds_grid_set(global.grid_id,xx,yy,2)
                    }
                else{
                    ds_grid_set(global.grid_id,xx,yy,1)}
                cont+=1}}
                 if(cont==array_x[xx]){
                 yy = 0//la ultima celda deberia ser pasto
                 ds_grid_set(global.grid_id,xx,yy,3)}}}
           

           
//Creación de objetos
       
for(xx=0;xx<=total_x;xx+=1){
    for(yy=total_y;yy>=0;yy-=1){
        if(ds_grid_get(global.grid_id,xx,yy)==1){
            instance_create(xx*16,yy*16,obj_dirt)}
        if(ds_grid_get(global.grid_id,xx,yy)==2){
            instance_create(xx*16,yy*16,obj_stone)}
        if(ds_grid_get(global.grid_id,xx,yy)==3){
            instance_create(xx*16,yy*16,obj_grass)}}}
Título: Re:Proeblema con un array
Publicado por: onixander en Octubre 15, 2013, 11:20:44 AM
jaja sisi lo hice yo, quería un código que generara un terreno aleatorio cada vez que arranque la room jajaja, igual tengo que seguir trabajando para que tenga mas variaciones

estuve viendo muchas cosas, una de ellas era que el tamaño de la room no era múltiplo de 16, pequeño problema, acomode eso y varias cosas empezaron a funcionar mejor... con el tema del grass lo pude solucionar simplemente sacando el ultimo if y colocando directamente el codigo

for(xx=0;xx<=total_x;xx+=1){ //determina si el bloque es piedra, tierra, o pasto, asignando valores 1,2, o 3 a cada celda
    cont=0   
    for(yy=total_y;yy>=0;yy-=1){       
        if(cont<array_x[xx]){
            if(ds_grid_get(global.grid_id,xx,yy+1)==2 or ds_grid_get(global.grid_id,xx-1,yy)==2){ // si, hay una piedra cercana, hay mas probabliddades de que sea piedra tambien
                stone=choose(1,2,3,4)
                if(stone==1){
                    ds_grid_set(global.grid_id,xx,yy,2)}
                else{
                    ds_grid_set(global.grid_id,xx,yy,1)}
                cont+=1}
            else{
                stone=choose(1,2,3,4,5,6,7,8) //si no hay piedra cercana, hay menos probablididades de que sea piedra
                if(stone==1){
                    ds_grid_set(global.grid_id,xx,yy,2)}
                else{
                    ds_grid_set(global.grid_id,xx,yy,1)}
                cont+=1}}}
    ds_grid_set(global.grid_id,xx,total_y-array_x[xx]-1,3)} // termina de generar las variables y a la ultima le
                                                                                           // asigna 3, osea obj_grass


con esto, apenas termina de asignar la ultima variable, la que sigue es "3" que despues se convierte en "obj_grass" Muchísimas gracias por tu ayuda :D