#15 Septiembre 13, 2015, 10:26:32 PM Ultima modificación: Septiembre 13, 2015, 10:32:06 PM por penumbra
Aquí dejo un ejemplo. Click en un objeto no seleccionado, lo selecciona. Click en un objeto seleccionado, lo deselecciona. Click en un espacio vacío, deselecciona todos los objetos.
http://www.mediafire.com/download/a7iktm2ay8rk9yp/selecta2.gmz

Cita de: venus en Septiembre 13, 2015, 10:01:59 PM
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.

Entiendo que este es el proyecto que llevas adelante con Marth sobre el juego de la comunidad y la guerra de planetas. Por lo que recuerdo haber probado en ese juego, lo que quieres es poder seleccionar varios planetas manteniendo presionado el mouse y soltar este ataque liberando el botón del mouse. El objetoA representaría planetas y el objetoB sería el puntero del mouse. Viendo el código y los nuevos antecedentes con una muy mejorada explicación, veo que esto es lo que ocurre:

Al pasar el puntero sobre una instancia de objetoA con el botón del mouse presionado, la variable seleccionado toma el valor true en esa instancia. Al sacar el puntero del mouse del objetoA estando presionado el botón del mouse, la variable seleccionado toma el valor false porque deja de haber colisión entre objetoA y objetoB. Eso explica por qué los círculos no permanecen. Perdóname que te lo diga pero me parece que la forma en que quieres hacer esto es horrible. Probablemente en tu juego habrá varias instancias de objetoA y cada una ejecutará permanentemente ese código en el evento draw, lo que es tremendamente ineficiente. Deberías revisar la colisión de objetoA con objetoB desde objetoB, que tendrá una sola instancia y además hacerlo en el evento mouse left en vez de en draw. Creo que esto es más eficiente y sencillo:

evento create de objetoA:
seleccionado=false;

evento draw de objetoA:
draw_self();
if seleccionado
    draw_circle(x,y,12,true);


evento mouse left de objetoB:
with instance_place(x,y,objetoA)
    seleccionado=true;


evento mouse left released:
objetoA.seleccionado=false;


Casi. Lo que busco es lo que ha dicho penumbra: "Click en un objeto no seleccionado, lo selecciona. Click en un objeto seleccionado, lo deselecciona. Click en un espacio vacío, deselecciona todos los objetos."
Prefiero reproducir el evento draw en cada planeta porque así puedo modificar colores y colocar números y texto si estar usando todo el rato el comando for u otros.
Como he comentado antes, esto es solo un ejemplo sencillo y sin optimizar. El original tiene y tendrá mas código e interacciones.
Entiendo cual es el problema. Cuando pincho fuera de objetoA la variable seleccionado toma el valor false. Por eso quiero que en vez de comprobar si objetoB hace contacto con él, que lo compruebe con cualquier objetoA.
Ahora si.

Pensandolo bien. Si consigo hacer que detecte cuando objetoB está colisionando con objetoA surgirán más problemas. Pues con solo pinchar uno se seleccionarían todos. Por lo tanto la clave está en saber cuando tiene que volver la variable false. A lo mejor podríamos hacer que objetoB detecte cuando no está colisionando con nada (Y el botón izquierdo del ratón ha sido presionado) y desde objetoB cambiar todas las variables seleccionado.
Perdón por hacer doble post.
Ahora si.

ejemplo seleccionar con click, deseleccionar con click, deseleccionar todo con click afuera...


OBJETO SELECCIONABLE
create:
select = 0;

evento mouse_left_pressed:
if select == 0 select = 1; else select = 0;

evento global_mouse_left_pressed:
with elotroobjeto {if !place_meeting(x,y,objetoseleccionable) objetoseleccionable.select = 0;}

FIN xD

PD: Usar un objeto especialmente de puntero del mouse, es absurdo xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Ya lo hice ayer. Puedes ver el resultado en el hilo que está en Propuestas y soporte.
Si, es estúpido. Pero el juego es para android. Así que cuando elimine todas las funciones que hace como ratón se quedará como controlador general del mapa y permanecerá estático e invisible.
Gracias por indicármelo, kostra. Pero no hago las cosas porque si. Intento que esté lo mas optimizado posible.
Ahora si.

igual sobra, puedes optimizarlo mas,suerte y a darle caña creando! :D
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]