Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Sr. Gustavo en Marzo 25, 2016, 03:52:28 AM

Título: Ida y.vuelta de.un room
Publicado por: Sr. Gustavo en Marzo 25, 2016, 03:52:28 AM
Hola, mi duda es:

Tengo 3 objetos:
PuenteA
PuenteA
Usuario
Cuando el objeto colisiona usuario  con puertoB me  lleva al room B
Cuando objeto usuario colisiona con puertoA me  lleva al room A

Ahora bien
El problema es que cuando colisiono con puenteA
Me lleva al Cuarto A  y luego  colisionó con puenteB y me lleva a el Cuarto B.
El problema es que comienza. A cambiar de cuartos sin parar y como le tengo que los cuartos Sean persistentes.


¿como le hago para evitar eso?

Título: Re:Ida y.vuelta de.un room
Publicado por: jmbs19 en Marzo 25, 2016, 04:28:13 AM
se me ocurre una forma curiosa, pero que funcionaria, eso de tener los cuartos persistentes permite tener mucho juego, lo que se me ocurre es lo siguiente.

dependiendo de donde tengas tu collision que active colocaras lo siguiente
[gml]
//en create
colision_con_puente=0
//en alarm0
colision_con_puente=0
//en el evento colision
alarm[0]=15//mientras exista la colision el contador siempre estara en 15, cuando deje de existir la colision y dures la cantidad de step que pongas aqui, el contador llegara a 0 y se reseteara la variable que te permitira colisionar otravez, el tiempo puede ser cualquier, mientras sea mayor a 1
if colision_con_puente=0
{
colision_con_puente=1
//tu codigo de cambio de cuarto
}
[/gml]

con eso no deberias de tener problema, deben haber otras formas, pero esta es la que se me ocurre en este momento y me parece sencilla y facil de entender.
Título: Re:Ida y.vuelta de.un room
Publicado por: Clamud en Marzo 25, 2016, 04:34:55 AM
Yo tengo otro método:

El cambio sólo se debería realizar cuando el personaje se aleje del puente y se acerque otra vez, la solución es usar una variable que indique cuándo se acaba de realizar el cambio de room, esa variable puede ser local (en el personaje) si éste es persistente, o global en caso contrario. También sería conveniente agrupar todos los puentes con un objeto padre, para que el código quede más compacto.

La variable se debe asignar en el evento Create del personaje
[gml]
global.cambioroom = false;
[/gml]
No se cómo en qué evento haces el cambio de room, voy a suponer que se hace en el evento colisión del puente con el personaje, entonces el código seria así:
[gml]
if( global.cambioroom == false )
{
    room_goto( otroroom );
    global.cambioroom = true;
}
[/gml]
Y en el evento Step del personaje iría esto:
[gml]
if not place_meeting( obj_puente )
global.cambioroom = false;
[/gml]
Título: Re:Ida y.vuelta de.un room
Publicado por: jmbs19 en Marzo 25, 2016, 05:00:02 AM
clamud segun el entendimiento que tengo de la funcion place_meeting, ¿no seria un uso innecesario de recursos el estar comprobando paso a paso la colision para ver si esta existe, mas aun si esta es precisa?

Citar
With this function you can check a position for a collision with another instance or all instances of an object using the collision mask of the instance that runs the code for the check. When you use this you are effectively asking GameMaker: Studio to move the instance to the new position, check for a collision, move back and tell you if a collision was found or not. This will work for precise collisions, but only if both the instance and the object being checked for have precise collision masks selected otherwise only bounding box collisions are applied. This function also accepts the special keywords all and other. Please note that should you need to get the unique instance id of the object being collided with, you should use instance_place.
https://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/place_meeting.html
Título: Re:Ida y.vuelta de.un room (Resuelto)
Publicado por: Clamud en Marzo 25, 2016, 04:10:40 PM
La función place_meeting en el evento Step es casi lo mismo que tener un evento Colisión. Sí hay un poco de desperdicio porque se usa la función en una instancia y el evento colisión en otras instancias, sin embargo, como existen pocos puentes en cada room, el tiempo invertido en detectar la colisión es insignificante. Y las colisiones precisas se deben evitar lo más que se pueda.
Título: Re:Ida y.vuelta de.un room
Publicado por: Sr. Gustavo en Marzo 26, 2016, 04:34:12 AM
en la funcion place_meeting me da error por falta vde argumentos y no se que escribirle
Título: Re:Ida y.vuelta de.un room
Publicado por: jmbs19 en Marzo 26, 2016, 04:44:33 AM
Placea_meeting(x,y,obj)
Título: Re:Ida y.vuelta de.un room
Publicado por: Sr. Gustavo en Marzo 26, 2016, 05:01:50 AM
Pero en x,y, que escribo
Título: Re:Ida y.vuelta de.un room
Publicado por: Sr. Gustavo en Marzo 26, 2016, 05:07:42 AM
Y si el puente esta colisionando con otro objeto que no sea usuario, funciona?
Título: Re:Ida y.vuelta de.un room
Publicado por: Clamud en Marzo 26, 2016, 05:08:07 PM
Los argumentos son x,y,obj_puente
Y deberás agregar los eventos de colisión necesarios para todos los objetos que causen un cambio de room.
Título: Re:Ida y.vuelta de.un room
Publicado por: VisualGames en Marzo 26, 2016, 08:55:48 PM
Sería mejor que no pusieras el personaje encime del PuenteA/B :v
ósea daaa :v