Usar las vistas del las Rooms como si fuesen Rooms

Marco1973

Hola a todos.

Estoy intentando usar las distintas "views" o vistas de las Rooms como si fuesen roms propiamente dichas para, así, aumentar el número de rooms del juego, ya que empleo la versión gratuita de game maker 1.3, que sólo permite 5 rooms en total.

Lo que intento es que en función de la posición del protagonista, se vea una vista u otra de la room, que forma un gran laberinto.
La room en total mide 5760x3240 pixeles.
De ahí sacaría 9 vistas en total en teoría, pero como el programa sólo me permite 8 vistas por room, esas son las que uso.
Le pongo a la room un objeto con una acción step con el siguiente script:

while ((P02).x > 0 &&
    (P02).x < 1920 &&
    (P02).y > 0 &&
    (P02).y > 1080)
    {
    view_visible[1]=0
    view_visible[0]=1
    view_visible[0]=2
    view_visible[0]=3 
    view_visible[0]=4
    view_visible[0]=5
    view_visible[0]=6
    view_visible[0]=7
    }
    
if ((P02).x > 0 && (P02).x < 1920 && (P02).y > 0 && (P02).y > 1080) { view_visible[1]=0 view_visible[0]=1 view_visible[0]=2 view_visible[0]=3 view_visible[0]=4 view_visible[0]=5 view_visible[0]=6 view_visible[0]=7 } if ((P02).x > 1920 && (P02).x < 3840 && (P02).y > 0 && (P02).y > 1080) { view_visible[0]=2 view_visible[0]=0 view_visible[1]=1 view_visible[0]=3 view_visible[0]=4 view_visible[0]=5 view_visible[0]=6 view_visible[0]=7 }
if ((P02).x > 0 && (P02).x < 1920 && (P02).y > 1080 && (P02).y > 2160) { view_visible[0]=1 view_visible[0]=0 view_visible[1]=2 view_visible[0]=3 view_visible[0]=4 view_visible[0]=5 view_visible[0]=6 view_visible[0]=7 }
if ((P02).x > 1920 && (P02).x < 3840 && (P02).y > 1080 && (P02).y > 2160) { view_visible[0]=0 view_visible[0]=0 view_visible[0]=1 view_visible[0]=2 view_visible[1]=3 view_visible[0]=5 view_visible[0]=6 view_visible[0]=7 }
if ((P02).x > 3840 && (P02).x < 5760 && (P02).y > 1080 && (P02).y > 2160) { view_visible[0]=5 view_visible[0]=0 view_visible[0]=1 view_visible[0]=2 view_visible[0]=3 view_visible[1]=4 view_visible[0]=6 view_visible[0]=7 }
if ((P02).x > 0 && (P02).x < 1920 && (P02).y > 2160 && (P02).y > 3240) { view_visible[0]=6 view_visible[0]=0 view_visible[0]=1 view_visible[0]=2 view_visible[0]=3 view_visible[0]=4 view_visible[1]=5 view_visible[0]=7 }
if ((P02).x > 1920 && (P02).x < 3840 && (P02).y > 2160 && (P02).y > 3240) { view_visible[0]=7 view_visible[0]=0 view_visible[0]=1 view_visible[0]=2 view_visible[0]=3 view_visible[0]=4 view_visible[0]=5 view_visible[1]=6
}

Pero el resultado no es satisfactorio. El personaje protagonista empieza en la view 0, pero al irse a la derecha de la pantalla simplemente desaparece y si le damos otra vez a la izquierda vuelve a aparecer.
Cuando intento que vaya hacia abajo el programa se bloquea.
Inmagino que estaré haciendo algo mal porque llevo 5 días con el programa. ¿Cuál es la mejor manera de hacer esto di es posible? ¿O hay que reignarse a tener más pantallas sólo en el Game Maker de pago?

Saludos y gracias de antemano.

13500

ese código a simple vista tiene un montón de cosas que están mal

spoiler

A parte de que no le veo sentido de sobreescribir el valor view_visible[0] 6 veces, tampoco veo sentido de que uses un while y un if para misma condicion

spoiler
Marco1973

Y cómo lo harías tu? Es que estoy empezando con el programa y son mis primeros códigos. Con el entorno del Game Maker ya me defiendo bastante bien, pero el problema lo tengo al escribir código que se salga un poco de lo normal predefinido en el programa. Lo hago leyendo de aquí y de allá y modificando y rehaciendo. Lo dicho... ¿Cómo sería entonces? Error e código no da. (P02) en la que intento especificar que la x y la y son de la instancia del objeto del jugador, ya que P02 es el código de la instancia P02, que es la que va en la pantalla.

Un saludo.

Humanoide

¿no es infinitamente más facil simplemente desplazar el view?

2 respuestas
Jastro

#1 ¿Que versión estas usando de gm? En la pagina web, eliminaron la versión de tener recursos limitados, ahora esta la standard y alli puedes crear miles de rooms si quieres.

