Buenas familia, otra vez ando por aqui. El problema que tengo ahora no es de codigo, sino de planteamiento.
Tengo un caso que no se muy bien como plantearlo de la forma mas eficaz y breve posible. Porque tengo una solucion, pero deberia de usar decenas de variables, y a ver si es posible que entre todos encontremos un planteamiento mas simple, breve y eficaz.
Es planteo el problema, voy a intentar explicarlo lo mejor posible;
El caso es que tengo 5 rooms, y en cada room voy a usar 4 carretas y 4 cajas, las tipicas que el player puede empujar y mover.
El caso, es que el player movera las cajas y carretas de un lugar a otro, tanto en el eje de la x como el de la y, y el player puede ir de una room a otra, y volver a las anteriores.
El problema esta, en que las cajas deben de aparecer en el mismo sitio donde las dejo, cuando se marcho de dicha room, y lo mismo con las demas room. Pero el tema principal esta, que aunque en cada room haya 4 cajas y 4 carretas, estas son siempre las mismas, es decir, que son las mismas cajas que estaban en la room anterior (aunque jugando al game no lo parezca claro).
Si utilizo variables globales para memorizar las posiciones de las cajas y carretas, estan apareceran en dicha posicion cuando cambie de room y esto no deberia de ocurrir, porque al cambiar de room, se supone que son otras cajas y carretas, y estas deberian de estar en la posicion donde el player las dejo cuando estuvo en esta room.
Jajajaja, es un poco lioso, pero he intentado explicarme lo mejor que he podido. Espero que me hayais entendido.
Creo que conozco una posicible solucion, pero deberia de usar muchar variables, seria algo asi como;
CAJA1_X_ROOM1;
CAJA1_Y_ROOM1;
CAJA1_X_ROOM2;
......................
......................
CAJA4_X_ROOM5;
tendria que usar muchisimas variables.
Entonces la cuestion es, como se podria hacer esto?? sin usar tantas variables y usando solo 4 cajas y 4 carretas para cada room??
Bueno, espero haberme explicado lo mejor posible, y a ver si entre todos podemos encontrar una buena solucion.
Saludos a todos!!!!! ;)
Primero, imaginemos que el juego está organizado así:
La caja es sólo un objeto, y en cada sala habrán varias instancias de dicho objeto. Además, la cantidad de cajas es fija (no cambia durante el juego).
Tomando en cuenta lo anterior, usa mapas y listas, así:
[gml]
/*
En algún evento o bloque de código que se ejecute
antes de todas las salas donde habrán cajas.
Es decir, este código debería ejecutarse una sola vez
en todo el juego, al menos mientras se desee mantener
las posiciones de las cajas
*/
global.pos_cajas = ds_map_create(); //Un solo mapa de ámbito global
[/gml]
[gml]
/*
El evento create de algún objeto que se ejecute
UNA SOLA vez por cada sala donde estarán las cajas.
Este objeto debe estár después de todas las cajas en el
instance order de la habitación actual.
================
Otra opción es usar directamente el Creation Code de la
habitación, que se ejecuta después de todas las instancias
*/
//Si aún no ha sido almacenada la posición de las cajas en la habitación actual
if(!ds_exists(global.pos_cajas[? room], ds_type_list))
{
global.pos_cajas[? room] = ds_list_create(); //En la habitación actual, crear una lista
var pos; //Una variable temporal para almacenar la posición de cada instancia
with(obj_caja) //Recorrer todas las instancias de obj_caja
{
pos[0] = x; //Almacenar la posición horizontal de la caja
pos[1] = y; //Almacenar la posición vertical de la caja
ds_list_add(global.pos_cajas[? room], pos); //Guardar la posición en la lista
}
}
//Si ya hay posiciones almacenadas,
else
{
var ind = 0; //índice de la lista por iteración de instancia
var pos; //Una variable temporal para almacenar la posición de cada instancia
with(obj_caja)
{
pos = ds_list_find_value(global.pos_cajas[? room], ind++); //Obtener posición guardada
x = pos[0]; //Establecer posición horizontal
y = pos[1]; //Establecer posición vertical
}
}
[/gml]
Haría falta pulir varias cosas, y puede tener errores (no he probado el código), pero te hace una idea.
Muchas gracias NiuWeb, pero nunca he usado mapas y listas.
Antes de intentar probar el planteamiento que me has comentado, deberia de entender como funcionan los mapas y listas de una manera mas basica.
Un ejemplo mas sencillo me vendria bien.
??? ???
Cita de: NiuWeb en Noviembre 06, 2017, 08:12:25 PM
Primero, imaginemos que el juego está organizado así:
La caja es sólo un objeto, y en cada sala habrán varias instancias de dicho objeto. Además, la cantidad de cajas es fija (no cambia durante el juego).
Tomando en cuenta lo anterior, usa mapas y listas, así:
[gml]
/*
En algún evento o bloque de código que se ejecute
antes de todas las salas donde habrán cajas.
Es decir, este código debería ejecutarse una sola vez
en todo el juego, al menos mientras se desee mantener
las posiciones de las cajas
*/
global.pos_cajas = ds_map_create(); //Un solo mapa de ámbito global
[/gml]
[gml]
/*
El evento create de algún objeto que se ejecute
UNA SOLA vez por cada sala donde estarán las cajas.
Este objeto debe estár después de todas las cajas en el
instance order de la habitación actual.
================
Otra opción es usar directamente el Creation Code de la
habitación, que se ejecuta después de todas las instancias
*/
//Si aún no ha sido almacenada la posición de las cajas en la habitación actual
if(!ds_exists(global.pos_cajas[? room], ds_type_list))
{
global.pos_cajas[? room] = ds_list_create(); //En la habitación actual, crear una lista
var pos; //Una variable temporal para almacenar la posición de cada instancia
with(obj_caja) //Recorrer todas las instancias de obj_caja
{
pos[0] = x; //Almacenar la posición horizontal de la caja
pos[1] = y; //Almacenar la posición vertical de la caja
ds_list_add(global.pos_cajas[? room], pos); //Guardar la posición en la lista
}
}
//Si ya hay posiciones almacenadas,
else
{
var ind = 0; //índice de la lista por iteración de instancia
var pos; //Una variable temporal para almacenar la posición de cada instancia
with(obj_caja)
{
pos = ds_list_find_value(global.pos_cajas[? room], ind++); //Obtener posición guardada
x = pos[0]; //Establecer posición horizontal
y = pos[1]; //Establecer posición vertical
}
}
[/gml]
Haría falta pulir varias cosas, y puede tener errores (no he probado el código), pero te hace una idea.
Aún está incompleto, pero puedes leer esta información en el repositorio del manual en traducción:
https://github.com/Glioce/Documentacion_GMS/blob/master/Referencia/Estructuras_de_datos/index.html
No podrias hacer los rooms persistentes?
Probablemente suene muy básico, pero cuando quiero que las cosas se queden como las deje, simplemente vuelto a la "room" persistente, ya que mi juego tiene exploración y libertad, por lo tanto es normal que vuelva a ver las cosas tal y como las deje, claro que tendrás que usar tus habilidades de diseñador de niveles para que el jugador no se quede atrapado en un punto muerto, no vaya a ser que tus cajas se vuelvan un mal diseño de juego. :)
Que significa hacer las rooms persistentes? :o
Cita de: 3dgeminis en Noviembre 07, 2017, 05:35:40 AM
No podrias hacer los rooms persistentes?
He probado con un par de FOR pero me da un error.
Os paso el codigo.
Antes de cargar la roomNIVEL1 cargo estas variables;
[gml]if !(JUEGO_COMENZADO)
{
for(i=1;i<=10;i++)
{
globalvar POSICION_X_ROOM1_CAJA;
globalvar POSICION_Y_ROOM1_CAJA;
if (i == 1)
{
POSICION_X_ROOM1_CAJA = 400; //400
POSICION_Y_ROOM1_CAJA = 200;
POSICION_X_ROOM2_CAJA = 208;
POSICION_Y_ROOM2_CAJA = 398;
}
if (i == 2)
{
POSICION_X_ROOM1_CAJA = 538;
POSICION_Y_ROOM1_CAJA = 106;
POSICION_X_ROOM2_CAJA = 518;
POSICION_Y_ROOM2_CAJA = 640;
}
}
}[/gml]
Y despues en el CREATE DE LA BOX;
[gml]for(numero=1;numero<=10;numero++)
{
if (CAJA[numero]==0)
{
CAJA[numero]=id;
}
}
if (room == roomNIVEL1)
{
CAJA[numero].x = POSICION_X_ROOM1_CAJA[numero];
CAJA[numero].y = POSICION_Y_ROOM1_CAJA[numero];
}
if (room == roomNIVEL2)
{
CAJA[numero].x = POSICION_X_ROOM2_CAJA[numero];
CAJA[numero].y = POSICION_Y_ROOM2_CAJA[numero];
}[/gml]
Pero me sale este error
FATAL ERROR in
action number 1
of Create Event
for object objectBOX:
Push :: Execution Error - Variable Index [0,11] out of range [1,3] - -5.POSICION_X_ROOM1_CAJA(100093,11)
at gml_Object_objectBOX_CreateEvent_1 (line 23) - CAJA[numero].x = POSICION_X_ROOM1_CAJA[numero];
Me pone que esta fuera de rango y no entiendo porque, ahora mismo se me escapa.
A ver si entre todos vemos donde esta el error, porque con este metodo, solo necesitaria un objecto caja para colocar varias cajas en todas las habitaciones, y memorizar independientemente una de las otras su posicion.
Solo me falta saber porque da error de fuera de rango al leer esa variable global.
Please!!! A VER SI ALGUIEN DESCUBRE EL ERROR!!!! :'(
En las propiedades del room:
(https://i.imgur.com/kXJZmiv.png)
https://docs.yoyogames.com/source/dadiospice/002_reference/rooms/room_persistent.html (https://docs.yoyogames.com/source/dadiospice/002_reference/rooms/room_persistent.html)
Hostia, a cabo de resolver el problema que tenia que estaba en el FOR, que tenia que hacer un exit, al asignarle el id y solo era eso.
Ahora todo funciona, puedo poner cuantas cajas quiera, y realmente solo tengo un objecto caja.
Y acabo de ver el documento de la persistencia de la room y he flipado, no sabia que esta pestaña hacia esto.
El caso es que ya lo he resuelto, solo me queda hacerlos con la carreta. Ahora no se si usar mi metodo o el de la persistencia. Bueno ya os contare.
De momento me funciona y eso es lo importante. ;D
Cita de: 3dgeminis en Noviembre 07, 2017, 07:11:56 PM
En las propiedades del room:
(https://i.imgur.com/kXJZmiv.png)
https://docs.yoyogames.com/source/dadiospice/002_reference/rooms/room_persistent.html (https://docs.yoyogames.com/source/dadiospice/002_reference/rooms/room_persistent.html)