Cita de: Jangse en Agosto 16, 2015, 09:03:15 AMCita de: Guacusio en Agosto 16, 2015, 12:58:42 AM
El método que se me ocurrió es una generalización, no sirve para todos los casos tal como está. Esto se debe a que para que funcione, el origen del sprite que representa al jugador debe estar dentro de su bounding box. Ya que el evento outside room se gatilla al momento en que su mask está completamente fuera del room, es necesario que para entonces sus coordenadas x,y también hayan salido del room. En tu caso, el ejemplo no funciona porque al momento en que se gatilla outside room las coordenadas x,y del sprite siguen en el mismo room. Para solucionar esto, dejé el origen del sprite dentro del bounding box. Otra cosa importante a tener en cuenta para tu caso es el darle continuidad a las condiciones de borde de los rooms en lo que se refiere a paredes. Ya que tu engine usa gravedad, al momento de salir del room y no haber suelo, el personaje empezará a caer justo antes de hacer el cambio de room; ese pixel que alcanza a caer será suficiente para atascarlo cuando reaparezca en el nuevo room superpuesto a un objeto sólido. Por ello, recuerda agregar un bloque más de pared en los empalmes de éstas entre rooms para que el personaje no caiga antes de cambiar de room. Adjunto tu ejemplo modificado con lo que te acabo de explicar.
Muchas gracias de nuevo. Ahora funciona muy bien. Y por lo que veo no has modificado nada el codigo. Simplemente a sido poner un bloque mas en los cambios de rooms. Yo pensaba que con dar continuidad del suelo entre rooms era suficiente. Pero no, hacia falta ese bloque mas suelo (que queda fuera del editor) que hace como de puente entre ambas rooms.
Por archivos no te preocupes. He modificado el tema y el puesto el icono del GMS. Ya que tengo la version standard del mismo.
Efectivamente, el código es idéntico al anterior, sólo cambié el origen de los sprites del personaje y agregué bloques de continuidad fuera de los rooms en las paredes que empalman entre rooms.
Cita de: Jangse en Agosto 16, 2015, 09:03:15 AM
Una duda que tengo es del codigo de GML. Es un lenguaje que se puede escribir de muchas maneras y a veces crea confusion. Si te fijas, en el evento outside room hay un pedazo de codigo que lo acabas asi:Código [Seleccionar]if x<0
x+=w;
else if x>=w
x-=w;
if y<0
y+=h;
else if y>=h
y-=h;
room_goto(r);
Y entre las sentencias if y else no pones las llaves. Cosa que si haces en otras partes del codigo. A mi de hecho ya me esta bien. Ya que suelo utilizar el lenguaje Python que no lleva llaves. Pero no se, si en GML, es correcto no poner estas llaves.
La sintaxis del GML es bastante flexible a la hora de escribir código. Cuando existe una sentencia que implica la ejecución de una serie de otras sentencias (como cuando se usa if, while, with, etc.), las llaves sólo son necesarias si ese conjunto de otras sentencias son dos o más. Por ejemplo:
Código [Seleccionar]
if a=b
c=1;//sin llaves ya que sólo es una sentencia la que se ejecuta si el if es verdadero
Código [Seleccionar]
if a=b
{
c=1;//requiere llaves para englobar todo lo que se debe hacer si el if es verdadero.
d=2;//si no se usaran llaves, sólo se ejecutaría la primera sentencia del grupo (c=1)
e=3;
}
Si quieres puedes usarlas de todas maneras cuando se sigue una sola sentencia en vez de varias, pero no es necesario
Cita de: Jangse en Agosto 16, 2015, 09:03:15 AM
Bueno, hablando del editable, ahora pondre algun enemigo para ver si respeta la animacion una vez entramos y salimos de las rooms. Que era otra duda que tenia.
Y me quedara por entender la logica de estos arreglos:Código [Seleccionar]w=room_width;
h=room_height;
rooms[0,0]=A;
rooms[0,1]=0;
rooms[0,2]=0;
rooms[1,0]=B;
rooms[1,1]=w;
rooms[1,2]=0;
rooms[2,0]=C;
rooms[2,1]=2*w;
rooms[2,2]=0;
rooms[3,0]=D;
rooms[3,1]=w;
rooms[3,2]=h;
rooms[4,0]=E;
rooms[4,1]=2*w;
rooms[4,2]=h;
Osea que significa cuando hacemos 2 * w o rooms[0, 1] = 0
Ya ire trasteando a ver...
Es un codigo muy importante el que has creado aqui. Ya que es basico saber cambiar entre rooms o pantallas y respetar la continuidad del ciclo de movimientos del personaje.
Saludos!
MODIFICACION:
He añadido en la room B otro trozo de suelo fuera del escenario. Ya que cuando volvia de la room B a la room A, se quedaba trabado en la room A.
Adjunto un editable donde ya podemos pasear por las 5 pantallas. He tenido que crear entre rooms todos los enlaces de union entre rooms. Sino el personaje se quedaba trabado en alguna de ellas.
Solo me falta implementar que cuando la mitad del personaje este fuera de la room, la room actual cambie. Sino, muchas veces el personaje desaparece de la room actual y no da tiempo a este cambio de room. Aunque si seguimos apretando el boton de direccion, la room cambia perfectamente.
w y h son el ancho y el alto de los rooms (que deben ser los mismos en todos para que el método funcione). Lo que el arreglo hace es guardar para cada room (donde cada fila del arreglo está asociada a un room) sus "coordenadas" dentro del mapa general de rooms, donde por "coordenadas" me refiero a las coordenadas de su esquina superior izquierda:

Donde el arreglo bidimensional tiene esta forma:

Para que la room cambie antes de que el personaje desaparezca completamente, se requieren modificaciones importantes del código. Si quieres implementarlo de esta manera, tendrías que cambiar el evento outside room por intersect boundary y dentro de éste calcular cuál de los 4 lados del room es el que fue intersecado por el personaje para saber a qué room viajar; también tendrás que calcular las nuevas coordenadas x,y del personaje de otra forma, ya que el personaje no se moverá continuamente dentro del mapa sino que pegará un salto dentro de éste.