Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: PROBLEMA DE PLANTEAMIENTO  (Leído 616 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nonoroman

en: Noviembre 06, 2017, 07:13:52 pm
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!!!!!  ;)

PCNONOGames  www.pcnono.es
 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado bygdle

  • Flota de Justicia Particular.
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 2841
  • Mensajes: 1.715
  • Agradecido: 150 veces
  • Sexo: Masculino
  • Thomas the dank engine.
    • Ver Perfil
Respuesta #1 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í:
/*
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
/*
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
    }
}
Haría falta pulir varias cosas, y puede tener errores (no he probado el código), pero te hace una idea.

alaberga regué el café.

BA:STFW&RTFM
 
Los siguientes usuarios dieron las gracias a este tema: nonoroman, Yuzo


Desconectado nonoroman

Respuesta #2 en: Noviembre 06, 2017, 09:49:28 pm
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.

 ??? ???

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í:
/*
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
/*
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
    }
}
Haría falta pulir varias cosas, y puede tener errores (no he probado el código), pero te hace una idea.

PCNONOGames  www.pcnono.es
 


Desconectado bygdle

  • Flota de Justicia Particular.
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 2841
  • Mensajes: 1.715
  • Agradecido: 150 veces
  • Sexo: Masculino
  • Thomas the dank engine.
    • Ver Perfil
Respuesta #3 en: Noviembre 06, 2017, 10:07:18 pm
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

alaberga regué el café.

BA:STFW&RTFM
 


Desconectado 3dgeminis

Respuesta #4 en: Noviembre 07, 2017, 05:35:40 am
No podrias hacer los rooms persistentes?

 
Los siguientes usuarios dieron las gracias a este tema: nonoroman, Yuzo


Desconectado Naitsabes0

Respuesta #5 en: Noviembre 07, 2017, 05:45:15 am
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.  :)

 
Los siguientes usuarios dieron las gracias a este tema: nonoroman, Yuzo


Desconectado nonoroman

Respuesta #6 en: Noviembre 07, 2017, 05:01:03 pm
Que significa hacer las rooms persistentes?   :o


No podrias hacer los rooms persistentes?

PCNONOGames  www.pcnono.es
 


Desconectado nonoroman

Respuesta #7 en: Noviembre 07, 2017, 05:12:07 pm
He probado con un par de FOR pero me da un error.

Os paso el codigo.

Antes de cargar la roomNIVEL1 cargo estas variables;

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[i] = 400;  //400
            POSICION_Y_ROOM1_CAJA[i] = 200;
            POSICION_X_ROOM2_CAJA[i] = 208;
            POSICION_Y_ROOM2_CAJA[i] = 398;
        }
       
        if (i == 2)
        {
            POSICION_X_ROOM1_CAJA[i] = 538;
            POSICION_Y_ROOM1_CAJA[i] = 106;
            POSICION_X_ROOM2_CAJA[i] = 518;
            POSICION_Y_ROOM2_CAJA[i] = 640;
        }
    }

}

Y despues en el CREATE DE LA BOX;

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];
}

Pero me sale este error

Código: [Seleccionar]
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!!!!  :'(
« última modificación: Noviembre 07, 2017, 11:18:14 pm por Johann »

PCNONOGames  www.pcnono.es
 


Desconectado 3dgeminis

Respuesta #8 en: Noviembre 07, 2017, 07:11:56 pm

 
Los siguientes usuarios dieron las gracias a este tema: nonoroman


Desconectado nonoroman

Respuesta #9 en: Noviembre 07, 2017, 07:36:30 pm
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

En las propiedades del room:

https://docs.yoyogames.com/source/dadiospice/002_reference/rooms/room_persistent.html

PCNONOGames  www.pcnono.es