Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: kostra en Agosto 31, 2015, 05:00:18 PM

Título: [Solucionado] Error extraño con place_free :S
Publicado por: kostra en Agosto 31, 2015, 05:00:18 PM
Pongo icono de GM8 porque en este pc no puedo usar el gms, pero sera para gms no se preocupen, que lo que uso sera igual cuando lo importe jaja.

El caso es... tendo unos botones para mover un player y lo tengo asi...
en su step tengo un script que detecta que player ha de moverse:
if global.turn == 0 player = othief;
else player = opolice;

asi que tenemos la variable player que es el objeto del player actual, bien.. entonces... en mouse release tengo:
if (global.turnon == 1 && (owalks.xst >= player.x)) || (!place_free(player.x-16,player.y)) exit;
player.image_index = 1;
player.alarm[0] = 5;
player.x -= 16;
player.image_xscale = -1;

en la primera linea, lo de antes del || esta todo bien, pero el caso es que la parte de !place_free no me funca porque, ingame, el player esta DEBAJO de un objeto solido y en este caso, es para moverse a la izquierda pero... clicko y no se mueve, es decir, me detecta como si tuviera un solido a la izquierda suya "!place_free(player.x-16,player.y)" entonces me salta el "exit;" y no cumple el movimiento... pero por que??? el origin del player esta en su sitio, la mask es pequeña alrededor del origin, y la mask de la casa tambien esta perfectamente... osea que estando debajo el player y sin tocar la casa, no tienen ningun sentido que me este detectando un solido a la izquierda!!! :S :S :S
Título: Re:Error extraño con place_free :S
Publicado por: jodidox en Agosto 31, 2015, 06:20:12 PM
Cita de: kostra en Agosto 31, 2015, 05:00:18 PM
Pongo icono de GM8 porque en este pc no puedo usar el gms, pero sera para gms no se preocupen, que lo que uso sera igual cuando lo importe jaja.

El caso es... tendo unos botones para mover un player y lo tengo asi...
en su step tengo un script que detecta que player ha de moverse:
if global.turn == 0 player = othief;
else player = opolice;

asi que tenemos la variable player que es el objeto del player actual, bien.. entonces... en mouse release tengo:
if (global.turnon == 1 && (owalks.xst >= player.x)) || (!place_free(player.x-16,player.y)) exit;
player.image_index = 1;
player.alarm[0] = 5;
player.x -= 16;
player.image_xscale = -1;

en la primera linea, lo de antes del || esta todo bien, pero el caso es que la parte de !place_free no me funca porque, ingame, el player esta DEBAJO de un objeto solido y en este caso, es para moverse a la izquierda pero... clicko y no se mueve, es decir, me detecta como si tuviera un solido a la izquierda suya "!place_free(player.x-16,player.y)" entonces me salta el "exit;" y no cumple el movimiento... pero por que??? el origin del player esta en su sitio, la mask es pequeña alrededor del origin, y la mask de la casa tambien esta perfectamente... osea que estando debajo el player y sin tocar la casa, no tienen ningun sentido que me este detectando un solido a la izquierda!!! :S :S :S

Creo que el error esta en la varible global.turn

