En las rooms tengo el siguiente orden:
(http://i1206.photobucket.com/albums/bb443/APSSPAAPS/Captura-2_zpsd3957a33.png)
Lo que quiero hacer es que si estoy en MenuOpciones o MenuCreditos y le doy al botón atrás vuelva a la room anterior en la que se estuvo, es decir, que si estaba en MenuPrincipal y desde ahi voy a MenuOpciones, al darle al botón de "atrás" vuelva a MenuPrincipal. He probado con room_goto_previous y no funciona, me lleva a la room que esta por encima en la imagen (osea, que si estoy en MenuOpciones y doy atrás me lleva a MenuMundos) he visto que hay una función llamada room_previous(numb) pero he probado y no me funciona, no me da error pero el botón no hace nada al pulsarlo. ¿Hay una manera de hacerlo?
Saludos y gracias por el tiempo
Esas dos funciones sirven para obtener las rooms anteriores (o posteriores) usando el orden tal como lo ves en el arbol de recursos (la foto)
Se me ocurre que guardes en una variable global la room en la que estás antes de cambiar de room, algo así como:
global.roomAnterior = room;
room_goto(MenuOpciones);
Luego cuando quieras volver:
Citarroom_goto(global.roomAnterior)
El problema es que solo funciona para volver una sola vez, para volver atrás una room todas las veces que quieras podés usar:
Al comienzo del juego:
global.numeroDeRoomsVisitadas = 0;
Al cambiar de room:
global.roomAnterior[global.numeroDeRoomsVisitadas] = room;
global.numeroDeRoomsVisitadas += 1;
room_goto(MenuOpciones);
Para volver atras una room:
if global.numeroDeRoomsVisitadas > 0 { //Para que no intenten volver atras en la primera room
global.roomAnterior[global.numeroDeRoomsVisitadas] = room;
global.numeroDeRoomsVisitadas += 1;
room_goto(global.numeroDeRoomsVisitadas);
}
Creo que así andaría ;D
Lo he intentado y no me va :/ Creo que mejor hago un objeto volver para cada menu con un padre y ya, aunque pueda consumir mas T_T
room_goto(room_last)
Con eso lo que hace es llevarme a la ultima room de la lista :/
Ugh perdón :-[ me equivoqué en una cosita en el código de volver atrás:
// Volver una room
if global.numeroDeRoomsVisitadas > 0 { //Para que no intenten volver atras en la primera room
global.roomAnterior[global.numeroDeRoomsVisitadas] = room;
global.numeroDeRoomsVisitadas -= 1;
room_goto(global.roomAnterior[global.numeroDeRoomsVisitadas - 1]);
}
Por las dudas adjunto un ejemplo (es para Game Maker 8, así que debería andar en Studio)
EDIT: Con 0, 1, 2, y 3 cambias las rooms. Y con Backspace (La tecla de borrar arriba del enter) volvés atrás las rooms. Vas a ver que siempre terminas en el menú principal (Magia? XD)
Pues algo hago mal y no se el que :/ Me da este error cuando pulso atras en un menu (Este error es en la room MenuOpciones:
Citar
___________________________________________
FATAL ERROR in
action number 1
of Mouse Event for Left Button
for object AtrasButtonGlobal:
############################################################################################
VMError!! Occurred - Push :: Execution Error - Variable Index [0,-1] out of range [1,2] - -5.roomAnterior(100001,-1)
at gml_Object_AtrasButtonGlobal_Mouse_0 (line 2) - global.roomAnterior[global.numeroDeRoomsVisitadas] = room;
############################################################################################
Global Variables :
numeroDeRoomsVisitadas(100000) = 0
roomAnterior(100001) = { { 0 ,2}, }
Cree un objeto global con un evento como el que pusiste en el ejemplo (al crear el juego) que lo pongo en todas las rooms en las que se deberia poder volver atras con:
global.numeroDeRoomsVisitadas = 0;
Al pulsar el boton que te lleva a la siguiente room pongo:
global.roomAnterior[global.numeroDeRoomsVisitadas] = room;
global.numeroDeRoomsVisitadas += 1;
room_goto(LaRoomQueToque);
y en el boton de "Atras" puse:
// Volver una room
if global.numeroDeRoomsVisitadas > 0 { //Para que no intenten volver atras en la primera room
global.roomAnterior[global.numeroDeRoomsVisitadas] = room;
global.numeroDeRoomsVisitadas -= 1;
room_goto(global.roomAnterior[global.numeroDeRoomsVisitadas - 1]);
}
Uy, me mataste XD
Para decirte la verdad no tengo mucha idea de que puede ser.
El error que me das es bastante distinto a los que da GM8
Me parece que dice que intentamos acceder al array roomAnterior con un indice no permitido, o sea que está fuera de los límites. Lo raro es que GameMaker tiene arrays sin longitud definida, o sea que si declaro un array de longitud 8 luego puedo guardar algo en el indice 20 por ejemplo.
Tambien dice que el indice [0,-1] esta fuera del rango [1,2]. A eso no lo entiendo, porque me está mostrando dos indices, cuando nuestro array es de una sola dimension ???. Pero ahi se puede ver que intenta acceder al indice -1, así que debe ser eso (No existe el indice -1 en los arrays).
Luego muestra que el error ocurrió al guardar en el array la room actual (global.roomAnterior[global.numeroDeRoomsVisitadas] = room;), o sea que el error no es por intentar leer el array en una posición en donde no escribimos nada, si no por escribir en el indice -1
Y lo que me confunde también, es que uno podría pensar que el problema es que numeroDeRoomsVisitadas es igual a -1 (ya que es el indice del array). Pero no, mas abajo dice que es = 0 ??? ???
Y por ultimo al final podés ver los valores del array, que son 0 y 2. Me parece que eso está bien, porque 0 es MenuPrincipal y 2 es MenuOpciones (Podes ver que estan en el orden de la imagen que me pasate)
Y ademas de mostrarme arrays de dos dimensiones el error muestra numeros al lado de las variables. Ni idea de que significan, seran los punteros? :-\
No se si probaste en GM Studio el ejemplo que te adjunté, a lo mejor ese funciona para ver las diferencias. En GM8 me anda perfectamente
Entonces yo probaría correr el ejemplo que te adjunté, después podés probar a declarar el array al principio del juego con "global.roomAnterior[100] = 0". Eso crearía un array preparado para 100 cambios de room (me parece que sobra) para ver si ese es el problema
Y otra cosa que se puede hacer es dibujar en draw los valores de global.numeroDeRoomsVisitadas y del array poniendo en draw:
draw_text(10, 25, "global.numeroDeRoomsVisitadas = " + string(global.numeroDeRoomsVisitadas))
for (i = 0; i <= global.numeroDeRoomsVisitadas - 1; i += 1) {
draw_text(10, 40 + 15*i, "global.roomAnterior[" + string(i) + "] = " + string(global.roomAnterior[i]))
}
Eso sirve para vigilar que global.numeroDeRoomsVisitadas no se haga -1 en ningun momento y para ver como se agregan y sacan valores del array que es muy divertido XD
Si pongo el array ese me sale:
Citar___________________________________________
FATAL ERROR in
action number 1
of Mouse Event for Left Button
for object AtrasButtonGlobal:
############################################################################################
VMError!! Occurred - Push :: Execution Error - Variable Index [0,-1] out of range [1,101] - -5.roomAnterior(100001,-1)
at gml_Object_AtrasButtonGlobal_Mouse_0 (line 1) - if global.numeroDeRoomsVisitadas > 0 { //Para que no intenten volver atras en la primera room
############################################################################################
Global Variables :
numeroDeRoomsVisitadas(100000) = 0
roomAnterior(100001) = { { 0 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ... },
Quito el array o lo dejo y pongo el Draw, en la principal me sale que NumeroDeRomsVisitadas es 0 si entro en Opciones es 1 y RoomAnterior[0]-0 pero sigue dando error
EDITO: LO ARREGLE (CREO) Ya no me da error. Cambie el codigo de volver atras una room:
if global.numeroDeRoomsVisitadas > 0 {
global.roomAnterior[global.numeroDeRoomsVisitadas] = room;
global.numeroDeRoomsVisitadas -= 1;
room_goto(global.roomAnterior/*[global.numeroDeRoomsVisitadas - 1]*/);
}
Puse eso como comentario en la ultima linea, no lo vi necesario porque en la segunda linea ya dices que el valor de la room anterior es la del NumeroDeRoomsVisitadas (o eso me parece XD) y en la siguiente le restas uno asi que pense que con solo poner que room_goto es global.roomAnterior valdria y parece que si D:
Nop, como decis esta mal :P
Con tu codigo siempre se va al menu principal, porque no le estas diciendo a qué índice ir (le sacaste los []), entonces usa el indice 0
En la linea 2 digo que roomAnterior en la posicion numeroDeRoomsVisitadas sea igual a la room actual
Es interesante que con tu metodo no te haya dado errores, ahora me tengo que ir, en un rato me fijo como arreglarlo
Pues vaya xDD De todos modos he probado a hacer un bucle de menus, en el menú principal el botón te lleva a opciones y cree otro para ir atras, en el menú opciones cree uno para ir al menú principal y otro de atrás. Empiezo a viajar de un menú a otro sin dar al botón atrás y cuando llevo muchos le empiezo a dar atrás la primera vez que le doy hacia atrás se queda en el mismo menú (hay que darle 2 veces) y cuando NumeroDeRoomsVisitadas va a dar 0 (la ultima vez que debería poder ir hacia atrás) es cuando da el error :/ No se si me explique bien o te servirá de algo
Eso pasa con tu metodo o con el mio? seguramente es porque intentas ir a la room anterior cuando no la hay o algo asi (por eso puse un if al principio)
De ultima probá sacando el -1 en la última linea, asi:
if global.numeroDeRoomsVisitadas > 0 {
global.roomAnterior[global.numeroDeRoomsVisitadas] = room;
global.numeroDeRoomsVisitadas -= 1;
room_goto(global.roomAnterior[global.numeroDeRoomsVisitadas]);
}
Pasaba con el tuyo pero da igual ya, con esto ultimo SI QUE VA :_D Puedo navegar todo lo que quiera por los menus que funciona hasta llega al primer menu que estuve :') Gracias!!!