Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: serviciosadistancia en Enero 30, 2016, 04:12:13 PM

Título: Detectar todas las instancias en un mismo sector
Publicado por: serviciosadistancia en Enero 30, 2016, 04:12:13 PM
Hola amigos, estoy enloquecido tratando de hacer esto que imaginé sería fácil pero me está resultando difícil, la cosa es así, tengo un juego de bolas que se mueven donde gano cuando puedo acomodar todas las bolas en un sector, todas las instancias deben estar allí para poder pasar de nivel, la forma que me había parecido más práctica por ser un juego de físicas y aparte porque ese sector de nivel a nivel se mueve y cambia de tamaño y demás, fue hacer un objeto (sensor) para detectar cuando las bolas están allí, pero el problema es que las bolas se mueven y en un momento tal vez están en ese sector y luego se salen, solo quiero que se gane cuando todas las instancias están acomodadas ahí. Ahora bien, la pregunta es, ¿cómo detecto esto? ¿que todas las instancias están ahí? como debería decirle a GM ... si todas las instancias colisionan con este objeto a la vez hacer tal cosa. Desde ya, muchas gracias!
Título: Re:Detectar todas las instancias en un mismo sector
Publicado por: kostra en Enero 30, 2016, 04:22:39 PM
2 maneras:

1-detectando las coordenadas de las bolas

2- más fácil, haz un sprite con la forma del sector, lo añades en un objeto, lo pones en invisible y en su create:
[gml]bolasdentro = 0;[/gml]

en el create de la bola
[gml]dentro = false;[/gml]

en la colisión de la bola con el objeto con el sprite del sector:
[gml]if !dentro {
    dentro = true;
    other.bolasdentro++;
    }[/gml]

ah, y en el step del objeto sprite sector:
[gml]if bolasdentro == instance_number(obj_bola)
    //codigo al ganar[/gml]


PD: acabo de improvisar, no te garantizo nada, y tampoco sé si es compatible con físicas
Título: Re:Detectar todas las instancias en un mismo sector
Publicado por: serviciosadistancia en Enero 30, 2016, 04:40:07 PM
Kostra, muchas gracias por responder, entiendo el código pero creo así a simple vista que habría problemas cuando una bola está en el sector correcto y por faltar otras que no están acomodadas aún esta se sale, cuando la bola se ubica en el lugar correcto esta se puede desacomodar al intentar acomodar las otras porque siguen siendo afectadas por el acelerómetro, justamente la dificultad del juego se basaría en lo difícil que sería acomodar la última bola sin desacomodar las otras 4, suponiendo que en el nivel son 5. Creo que debería restar una bola en bolasdentro cuando deja de colisionar, y ahí estoy otra vez en el dilema..
Título: Re:Detectar todas las instancias en un mismo sector
Publicado por: bygdle en Enero 30, 2016, 04:57:06 PM
pos puedes hacer una lista con las ID de las bolas que han entrado, y detectar si una de esas bolas aún sigue o no dentro del sector.

Por ejemplo, en el create de un objeto sin sprite ni nada:
[gml]
bolas_adentro = ds_list_create();
[/gml]

Y en su step:
[gml]
obj = collision_rectangle(x, y, x+128, y+128, obj_bola, false, false);
if ds_list_find_index(bolas_adentro,obj) == -1
ds_list_add(bolas_adentro,obj);

for(var i=0;i<ds_list_size(bolas_adentro);i++)
{
j = bolas_adentro[| i];
if j.x > (x+128) or j.x < x or j.y > (y+128) or j.y < y
{
ds_list_destroy(bolas_adentro,i);
}
}
[/gml]

EDIT: le erré al código xD, ya corregí, revísalo de nuevo :B
Título: Re:Detectar todas las instancias en un mismo sector
Publicado por: Clamud en Febrero 01, 2016, 04:22:59 PM
Se me ocurre otra forma. En el evento Step del objeto bola actualiza una variable:
[gml]
dentro = place_meeting( x,y, obSector );
[/gml]
Y en el evento End Step de un objeto controlador (o el objeto sector) revisa que todas las bolas han entrado:
[gml]
global.todas = true;
with( obBola )
global.todas = global.todas and dentro;

if( global.todas )
{
    //has ganado
}
[/gml]
Esto se puede complicar si quieres que cuenten únicamente las bolas que están completamente contenidas en el sector. Una solución sería implementar un algoritmo que detecte un polígono dentro de otro, que no es algo trivial, sin embargo, como las figuras a detectar son simples círculos bastaría con recortar toda la orilla del área de colisión del sector una distancia igual al radio de las bolas.