Agosto 31, 2015, 05:00:18 PM Ultima modificación: Septiembre 01, 2015, 03:40:59 AM por kostra
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
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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?

Cordialmente Jodidox!

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).
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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?
Cordialmente Jodidox!

#4 Agosto 31, 2015, 07:59:24 PM Ultima modificación: Agosto 31, 2015, 09:26:21 PM por kostra
editable, lo subo ahora, pero avisame cuando lo tengas para borrarlo, no quisiera que estuviese publico xD
[Link borrado xD]
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Lo tengo, ahora miro haber si doy con el error. XD
Cordialmente Jodidox!

way, yo mientra toy haciendo la cena pa la kasa jajajaja muchas gracias lo que no entiendas preguntamelo
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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;
    }



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
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

¿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


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...
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

#11 Septiembre 01, 2015, 01:50:28 AM Ultima modificación: Septiembre 01, 2015, 02:05:17 AM por penumbra
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.

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.


#13 Septiembre 01, 2015, 03:40:37 AM Ultima modificación: Septiembre 01, 2015, 03:42:55 AM por kostra
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
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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.