Estoy armando un juego en el cual los puzzles son en base a botones, puertas y cajas. El problema es que tengo muchos botones, y cada boton tendria que abrir varias puertas para que caigan las cajas. Mi idea era ponerle al boton el nombre btn_1 y que ese controle todas las compuertas compuerta_1, el btn_2, controla las compuerta_2, y asi sucesivamente. Es una solucion factible? Hay algo mejor al momento de hacer cosas asi? Porque sino, necesitaria muchisimas carpetas para mantener organizado el proyecto. Esto no es util, ya que tengo que hacer que el personaje y las cajas colisionen con cada compuerta distinta y hace al codigo muy engorroso y no permite modificarlo facilmente.

Este es un ejemplo de lo que necesito. Cada boton tiene que controlar a las plataformas indicadas (para que caigan las cajas):



Se me ocurrio una solucion temporal. Cada boton tiene en su evento Step el siguiente codigo:

[gml]a[0,0] = 3904; // X de la primer plataforma
a[0,1] = 960; // Y de la primer plataforma

a[1,0] = 3936; // X de la segunda
a[1,1] = 960; // Y de la segunda

a[2,0] = 3968; // X de la tercera
a[2,1] = 960; // Y de la tercera

aL = 3; // Cantidad de plataformas (No se como obtener el length del array)

if place_meeting(x,y,obj_pl1) or place_meeting(x,y,obj_box1) {
    for (i=0;i<=aL-1;i+=1) {
        if instance_position(a[i,0],a[i,1],obj_wall1) {
            position_change(a[i,0], a[i,1], obj_nw1,true);
        }
    }
} else {
    for (i=0;i<=aL-1;i+=1) {
        if instance_position(a[i,0],a[i,1],obj_nw1) {
            position_change(a[i,0], a[i,1], obj_wall1,true);
        }
    }
}[/gml]

Donde obj_wall1 son las plataformas y obj_nw es la plataforma "transparente". Arriba de todo estan declaradas las posiciones de las plataformas.
Funcionar, funciona. Pero no puedo reutilizar los botones en otro nivel, sino que tengo que seguir creando nuevos, ya que con ese codigo paso el valor X e Y. Si pudiera hacerlo con los ID's de las instancias CREO que funcionaria mejor.... CREO...
Ademas, me parece que estar haciendo esas comprobaciones todo el tiempo cargan bastante al juego, no se que piensan ustedes. Hablo desde mi conocimiento en base a lo que aprend? de forma independiende.

Saludos, y gracias de antemano

Para m? la mejor opci?n es no poner las puertas y botones en el room y tener un objeto que los cree.
Podr?a ser as?, con arrays:
[gml]boton[0, 0] = 100;  // Posici?n x.
boton[0, 1] = 100;  // Posici?n y.
boton[0, 2] = 2;  // N?mero de puertas que abre el bot?n.
boton[0, 3] = 50;  // x de la primera puerta.
boton[0, 4] = 50;  // y de la primera puerta.
boton[0, 5] = 50;  // x de la segunda puerta.
boton[0, 6] = 200;  // y de la segunda puerta.
// ...
botones = 1;  // Tama?o del array.

for (i = 0; i < botones; i += 1){
    with (instance_create(objBoton, boton[i, 0], boton[i, 1])){
        puertas = other.boton[i, 2];
        for (j = 0; j < other.boton[other.i, 2]; j += 1){
            puerta[j] = instance_create(objPuerta, other.boton[other.i, 3 + j * 2], other.boton[other.i, 4 + j * 2]);
        }
    }
}[/gml]
Un poco confuso pero bueno...

Ah? te va a quedar cada bot?n con un array "puerta" que contiene los ids de las puertas que controla el bot?n, y una variable puertas que contiene el tama?o de dicho array.
Despu?s para abrir las puertas, por ejemplo, destruy?ndolas, ser?a as?:
[gml]for (i = 0; i < puertas; i += 1){
    with (puerta){
        instance_destroy();
    }
}[/gml]