https://www.yoyogames.com/studio

Guardas ese proyecto, lo exportas, lo importas en la versión standard y a vivir la vida. Si no, la otra opcion es como dice #4 simplemente coge una sola view y muevela a la siguiente zona.

1 respuesta
Marco1973

Supongo que te refieres a que sea un juego con scroll, tipo estilo al clásico "Gauntlet" si estamos en vista cenital, que es mi caso, o a "Sonic" si fuese de plataformas, pero no me refiero a eso, me refiero a que aparezca la pantalla. Si el personaje desaparece por la izquierda tiene que aparecer otra pantalla en la que el personaje este apareciendo por la derecha.

Porque desplazar el view 0 de golpe, por ejemplo ¿cómo se haría? ¿Poniendo variables a las views y adjudicándole nuevos valores? Entonces sólo usaría una view con variables a las que les iría reasignando valores no? ¿Cómo sería?

No se si te refieres a lo primero, el scroll, o a los segundo...

Saludos.

1 respuesta
Marco1973

Me descargué la versión 1.3, que es la que está en la web yo-yo (me la bajé la semana pasada), y tiene limitación de objetos, sprites y rooms, no me importa porque estoy aprendiendo y así me busco la vida para economizar recursos y que pesen menos los proyectos, pero qué versión debería bajarme entonces?

Humanoide

#6 a lo segundo.
básicamente en vez de desplazar la view pocos pixeles los desplazas más (o lo desplazas rapidamente fijando un limite, como se hace en ese tipo de juegos). te recomiendo mirar el manual de game maker (f1) y mirarte view_wview, view_xview.. porque solo con eso y un par de tonterias deberias de poder hacerlo facilmente

Marco1973

Lo que no entiendo es porque me bajo la versión última del programa gratuito en yo-yo y me sigue limitando el número de rooms a 5 (y de más cosas...) ¿?¿?¿?

13500

#1 tu código corregido

spoiler
Marco1973

Intentaré lo que dices Humanoide, tiene lógica y no parece tan difícil. Muchas gracias.
Si alguien más aporta alguna idea leo encantado...

Marco1973

Muchas gracias 13500, lo probaré. Lo que no entiendo es porque en unos sitios leo una nomenclatura de GML y en otros otra ¿es que el lenguaje ha cambiado mucho en poco tiempo? ¿Hay ejemplos con errores? No entiendo...

Marco1973
  1. Tu código me da un error al ejecutar el juego y no funciona.
    Me dice respecto al escrip que me has pasado:

"In script0 line 98 pos 2: Unknown function or script: screen_redraw"

¿?

Marco1973

Mis disculpas si en algo no me explico bien... Es que soy más dibujante y diseñador que programador... Tengo algo de conocimiento de programación pero no soy programador puro y duro... jeje

1 respuesta
13500

#14 disculpame tu a mi porque nunca he tocado GM en mi vida, pero algo de programación se, y parece que la funcion screen_redraw() ya esta obsoleta. (prueba a eliminar esa linea)

Hazles caso a #4 y #5 porque ellos sí que han trabajado y terminado proyectos en GM

Marco1973

He probado a eliminar la función que dices. Se ejecuta el juego, pero no cambia de pantalla al desaparecer el personaje, sino que simplemente desaparece el personaje, por ejemplo por la derecha de la pantalla, y si le doy a los controles la izquierda reaparece. Pueden incluso matarlo en la pantalla de la derecha sin que yo lo vea (escucho los sonidos).

1 respuesta
Jastro

#16 en cuanto a lo de las limitaciones de rooms, eso es probablemente, porque no te has registrado, al registrarte te dan una licencia, la aplicas y entonces, puedes usarlo libremente.

Como te veo muy perdido te hice un pequeño ejemplo:

Te dejo el proyecto exportado, simplemente abre tu gamemaker, dale a importar y selecciona el archivo, alli podras ver como se usa de forma facil y sencilla

https://www.mediafire.com/?2e98kigcjjpz531

1
Marco1973

Por lo que veo en el gif es exactamente lo que quiero.
Lo pruebo y te comento.
Muchas gracias!

Marco1973

He conseguido registrar el gamemaker con la licencia que me dan y efectivamente y apuedo hacer infinitas rooms.
Aún así prefiero intentar lo que estaba haciendo ya que de esta manera cada room puede ser un laberinto diseñado en poco tiempo. que de otra manera, room a room, llevaría más tiempo, Además, complicaría la cosa para que los enemigos pasasen de una pantalla a otra y de esta manera lo hacen facilmente.
Tengo un progblema con tu proyecto Jastro, no lo puedo abrir. El game maker no lo reconoce y no lo veo en la ventana de Abrir proyectos.
Mi versión de Game Maker es la 1.3.1347. Me la he bajado hoy de YO-YO.
¿Cual es la tuya?
Saludos y gracias!

2 respuestas
Jastro

