Pues aquí viene otro rompecabezas de colisiones. Malditas colisiones, me amargan el día.
Necesito saber si objetoA y objetoB están en contacto desde objetoC.
He probado objetoA.place_meeting(x,y,objetoB); pero nada. Me dice "variable name expected".
Me da error porque eso solo sirve para modificar variables. Puede que haya alguna forma de hacer una variable con place_meeting. Pero no la encuentro  :P
Ahora si.

Prueba esto en el objetoC:

var contacto;
contacto=false;
with objetoA
    {
    if place_meeting(x,y,objetoB)
        contacto=true;
    }


La variable contacto indicará si hay colisión o no.


Pues no me funciona  :(
De todas maneras voy a ser un poco mas concreto. Necesito saber si está haciendo contacto con cualquiera de sus copias. Es decir, saber si objetoB está colisionando con cualquier objetoA.
Ahora si.

Cita de: venus en Septiembre 13, 2015, 05:59:27 PM
Pues no me funciona  :(
De todas maneras voy a ser un poco mas concreto. Necesito saber si está haciendo contacto con cualquiera de sus copias. Es decir, saber si objetoB está colisionando con cualquier objetoA.

Podrías ser aún más concreto: ¿por qué no te funciona? ¿el código reporta que hay/no hay una colisión cuando no la hay/si la hay, o te sale un error? ¿Necesitas saber si una instancia del objetoB específica hace contacto con cualquier instancia de objetoA, o te sirve cualquier instancia de objetoB?


Te han dado la respuesta perfecta xD copia lo que hiciste porque debería funcionar
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

#5 Septiembre 13, 2015, 07:36:39 PM Ultima modificación: Septiembre 13, 2015, 07:39:30 PM por venus
Es un código para saber que objetos han sido clickados. Si pinchas en uno se selecciona, y si pinchas donde no hay objetos todos se deseleccionan.


Esto es lo que tengo en objetoA.
if(mouse_check_button(mb_left)) {
  if(place_meeting(x,y,objetoB)) {
    seleccionado = true;
  } else {
    seleccionado = false;
  }
}

El problema de esto es que cuando pincho otro objeto, el que anteriormente estaba seleccionado se deselecciona.



Con lo que me ha dicho Guacusio debería de quedar así:
if(mouse_check_button(mb_left)) {
  with (objetoB) {
    if (place_meeting(x,y,objetoA)) {
      contacto=true;
    } else {
      contacto=false;
    }
  }
  if(contacto==true) {
    seleccionado = true;
  } else {
    seleccionado = false;
  }
}





Pero parece que no funciona. No me da error, simplemente el código dentro de with no parece ejecutarse. La variable contacto se queda como la he puesto en el ev. create.
Ahora si.

un detalle, sabes que mouse_check_button es un GLOBAL click? :P
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]


ya me estoy liando... cuentame... cual es el objetoA, cual el objetoB, cual el objetoC, DONDE hay que clicar para que pase una cosa y DONDE para otra, dime que quieres exactamente y te lo escribo todo ahora (o resta el editable mas rapido xD)
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

#9 Septiembre 13, 2015, 09:31:10 PM Ultima modificación: Septiembre 13, 2015, 09:42:56 PM por Guacusio
Cita de: venus en Septiembre 13, 2015, 07:36:39 PM
Es un código para saber que objetos han sido clickados. Si pinchas en uno se selecciona, y si pinchas donde no hay objetos todos se deseleccionan.


Esto es lo que tengo en objetoA.
if(mouse_check_button(mb_left)) {
  if(place_meeting(x,y,objetoB)) {
    seleccionado = true;
  } else {
    seleccionado = false;
  }
}

El problema de esto es que cuando pincho otro objeto, el que anteriormente estaba seleccionado se deselecciona.



Con lo que me ha dicho Guacusio debería de quedar así:
if(mouse_check_button(mb_left)) {
  with (objetoB) {
    if (place_meeting(x,y,objetoA)) {
      contacto=true;
    } else {
      contacto=false;
    }
  }
  if(contacto==true) {
    seleccionado = true;
  } else {
    seleccionado = false;
  }
}





Pero parece que no funciona. No me da error, simplemente el código dentro de with no parece ejecutarse. La variable contacto se queda como la he puesto en el ev. create.

Es importante que siempre que hagas referencia a un código indiques en qué objeto y evento están. Suponiendo que ambos códigos que indicaste van en el evento step del objetoA (lo cual ya me parece extraño ya que habías hablado de hacer la comprobación de la colisión desde un objetoC), la única explicación para que la variable contacto permanezca en false es que pase necesariamente alguna de estas cosas:

-el botón izquierdo del mouse no está presionado
-no existen instancias de objetoB
-existiendo al menos una instancia de objetoB, ninguna está colisionando con alguna otra instancia de objetoA

Si quieres asegurarte de que el código dentro de with se está ejecutando (que es lo mismo que asegurarse de que exista alguna instancia de objetoB), y sólo con propósitos de depuración, puedes colocar una variable con un valor antes del with y dentro de éste cambiarlo, para luego mostrar el resultado:

var prueba=false;
with (objetoB) {
    prueba=true;
    if (place_meeting(x,y,objetoA)) {
      contacto=true;
    } else {
      contacto=false;
    }
  }
if prueba
    show_message("el with se ejecuta");
else
    show_message("el with no se ejecuta");


Otra sugerencia es que si la variable seleccionado es igual a la variable contacto, uses una sola variable para guardar el resultado en vez de duplicar la segunda, a menos que le des usos distintos más adelante. Tampoco me queda clara la necesidad de hacer el cálculo en step en vez de el evento mouse (en el que te ahorras comprobar por código si el botón del mouse está presionado); si lo haces en el evento step (que es una suposición), el código se ejecuta permanentemente mientras esté presionado el botón del mouse, lo cual puede no ser lo óptimo.

EDIT: cambié la última frase donde erróneamente dije que la variable contacto cambia a false al soltar el botón


He hecho las comprobaciones y lo que falla es lo que va dentro de with. El objetoC no existe. Lo que quiero es que al clickar en otro objetoB no se deseleccionen los anteriores objetoB.
Voy a coger el ordenador y OS paso un archivo en gms.
Ahora si.

si solo necesitas que al clickar se seleccione, por que dos objetos?? :S
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Os doy las instrucciones.
Cread 2 sprites. Da igual de que sean, pero que se vean.
Cread 2 objetos. ObjetoA y ObjetoB.
Ponedle ujn sprite a cada uno.
En ev. Create de ObjetoA poneis esto:
seleccionado = false;
En ev. Draw de ObjetoA poneis esto:
draw_self();
if(mouse_check_button(mb_left)) {
  if(place_meeting(x,y,objetoB)) {
    seleccionado = true;
  } else {
    seleccionado = false;
  }
}

if(seleccionado == true) {
  draw_circle (x,y,12,true);
}

En ev. Step de ObjetoB poneis esto:
x = mouse_x
y = mouse_y





Lo que quiero es que cuando seleccione un otro ObjetoA no se borre el círculo de los otros. Pero que si se borre cuando no pinche en ningún lado.
Ahora si.

#13 Septiembre 13, 2015, 10:02:49 PM Ultima modificación: Septiembre 13, 2015, 10:10:52 PM por penumbra
aquí es donde se muestra la "superioridad" del evento mouse left pressed en lugar de STEP + mouse_check_button_pressed, ya que GMS tendría en cuenta la máscara del objeto B automáticamente. Obvio que se puede hacer sin este evento, pero se necesita tener más cuidado

No es nada personal, pero este post es bastante confuso en cuanto a tus explicaciones: Primero hablabas de un objeto C, que ahora ya no existe, luego cambió a
Cita de: venus en Septiembre 13, 2015, 09:37:19 PM
Lo que quiero es que al clickar en otro objetoB no se deseleccionen los anteriores objetoB.
y ahora cambia a
Cita de: venus en Septiembre 13, 2015, 10:01:59 PM
Lo que quiero es que cuando seleccione un otro ObjetoA no se borre el círculo de los otros.
Y por lo que estoy viendo en tu ejecutable, todo se puede hacer usando un único objeto. El objeto verde que sigue al ratón no es necesario  :-[

Cita de: penumbra en Septiembre 13, 2015, 10:02:49 PM
aquí es donde se muestra la "superioridad" del evento mouse left pressed en lugar de STEP + mouse_check_button_pressed, ya que GMS tendría en cuenta la máscara del objeto B automáticamente. Obvio que se puede hacer sin este evento, pero se necesita tener más cuidado

En el original lo tengo en el evento mouse. Pero para un ejemplo no quería complicarme.
Ahora si.