EDIT: Ah, por cierto, deber?as aprender a usar parents. Son muuuuy ?tiles.
Vim.

En mi juego, tengo hecho lo mismo: un bot?n y una puerta, pero en mi caso, hay varios botones y cada uno abre una puerta (tambien funcionaria para varias puertas)
Es tan sencillo como crear UN s?lo objeto bot?n y un objeto puerta. Entonces, en CREATE CODE, en la room, por ej, en el bot?n de arriba le pones index=0; y a los botones que deba abrir, index=0; as?, cada boton abre las puertas cuyo ?ndice es igual. Indicando las conexiones en los codigo de creado de instancia de la room, mediante codigos, es f?cil. Puedes colocar en la room las puertas y botones, y con ponerle un indice ya las conectas.

Wadk, ya me habia armado una funcion similar a esa pero que se adapta mejor a mis necesidades, gracias de todos modos.

Hela aqu? :

[gml]a[0] = argument0;
a[1] = argument1;

aL = argument2;

horizontal = argument3;

if place_meeting(x,y,obj_pl1) or place_meeting(x,y,obj_box1) {
    for (i=0;i<=aL-1;i+=1) {
        if !horizontal {
            if instance_position(a[0]+32*i, a[1], obj_wall1_h) {
                position_change(a[0]+32*i, a[1], obj_nw1_h, true);
            }
        } else {
            if instance_position(a[0], a[1]+32*i, obj_wall1_v) {
                position_change(a[0], a[1]+32*i, obj_nw1_v, true);
            }
        }
    }
} else {
    for (i=0;i<=aL-1;i+=1) {
        if !horizontal {
            if instance_position(a[0]+32*i, a[1], obj_nw1_h) {
                position_change(a[0]+32*i, a[1], obj_wall1_h, true);
            }
        } else {
            if instance_position(a[0], a[1]+32*i, obj_nw1_v) {
                position_change(a[0], a[1]+32*i, obj_wall1_v, true);
            }
        }
    }
}[/gml]


Por otro lado, si, creo que eso de los parents es algo que necesito aprender, no lo habia tenido en cuenta.

Por ultimo, lo del Create Code del room, tampoco lo conocia, soy nuevo en GM, no asi en programacion, y estaba buscando exactamente algo como eso! Muchas gracias DarkKRuleR

Creo que DarkKRuleR se refiere al creation code. Son confusos los nombres :/.
El creation code se accede con ctrl+click derecho sobre una instancia en el editor de rooms.

Ah y otra cosa, esto "i<=aL-1" deber?as redondearlo a esto "i<aL". Hacerlo as? es como una especie de est?ndar.
Vim.

Te dejo un ejemplo. Usa el creation code que es mas facil pero mas engorroso si tenes muchas puertas y botones

CitarAh y otra cosa, esto "i<=aL-1" deber?as redondearlo a esto "i<aL". Hacerlo as? es como una especie de est?ndar.

Lo hice asi para que cuando llame a la funcion pueda poner la cantidad de plataformas directamente sin tener que restar. Por si me olvido, asi era mas directo.

3dgeminis, muchas gracias por el ejemplo, ahora lo voy a analizar bien.

Saludos, gracias a todos

#7 Febrero 16, 2011, 04:43:21 AM Ultima modificación: Febrero 16, 2011, 04:46:13 AM por tigladd
Creo que no me funciona el ejemplo que me pasaste 3dgeminis, al tocar el boton no pasa nada. Ademas, la unica diferencia con lo que necesito es que tengo que cambiar la platforma por una transparente para que las cajas caigan y que cuando se deje de presionar el boton vuelvan a su estado normal. De este modo es necesario apretar los botones con las cajas para poder ir bajando. Me interesaria poder hacer funcionar el codigo que me pasaste porque me parece buena la idea y es lo que tenia en mente desde un principio. Ahora lo voy a revisar.

Revisado, hay que presionar para abajo para activarlo. Ahora tengo que ver como adaptarlo para lo que lo necesito. Gracias nuevamente!