Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: [SOLUCIONADO]Instancias se superponen entre si.  (Leído 434 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Alfacoy

en: Noviembre 22, 2018, 04:09:06 am
Hola Comunidad! ???


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:

Código: [Seleccionar]
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!!  :-[
« última modificación: Noviembre 22, 2018, 02:40:31 pm por Alfacoy »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado NiuWeb

  • Flota de Justicia Particular.
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 2825
  • Mensajes: 1.697
  • Agradecido: 141 veces
  • Sexo: Masculino
  • Rock anthem for saving the world.
    • Ver Perfil
Respuesta #1 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() o position_meeting() 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.

El tiempo era tu aliado, humano, pero te ha abandonado.
Los Forerunners han regresado, esta tumba ahora es tuya.

-Ur-Didacta.


BA:STFW&RTFM
 
Los siguientes usuarios dieron las gracias a este tema: Alfacoy


Desconectado Alfacoy

Respuesta #2 en: Noviembre 22, 2018, 04:21:46 am
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




 


Desconectado Alfacoy

Respuesta #3 en: Noviembre 22, 2018, 04:39:12 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() o position_meeting() 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..


 


Desconectado NiuWeb

  • Flota de Justicia Particular.
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 2825
  • Mensajes: 1.697
  • Agradecido: 141 veces
  • Sexo: Masculino
  • Rock anthem for saving the world.
    • Ver Perfil
Respuesta #4 en: Noviembre 22, 2018, 05:06:57 am
(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.
///En el timeline
var _x, _y;
_x = irandom(room_width);
_y = irandom(room_height);

instance_create(_x, _y, objeto);

2. Será dentro del código del mismo objeto en donde comprobaremos si el lugar está disponible
///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;
    }
}

El tiempo era tu aliado, humano, pero te ha abandonado.
Los Forerunners han regresado, esta tumba ahora es tuya.

-Ur-Didacta.


BA:STFW&RTFM
 
Los siguientes usuarios dieron las gracias a este tema: Alfacoy


Desconectado Alfacoy

Respuesta #5 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 :)


 


Desconectado Kain88

Respuesta #6 en: Noviembre 25, 2018, 02:43:56 am
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
« última modificación: Noviembre 25, 2018, 03:45:58 am por Kain88 »

 
Los siguientes usuarios dieron las gracias a este tema: Alfacoy


Desconectado Alfacoy

Respuesta #7 en: Noviembre 25, 2018, 03:37:54 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.

 
Los siguientes usuarios dieron las gracias a este tema: Kain88