if (global.turnon == 1 ???

Creo que es turn, no?

Título: Re:Error extraño con place_free :S
Publicado por: kostra en Agosto 31, 2015, 06:29:57 PM
no, turn controla que player es (0=othief, 1=opolice) y turnon es si el turno esta activo o no (false=pasar el turno desactivado, es decir, tienes movimientos hasta que lo pases, y true=tener posibilidad de clickarle para pasar turno a un boton que hay).
Título: Re:Error extraño con place_free :S
Publicado por: jodidox en Agosto 31, 2015, 06:31:10 PM
Cita de: kostra en Agosto 31, 2015, 06:29:57 PM
no, turn controla que player es (0=othief, 1=opolice) y turnon es si el turno esta activo o no (false=pasar el turno desactivado, es decir, tienes movimientos hasta que lo pases, y true=tener posibilidad de clickarle para pasar turno a un boton que hay).

Ya veo. No tienes un pantallazo del error? o un editable?
Título: Re:Error extraño con place_free :S
Publicado por: kostra en Agosto 31, 2015, 07:59:24 PM
editable, lo subo ahora, pero avisame cuando lo tengas para borrarlo, no quisiera que estuviese publico xD
[Link borrado xD]
Título: Re:Error extraño con place_free :S
Publicado por: jodidox en Agosto 31, 2015, 09:11:01 PM
Lo tengo, ahora miro haber si doy con el error. XD
Título: Re:Error extraño con place_free :S
Publicado por: kostra en Agosto 31, 2015, 09:27:00 PM
way, yo mientra toy haciendo la cena pa la kasa jajajaja muchas gracias lo que no entiendas preguntamelo
Título: Re:Error extraño con place_free :S
Publicado por: Guacusio en Agosto 31, 2015, 10:58:09 PM
Creo que sé lo que te está pasando. Lo que estás haciendo es ver si el botón ubicado en las coordenadas (player.x-16,player.y) genera una colisión con un sólido, porque estás llamado a la función place_free desde el botón, no desde el player. Probablemente la máscara del botón sí toca un sólido al ubicarla en esa posición. Prueba lo siguiente:

with player
    {
    if (global.turnon == 1 && (owalks.xst >= x)) || (!place_free(x-16,y)) exit;
    image_index = 1;
    alarm[0] = 5;
    x -= 16;
    image_xscale = -1;
    }

Título: Re:Error extraño con place_free :S
Publicado por: kostra en Agosto 31, 2015, 11:13:17 PM
no, ese fue el anterior intento, mira el del boton IZQUIERDA, que es el que ando probando cosas, puse player.x-16,player.y, pense que esa ere el gran bug, porque vi lo mismo que tu, pero no... textualmente, me esta detectando un solido en esas coordenadas pero como ves ingame, NO HAY NADA :S
Título: Re:Error extraño con place_free :S
Publicado por: Guacusio en Agosto 31, 2015, 11:27:04 PM
¿Podrías entregar la siguiente información?

-Coordenadas de origen y bounding box de la máscara del objeto botón izquierdo
-Coordenadas de origen y bounding box de la máscara del objeto sólido que podría causar colisión, y sus coordenadas x,y al momento de pulsar el botón izquierdo
-Coordenadas del player al momento de pulsar el botón izquierdo
Título: Re:Error extraño con place_free :S
Publicado por: kostra en Septiembre 01, 2015, 12:40:25 AM
shtt no distribuyas mi creacion!! XD

@
no se que es un bounding box xD
la mascara y origen del boton aqui no sirven de nada, el origen de la POSIBLE colision, la casa esta su origen, 16 pixeles encima del origen del player, la mask de lacasa es rectangular, completa, y la mask del player, la empequeñeci para que no colisionara en absoluto con la casa, el player esta DEBAJO de la casa, con ambas masks SEPARADAS, no hay NADA a la izquierda del ayer, pero por lo visto, el gm dice que si hay...
Título: Re:Error extraño con place_free :S
Publicado por: penumbra en Septiembre 01, 2015, 01:50:28 AM
Cita de: kostra en Septiembre 01, 2015, 12:40:25 AM
no hay NADA a la izquierda del ayer, pero por lo visto, el gm dice que si hay...
place_free(player.x-16,player.y)
No es que la función revise si 16 pixeles a la izquierda del player hay o no un sólido, lo que hace GM es que toma la instancia, la mueve 16 pixeles a la izquierda del jugador, y considerando la máscara de colisión de la instancia, evalúa si esa instancia "movida/desplazada" entra en colisión con un sólido. Después recoloca la instancia en la posición que ocupaba antes de la llamada a la función y avisa si en la posición indicada por los argumentos x/y se detectó una colisión.

Como dijo Guacusio, si el código se usa desde un botón, la instancia que se va a desplazar cuando se llame a la función place_free va a ser el botón. En otras palabras, (y esto es lo que hace el código que pusiste en el post original), el botón se coloca 16 pixeles a la izquierda del jugador y se evalúa una colisión. Si el jugador o el botón o ambos tienen el origen centrado en el sprite, entonces es bastante probable que ambas instancias choquen porque 16 pixeles es un espacio pequeño, lo que provoca la colisión y la terminación del código.

Una manera bastante sencilla de entender lo que pasa realmente es usando el debugger o la función show_debug_message, de esa manera se puede saber que instancias est+an involucradas en la colisión.
Título: Re:Error extraño con place_free :S
Publicado por: Guacusio en Septiembre 01, 2015, 02:14:37 AM
penumbra tiene toda la razón. Sin embargo, viendo el editable (no te preocupes, kostra, no lo voy a publicar), el error de comprobar una colisión usando la máscara del botón en vez de la del jugador es uno adicional y no es el causante del problema. El exit que se ejecuta y causa el problema no es gatillado por la comprobación de place_free sino por la parte anterior:

if (global.turnon == 1 && (owalks.xst >= player.x))

Ahí es donde la condición llega a ser verdadera y se ejecuta el exit, no en place_free.
Título: Re:Error extraño con place_free :S
Publicado por: kostra en Septiembre 01, 2015, 03:40:37 AM
guacusio, no, no es ahi porque eso SOLO salta cuando y te moviste los 3 saltos que te permite hacer, eso ya lo comprobe, cuando quitas el !place_free, puedo moverme tranquilamente mis 3 saltos, el problema, si he entendido bien, es el que dice penumbra :D

penumbra, te refieres a que, aunque ponga player.x/y digamos... que "mueve" la mask del BOTON desde la instancia del player??? de ser asi ahora todo tiene sentido xDD

entonces................. ok, perfecto, con un simple "with player" jaja, muchisimas gracias a todos, puedo seguir ^^

PD: jodidox, el editable esta ahora publico para el planeta entero T_T
Título: Re:[Solucionado] Error extraño con place_free :S
Publicado por: Guacusio en Septiembre 01, 2015, 04:00:29 AM
Cita de: Guacusio en Agosto 31, 2015, 10:58:09 PM
Creo que sé lo que te está pasando. Lo que estás haciendo es ver si el botón ubicado en las coordenadas (player.x-16,player.y) genera una colisión con un sólido, porque estás llamado a la función place_free desde el botón, no desde el player. Probablemente la máscara del botón sí toca un sólido al ubicarla en esa posición. Prueba lo siguiente:

with player
    {
    if (global.turnon == 1 && (owalks.xst >= x)) || (!place_free(x-16,y)) exit;
    image_index = 1;
    alarm[0] = 5;
    x -= 16;
    image_xscale = -1;
    }



Cita de: kostra en Agosto 31, 2015, 11:13:17 PM
no, ese fue el anterior intento, mira el del boton IZQUIERDA, que es el que ando probando cosas, puse player.x-16,player.y, pense que esa ere el gran bug, porque vi lo mismo que tu, pero no... textualmente, me esta detectando un solido en esas coordenadas pero como ves ingame, NO HAY NADA :S

¿Cómo? ¿Era o no era el problema el usar la máscara del botón para detectar la colisión en vez de usar la del player? Ahora soy yo el que no entiende.
Título: Re:Error extraño con place_free :S
Publicado por: penumbra en Septiembre 01, 2015, 04:24:38 AM
Cita de: kostra en Septiembre 01, 2015, 03:40:37 AM
penumbra, te refieres a que, aunque ponga player.x/y digamos... que "mueve" la mask del BOTON desde la instancia del player??? de ser asi ahora todo tiene sentido xDD
No he visto tu proyecto, lo que escribí fue sólo para aclarar el funcionamiento de place_free porque creo que estabas pensando que actuaba de manera distinta, y como este post lo leerán a futuro más usuarios, es bueno aclarar esto.

En resumidas cuentas, para los usuarios que van comenzando: place_free SIEMPRE mueve la instancia local y usa la máscara local para evaluar colisiones (después del desplazamiento). Si se usa desde un botón, mueve la instancia del botón, si se usa desde el player, moverá al player. Los parámetros x/y sólo indican el lugar al que se moverá la instancia, no importa si son coordenadas locales o de otro objeto.
Título: Re:Error extraño con place_free :S
Publicado por: jodidox en Septiembre 01, 2015, 02:39:13 PM
Cita de: kostra en Septiembre 01, 2015, 03:40:37 AM
guacusio, no, no es ahi porque eso SOLO salta cuando y te moviste los 3 saltos que te permite hacer, eso ya lo comprobe, cuando quitas el !place_free, puedo moverme tranquilamente mis 3 saltos, el problema, si he entendido bien, es el que dice penumbra :D

penumbra, te refieres a que, aunque ponga player.x/y digamos... que "mueve" la mask del BOTON desde la instancia del player??? de ser asi ahora todo tiene sentido xDD

entonces................. ok, perfecto, con un simple "with player" jaja, muchisimas gracias a todos, puedo seguir ^^

PD: jodidox, el editable esta ahora publico para el planeta entero T_T


Jajajajaja, Tranquilo Kostra, ya eliminé la publiación, además todos aqui sabemos que es tu juego, Guacusio, Penumbra y mi persona, estamos de testigos. XD
Título: Re:[Solucionado] Error extraño con place_free :S
Publicado por: kostra en Septiembre 02, 2015, 12:36:15 PM
jajajja, a ver guacsio,  dije que no era, a lo de:
if (global.turnon == 1 && (owalks.xst >= player.x))

xD, alomejor entendi algo mal tuyo, pero eso, finalmente ea que pense que poniendo  DENTRO del place free player.x/y era la mask del player la que comprobaba, pero no, era la del boton EN LA POSICION del player xD, asi ke tansolo debi especificar con "with player...", y tema solucionado, no respondais mas el tema, creo que todo ha kedado clarisimo para futuras lecturas jaja muchisimas gracias a todos :D