Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Strod en Octubre 29, 2015, 08:02:57 PM

Título: Como reconocer distintos objetos en una misma posición.
Publicado por: Strod en Octubre 29, 2015, 08:02:57 PM
Buenas estoy intentando hacer un juego que consiste en un tablero formado por casillas.

-El color de la casilla es importante (cada color de casilla es un objeto distinto).
-Selecciono las casillas usando el ratón y clickeando sobre ellas (se marca la casilla con una señal indicando que está seleccionada)
-El caso es que si encima de la casilla hay un personaje al clickear sobre esa casilla, el programa no reconoce el color de la casilla (o lo que es lo mismo el tipo de objeto que es) porque hay un personaje en ella, es decir, coinciden en un mismo espacio tres objetos: el que está más abajo (la casilla), el que queda en medio (personaje) y el que queda en la parte superior (la señal de que está seleccionada la casilla).

La pregunta es: Si selecciono una casilla con un personaje encima y quiero que la selección reconozca las propiedades de la casilla seleccionada ¿como lo hago? ¿Hay alguna función de GML que sirva para este fin? He estado dandole vueltas y no doy con una solución, agradecería ayuda.

Saludos.
Título: Re:Como reconocer distintos objetos en una misma posición.
Publicado por: Guacusio en Octubre 29, 2015, 09:44:20 PM
Sería bueno que pusieras bajo un mismo parent a todas las casillas para facilitar operaciones sobre ellas. También sería bueno que aclararas a qué te refieres con "que la selección reconozca las propiedades de la casilla seleccionada". Si lo que quieres es obtener la id de la instancia de la casilla seleccionada, utiliza instance_place el evento global mouse left pressed en el objeto desde el cual quieres leer la id. Una vez conocida la id, puedes obtener cualquier información de esa casilla. Por ejemplo, si necesitas saber el sprite de la casilla desde la instancia selectora:

evento global mouse left pressed de la instancia selectora:
var s;
s=-1;//si no hay casilla, considera su sprite como -1
with instance_place(mouse_x,mouse_y,obj_casilla_parent);//id de la casilla
    s=sprite_index;//obtener el sprite de la casilla


Título: Re:Como reconocer distintos objetos en una misma posición.
Publicado por: penumbra en Octubre 30, 2015, 01:56:05 AM
De acuerdo a tu descripción, mencionas que en el espacio de una casilla pueden coincidir hasta tres objetos: la casilla, el personaje y la señal. Yo te recomendaría que prescindieras de usar objetos para marcar las casillas, ya que no es necesario. El propio objeto casilla puede encargarse de dibujar un sprite de marca para indicar si su propiedad "marcada" es true o false.

Cita de: Strod en Octubre 29, 2015, 08:02:57 PM

-El caso es que si encima de la casilla hay un personaje al clickear sobre esa casilla, el programa no reconoce el color de la casilla (o lo que es lo mismo el tipo de objeto que es) porque hay un personaje en ella
No entiendo por qué dices que el programa no reconoce el color de la casilla, ya que GMS no trabaja así: En principio, GM no discrimina los clicks, si tres objetos tienen un evento de click, y los tres ocupan una misma zona (están traslapados), el evento de click en los tres objetos será ejecutado cuando el usuario haga click en la zona donde convergen las tres máscaras de colisión. Este comportamiento es el comportamiento por defecto de GMS, tan es así, que varias preguntas de la comunidad buscan evitar este comportamiento: cómo hacer que GM sólo detecte un click en varios objetos traslapados.
Título: Re:Como reconocer distintos objetos en una misma posición.
Publicado por: Strod en Octubre 30, 2015, 08:13:01 PM
Buenas noches,

Primero de todo muchas gracias Guacusio y Penumbra, intentaré explicarme mejor.

El tablero está formado por tres tipos de objetos distintos: 1.casillas, encima se sitúan los 2.personajes y encima de todo un 3.objeto_selección (de este objeto_selección sólo existe uno, si está situado sobre una casilla y con el ratón selecciono otra, desaparece de la anterior y se coloca sobre la ultima casilla seleccionada). Cuando este objeto selección está sobre una casilla, activa las propiedades de la casilla seleccionada (estas propiedades pueden ser por ejemplo si la casilla es roja y la selecciono pasa de ser no transitable a transitable ... y cosas así, esto que yo llamo propiedades formarían parte de las reglas del juego no del funcionamiento interno del Gamemaker).

Pero si sobre la casilla hay un personaje, entonces si selecciono con el objeto selección esa casilla, el objeto selección no hace "contacto" con la casilla sino con el personaje que hay sobre ella por lo que no puedo activar las propiedades(reglas de juego) que yo he definido sobre esa casilla.

Tengo que decir que el tablero de casillas no es un array ni nada parecido, son objetos que yo mismo coloco sobre la room.

De nuevo muchas gracias por vuestra ayuda,
Saludos.



Título: Re:Como reconocer distintos objetos en una misma posición.
Publicado por: penumbra en Octubre 30, 2015, 08:19:29 PM
Ya veo, pero entonces, el error de que el objeto selección no contacta con la casilla es por el código que usas en el objeto selección. Igualmente, sigo pensando que no es necesario utilizar este objeto selección, ya que la selección puede hacerse sin un intermediario, y directamente leer o activar o cambiar propiedades de X casilla.

Guacusio indicó cómo hacer la selección de una casilla en su mensaje anterior. Si de todas maneras quieres usar el objeto selección, entonces tendrías que dar más detalles de qué código se usa en ese objeto para seleccionar casillas.

Por ejemplo, si quieres que el objeto selección detecte la casilla que está abajo (sin importar si en medio hay un jugador) se puede usar (en un evento de click)

[gml]casilla = collision_point(obj_seleccion.X, obj_seleccion.Y, obj_casilla, false, true)[/gml]

Luego, si se quiere cambiar alguna propiedad de esa casilla
[gml]
if (casilla != noone)
     casilla.color = "rojo"
[/gml]
Título: Re:Como reconocer distintos objetos en una misma posición.
Publicado por: Strod en Octubre 31, 2015, 05:43:01 PM
Buenas,

Penumbra, creo que con esa función que has puesto me va a valer, que burro soy, no había caído, con eso de que estaba el personaje en medio creía que usar detección de colisión no valdría.

Muchas gracias de nuevo,
Saludos.