Perdonen que moleste preguntando ~
Tengo un ligero problema con temas de superposición de instancias.
En mi juego hay un timeline que con cada segundo que pasa, este crea enemigos estáticos de manera aleatoria en la sala.
Ahora... al ser aleatorio, yo no tengo el control de donde vaya a spawnear específicamente.
Leyendo el manual, en la sección de colisiones encontré las siguientes funciones:
1 - Place-free : Puede usar esta función para verificar y ver si la instancia de llamada colisionará con cualquier instancia marcada como sólida en su juego.
(Mi problema con esta función es que los enemigos si son sólidos no puedo traspasarlos y destruirlos.)
2 - Place-empty : Puede usar esta función para verificar y ver si la instancia de llamada colisionará con cualquier otra instancia en su juego.
(Segun veo, esta es la opción más conveniente para mi problema.)
¿Cual es el problema que tengo?Le coloque a todos mis generadores aleatorios de enemigos la función Place Empty de la siguiente manera:
if ( place_empty (posicion_horizontal,posicion_vertical) ){
instance_create_layer( posicion_horizontal, posicion_vertical ,"Enemigos",obj_enemigo );
global.enemigos++;
} else{
show_debug_message("Choque con algo");
}
}
- Al no entender el funcionamiento de dicha funcion, coloque tanto en el if como en el Else el Show_debug_message. Si lo coloco en el IF no se crea ninguna instancia, si lo coloco de esta manera, de igual forma siguen colicionando, y no me aparece ningun mensaje de "Choque con algo".
Si me ayudaran se los agradeceria mucho :) :love: :love:
----------------------------
Otra solución que se me ocurre, pero menos profesional que usar una función del GM2, es la de si se superpone un objeto a otro que este último se elimine. Pero prefiero investigar un poco más para no llegar a ese extremo. :'(
----------------------------
Muchas gracias por todo!! :-[
Las funciones place_*() comprueban la disponibilidad de un lugar basándose en comprobar si la máscara de colisión del objeto que las ejecuta choca con la máscara de alguna instancia. En tu caso, utilizas una timeline que no tiene máscara de colisión y, por tanto, dichas funciones no van a trabajar correctamente.
Una solución simple podría ser utilizar position_empty() (http://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/movement%20and%20collisions/collisions/position_empty.html) o position_meeting() (http://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/movement%20and%20collisions/collisions/position_meeting.html) que no utilizan la máscara de colisión del objeto que las ejecuta, sino que comprueban un choque entre un punto concreto (dado por coordenadas) y la máscara de las otras instancias.
Te haría un monumento de tener Marmol y un cincel jajaja... Realmente muchisimas gracias.
Aun nose si funciona, pero voy a estar trabajando un poco en ello. Apenas sepa comunicó si se soluciono. :D :D
Cita de: NiuWeb en Noviembre 22, 2018, 04:18:26 AM
Las funciones place_*() comprueban la disponibilidad de un lugar basándose en comprobar si la máscara de colisión del objeto que las ejecuta choca con la máscara de alguna instancia. En tu caso, utilizas una timeline que no tiene máscara de colisión y, por tanto, dichas funciones no van a trabajar correctamente.
Una solución simple podría ser utilizar position_empty() (http://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/movement%20and%20collisions/collisions/position_empty.html) o position_meeting() (http://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/movement%20and%20collisions/collisions/position_meeting.html) que no utilizan la máscara de colisión del objeto que las ejecuta, sino que comprueban un choque entre un punto concreto (dado por coordenadas) y la máscara de las otras instancias.
Lo reemplaze por ambas funciones pero no me funciono con ninguna :( .... Creo que tal vez lo mejor sea evitar usar el timeline para generar aleatoriamente cada segundo y ahcerlo con un contador casero..
(nadie ha visto nada xd)
EDIT:
A ver, puedes intentar de esta forma:
1. Crea al objeto aleatoriamente en cualquier lugar, no va a haber una comprobación de disponibilidad inicial.
[gml]
///En el timeline
var _x, _y;
_x = irandom(room_width);
_y = irandom(room_height);
instance_create(_x, _y, objeto);
[/gml]
2. Será dentro del código del mismo objeto en donde comprobaremos si el lugar está disponible
[gml]
///Evento create del objeto
var n = 0; //Un contador para limitar la cantidad de "intentos" por ponerse en una zona libre.
while not place_empty(x, y) {
x = irandom(room_width);
y = irandom(room_height);
n ++;
if n > 20 { //Así evitamos que se bloquee el juego si el objeto no encuentra espacio disponible
instance_destroy();
exit;
}
}
[/gml]
Niu! Ahora si. Muchisimas gracias.
Es mi primer mes en el Game Maker y armando juegos jaja. Entonces esto me deja en claro 2 cosas:
1 - Que los Timeline crean las instancias sin tomar en cuenta su mascara de colisión.
2 - Que el mejor momento de comprobar si VA A colisionar una instancia es en el CREATE del Objeto. Yo hasta ahora usaba el create sólo para variables del objeto.
Muchisimas gracias enserio :)
Cita de: Alfacoy en Noviembre 22, 2018, 02:39:25 PM
Niu! Ahora si. Muchisimas gracias.
Es mi primer mes en el Game Maker y armando juegos jaja. Entonces esto me deja en claro 2 cosas:
1 - Que los Timeline crean las instancias sin tomar en cuenta su mascara de colisión.
2 - Que el mejor momento de comprobar si VA A colisionar una instancia es en el CREATE del Objeto. Yo hasta ahora usaba el create sólo para variables del objeto.
Muchisimas gracias enserio :)
En este caso sí era necesario usar el evento create, pero cuando se necesita estar chequeando colisiones constantemente, esto se hace en el evento step
Cita de: Kain88 en Noviembre 25, 2018, 02:43:56 AM
En este casi sí era necesario usar el evento create, pero cuando se necesita estar chequeando colisiones constantemente, esto se hace en el evento step
Hacia falta aclarar eso! JAJA si, tal cual como decis. Para chequear constantemente uso el Step jaja .. Muchas gracias Kain :)
Realmente gracias a la comunidad. Son gente colaborativa.