Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: bygdle en Noviembre 19, 2015, 09:08:11 PM

Título: Evitar superposición de objetos (uno encima de otro)?
Publicado por: bygdle en Noviembre 19, 2015, 09:08:11 PM
Hola, estoy creando un proyecto en donde el jugador tiene la posibilidad de crear "muros" para crear su propia "casa". Y quisiera hacer que ningún objeto estuviera sobre otro, es decir, si ponen un objeto encima del que ya está puesto, el de abajo se elimina.
He intentado hacer algo como esto:
[gml]
if place_meeting(x,y,oWall)
instance_destroy();
[/gml]

Pero 1)- Me elimina al objeto nuevo que se crea, es decir al de arriba. 2)- es un fastidio crear los objetos, ya que se alinean a una cuadrícula de 32*32, si intento poner un objeto entre varios, simplemente me lo borra y no me deja crearlos...
Agradecería ayuda con esto  :-[
Título: Re:Evitar superposición de objetos (uno encima de otro)?
Publicado por: penumbra en Noviembre 19, 2015, 10:47:26 PM
¿Por qué antes de crear el nuevo objeto, no revisas si hay debajo otro, y elminas ese otro y después creas el nuevo?
Título: Re:Evitar superposición de objetos (uno encima de otro)?
Publicado por: bygdle en Noviembre 19, 2015, 10:48:46 PM
Y cómo podría identificar el objeto que se encuentra bajo el nuevo?
Título: Re:Evitar superposición de objetos (uno encima de otro)?
Publicado por: penumbra en Noviembre 19, 2015, 11:01:11 PM
Cita de: NiuWeb en Noviembre 19, 2015, 10:48:46 PM
Y cómo podría identificar el objeto que se encuentra bajo el nuevo?
¿Cuál nuevo? el nuevo no se ha creado aun. Hay varias funciones. Momento de consultar el manual  :D
http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/index.html


Título: Re:Evitar superposición de objetos (uno encima de otro)?
Publicado por: EnteiCross en Noviembre 19, 2015, 11:01:59 PM
Lo que yo sugiero es que mejor antes de colocar un objeto, verifiques antes si hay un espacio libre, y si asi lo es (esta libre) procedes a colocar una nueva instancia en la posición seleccionada.

if !place_meeting(mouse_x , mouse_y, oWall) {
  //Crear el objeto, EJ:
instance_create(mouse_x, mouse_y, oWall);
}
Título: Re:Evitar superposición de objetos (uno encima de otro)?
Publicado por: penumbra en Noviembre 19, 2015, 11:06:47 PM
Cita de: EnteiCross en Noviembre 19, 2015, 11:01:59 PM
Lo que yo sugiero es que mejor antes de colocar un objeto, verifiques antes si hay un espacio libre, y si asi lo es (esta libre) procedes a colocar una nueva instancia en la posición seleccionada.

if !place_meeting(mouse_x , mouse_y, oWall) {
  //Crear el objeto, EJ:
instance_create(mouse_x, mouse_y, oWall);
}

Es buena idea, pero para que ese código funcione, se debe ejecutar desde un objeto que teng asignado un sprite o máscara de colisión, porque esto es requerido por la función place_meeting. Si se usa, por ejemplo, desde un objeto controlador sin sprite, fallaría.
Título: Re:Evitar superposición de objetos (uno encima de otro)?
Publicado por: EnteiCross en Noviembre 20, 2015, 04:01:28 AM
Cita de: penumbra en Noviembre 19, 2015, 11:06:47 PM
Es buena idea, pero para que ese código funcione, se debe ejecutar desde un objeto que teng asignado un sprite o máscara de colisión, porque esto es requerido por la función place_meeting. Si se usa, por ejemplo, desde un objeto controlador sin sprite, fallaría.

Tienes razón, afortunadamente hay muchas funciones para realizar comprobaciones de areas como collision_rectangle();
y de tal forma podemos hacer una pequeña modificación al código...


if (collision_rectangle(mouse_x, mouse_y, 32, 32, oWalll, false, true)) {
  //Crear el objeto, EJ:
instance_create(mouse_x, mouse_y, oWall);
}
Título: Re:Evitar superposición de objetos (uno encima de otro)?
Publicado por: bygdle en Noviembre 20, 2015, 05:29:24 AM
Bueno, pues estaría bien es, de no ser porque lo que necesito es LO INVERSO. Me explico:
En vez de que NO CREE un objeto si ya existe uno, debe crear un NUEVO OBJETO y eliminar el que está abajo.
Título: Re:Evitar superposición de objetos (uno encima de otro)?
Publicado por: EnteiCross en Noviembre 20, 2015, 07:01:55 AM
Cita de: NiuWeb en Noviembre 20, 2015, 05:29:24 AM
Bueno, pues estaría bien es, de no ser porque lo que necesito es LO INVERSO. Me explico:
En vez de que NO CREE un objeto si ya existe uno, debe crear un NUEVO OBJETO y eliminar el que está abajo.

Muy bien entonces, lo que debemos de hacer primero es eliminar el bloque que se encuentre ya colocado, prueba el siguiente código:

Objeto donde se controla la construcción.
Ev. Step

//Solo para actualizar las coordenadas.
x = mouse_x;
y = mouse_y;


Ev. Glob Left Pressed:

var Bloque;

//Primero se hace una dirección de referencia a una instancia oWall que colisione dentro del rectangulo.
Bloque = collision_rectangle(x, y, x+32, y+32, oWall, false, true);

//Si se encontro una instancia de tipo oWall entonces la destruiremos.
if (Bloque != noone)
   with (Bloque) instance_destroy();

//Finalmente creamos una nueva instancia de tipo oWall
instance_create(x,y,oWall);