#19 esa es la ultima si. No tienes que darle a abrir proyectos, tienes que darle a importar proyectos. Son dos cosas distintas

Marco1973

importado. ok. :)))

Marco1973

En cuanto lo pruebe en mi proyecto te comento. Muchas gracias Jastro.

Marco1973

Jastro, disculpa que sea pesado pero soy principiante... No entiendo bien el uso del objeto trans en tu proyecto, ya que no lo colocas en ningún momento en el escenario... ¿cómo va a colisionar con el objeto jugador? Se me debe estar escapando algo...

Marco1973

Hola a todos. Astro #19 , hice un código basado en el tuyo para el Step de mi objeto personaje protagonista jugador.
Es para 9 pantallas en un 3x3 de la room. La room total tiene 5760x3240.
Cada pantalla tiene 1920x1080.
El código es el siguiente:

 if(!view_object[0] == noone)
    view_object[0] = noone;
    
if(y > 0)and(y < 1080) { view_yview[0] = 0; } if(y > 1080)and(y < 2160) { view_yview[0] = 1080; } if(y > 2160)and(y < 3240) { view_yview[0] = 2160; } if(x > 0)and(x < 1020) { view_xview[0] = 0; } if(x > 1920)and(x < 3840) { view_xview[0] = 1920; } if(x > 3840)and(x < 5760) { view_xview[0] = 3840; }

El caso es que la y va bien en ambas direcciones (arriba y abajo), pero la x funciona bien de izquierda a derecha pero de derecha a izquierda funciona mal en el paso de las pantallas del centro a las de la izquierda, en las que el muñeco desaparece de la pantalla pero no se cambia la vista.
Sin embargo en el paso de las pantallas de la derecha a las del centro no hay problema y funciona bien en ambas direcciones ¿En qué puedo estar fallando?

2 respuestas
n3krO

#24

 if(x > 0)and(x < 1020)
{
view_xview[0] = 0;

Ese if deberia ser con x < 1920. Ahora mismo la camara solo cambiaria al lado izquierdo cuando llegas a la posicion 1019.

Ademas, te sugiero que siempre te acostumbres a incluir todo el rango de posible posiciones. Por ejemplo, siempre que pones < cambias por <=.

Aun asi, no seria mejor hacer algo como:

view_yview[0]=y-540;
view_xview[0]=x-960;

Asi tienes la camara siempre centrada en el personaje. (hasta puedes hacer con que solo se mueva si se desvia 10% del centro por ejemplo para no marear tanto los jugadores en cambios de sentidos:

if(x==view_xview[0]+960-96){
 view_xview[0]=view_xview[0]-1;
} else {
if(x==view_xview[0]+960+96){
 view_xview[0]=view_xview[0]+1;
} else {
if(y==view_yview[0]+540-54){
 view_yview[0]=view_yview[0]-1;
} else {
if(y==view_yview[0]+540+54){
 view_yview[0]=view_yview[0]+1;
}
}}}

Hay otros algoritmos mas complejos tambien que hacen con que la camara se posicione teniendo en cuenta el jugador y sus enemigos pero no creo que sea lo mas indicado para empezar.

1 respuesta
Marco1973
if(!view_object[0] == noone)
    view_object[0] = noone;
    
if y < 1080 { view_yview[0] = 0; } if y > 1080 and y < 2160 { view_yview[0] = 1080; } if y > 2160 { view_yview[0] = 2160; } if x < 1020 { view_xview[0] = 0; } if x > 1920 and x < 3840 { view_xview[0] = 1920; } if x > 3840 { view_xview[0] = 3840; }

He eliminado algo de código como has sugerido #24
Pero sigue funcionando exactamente igual.
Lo de que la cámara siga al personaje principal se hacerlo con los propios menús del game maker en las vistas de las rooms. Peor tu código es por supuesto más profesional.
Y lo de seguir al jugador y a sus enemigos debe ser ya un pasote.
Pero por ahora mi idea era la que he explicado cuando abrí el tema del foro: hacer muchas "rooms" en una sola "room" jugando con las vistas. Pero sin scroll, sino en el que la pantalla cambie cuando el protagonista salga de la pantalla. Como los juegos de toda la vida de laberintos y plataformas sin scroll...

Gracias por la ayuda, copiaré el código y lo probaré igualmente, pero mi idea original es otra.

1 respuesta
Marco1973

#25

n3krO

#26 en la linea 19 tienes 1020 en vez de 1920. Es ese el problema.

Marco1973

AH. Vaya lapsus! Ok lo pruebo!

Marco1973

#2 #4 #5 #8 #10 #15 #17 #20 #25 #28

Muchas gracias a todos!!

Si me surgieran (que surgirán) nuevas dudas de mi proyecto, mejor en un nuevo tema ¿no?

Reitero en daros las gracias. No sólo habéis solucionado el problema, sino que con el código rehecho lo puedo reutilizar y modificar para más cosas del mismo proyecto. Muchas gracias!!

1 1 respuesta