Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

* Sponsor

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: registrar multiples colisiones al mismo tiempo (Juego tipo buscaminas)(Resuelto)  (Leído 722 veces)

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

Desconectado Momoni

Buenos dias/tardes/noches. Estoy haciendo un juego tipo Buscaminas solo por curiosidad de aprender a como hacer un juego de esos basicos, y realmente tengo casi todo listo, desde la generacion/posicion de las minas pero tengo un problema a la hora de registrar cuantas minas hay cerca

Si bien con la primera parte la tengo lista, es decir, el juego me calcula bien los 1 (como en la imagen) no encuentro la forma de que me registre 2 colisiones al mismo tiempo

El codigo para registrar cuantas minas hay cerca que yo uso es el siguiente (lo ejecuto por cada cuadricula)

//Create
cminas=0
minas = false

//Step 
if collision_circle (x+16,y+16,30,obj_mina,false,false) and minas = false
 {cminas++
minas = true}

//Draw

draw_text(x+16,y+16,cminas)

Si bien el codigo es sencillo, lo explicare igualmente para retratar lo que pense a la hora de hacerlo. Con el Collision_circle registro cuantas minas hay cerca, pero como ese codigo solo almacena la ID y no la cantidad, solo me registra una. He estado pensando y ejecutando pero no me sirve nada para registrar 2 y 3 colisiones al mismo tiempo. Todos los comandos de Collision solo registran la Id de los objetos, no la cantidad

El codigo instance_nearest tambien es lo mismo y solo registra una

¿Alguna idea? Intente hacer todo por mi mismo, sin buscar tutoriales ni nada pero este ha sido algo que por mas que piense, no doy idea  :-[

El draw solo lo uso para saber si todo va bien.
« Última modificación: Abril 12, 2021, 10:01:02 pm por Momoni »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado BssString

Hola Momoni

El código dependerá de cómo creaste la cuadrícula, si usaste ojetos en la room o algún sistema de datos como la ds_grid o los arrays.

Para empezar, el código que calcula la cantidad de minas al rededor del bloque no debería ir en el Step Event porque eso hará que se ejecute en cada frame de tu juego, si corres el juego a 30fps, ese código se ejecutará 30 veces por segundo.
Basta con que se ejecute al inicio y ya, en el create event o en algún evento posterior (pero sólo 1 vez)

No hay forma de revisar múltiples colisiones sin hacer un loop, ya sea un "While", un "With" o un "For".

Pero como en tu caso sólo hay 8 bloques al rededor, lo puedes escribir a mano de la siguiente manera:
cminas = position_meeting(x-32,y-32,obj_mina) + position_meeting(x,y-32,obj_mina) + position_meeting(x+32,y-32,obj_mina) //Detecta la cantidad de minas de la fila de arriba
+ position_meeting(x-32,y,obj_mina) + position_meeting(x+32,y,obj_mina) //detecta colisión con minas en la fila del medio, a la izquierda y derecha del bloque
+ position_meeting(x-32,y+32,obj_mina) + position_meeting(x,y+32,obj_mina) + position_meeting(x+32,y+32,obj_mina) //detecta colisión en la fila de abajo

Desconozco realmente si el código funciona separado por enter, pero tú lo pones todo en 1 misma línea en tu GM.

favor notar que estoy usando "position_meeting" en vez de "place_meeting", lo que hace la función es detectar si en un punto específico de la room se encuentra el objeto indicado, la detección de colisión la hace contra la colisión que tiene asignada el sprite, asumí que tu sprite mide 32x32 y la colisión también.
En caso de detectar colisión, devuelve "true" (que para Game Maker es 1), en caso contrario, devuelve "false" (que para GM es 0)

Entonces imagina que el bloque tiene una mina a la izquierda y una mina arriba a la derecha, la fórmula hará el siguiente cálculo:
Código: [Seleccionar]
cmina = 0 + 0 + 1
 + 1 + 0
+ 0 + 0 + 0
Y como resultado tendrás que ese bloque tiene 2 minas rodeandolo.

Saludos

 
Los siguientes usuarios dieron las gracias a este tema: Momoni


Desconectado Clamud

Usar postion_meeting también me parece la mejor opción.
El código se puede hacer más compacto de esta forma
cminas = 0; //cantidad de minas

for(i = x-32; i<=x+32; i+=32)
for(j = y-32; j<=y+32; j+=32)
{
    // No revisar la posición central
    if(i==x and j==y) continue;
   
    // Revisar las otras posiciones
    cminas += position_meeting(i, j, obj_mina);
}

El juego puede funcionar usando solo objetos, pero en algún punto creo que será necesario almacenar información en arrays o ds_grids.

 
Los siguientes usuarios dieron las gracias a este tema: Momoni


Desconectado Momoni

Mil gracias. Funciona perfecto. Aun estoy aprendiendo y por ejemplo el "For" aun no lo domino ni se como implementarlo bien. Y las Arrays y Ds_grid apenas y se como crearlas pero no como usarlas, modificarlas y demas cosas jajaja. Pero seran cosas que con el tiempo, ire aprendiendo. Mil gracias  :)