Marzo 25, 2016, 03:52:28 AM Ultima modificación: Marzo 26, 2016, 04:35:32 AM por Sr. Gustavo
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?


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.
no puedo creer que me hice un tumblr.
YGE Productions yep, otro tumblr.
y como no, el manual tambien

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]

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
no puedo creer que me hice un tumblr.
YGE Productions yep, otro tumblr.
y como no, el manual tambien

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.

en la funcion place_meeting me da error por falta vde argumentos y no se que escribirle

Placea_meeting(x,y,obj)
no puedo creer que me hice un tumblr.
YGE Productions yep, otro tumblr.
y como no, el manual tambien


Y si el puente esta colisionando con otro objeto que no sea usuario, funciona?

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.

Sería mejor que no pusieras el personaje encime del PuenteA/B :v
ósea daaa :v