Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje publicado por: correojon en Mayo 09, 2016, 12:16:07 AM

Título: Detectar colisión con una instancia concreta cuando se choca con varias a la vez
Publicado por: correojon en Mayo 09, 2016, 12:16:07 AM
A veces necesitas chequear si tu personaje está colisionando con una instancia de un objeto, pero si hay varias a la vez las funciones de colisión de GM devolverán una al azar, lo que puede no valernos para lo que queramos hacer. Por ejemplo: si nuestro personaje está encima de una plataforma que se mueve en horizontal y nos chocamos con otra que se mueve en vertical, al chequear las colisiones en código las funciones de GM (instance_place(), collision_point()...)nos devolverán una de las dos plataformas, pero no podremos acceder a la otra.

Con este código, podremos chequearlo sin problemas:
[gml]var vPlatform, vTempPlatform;

vPlatform = noone;
vTempPlatform = noone;

var iSS, vI, vExtraCheck;
for (iSS=0; iSS<instance_number(objSemisolidPlatform); iSS+=1){
    vI = instance_find(objSemisolidPlatform, iSS);
    vExtraCheck = false;
    if (vPlatform = noone) vExtraCheck = true;
    if (vExtraCheck){
        vTempPlatform = instance_place(x, y, vI);
        if (vTempPlatform != noone) vPlatform = vTempPlatform;
    }
}
return vPlatform;[/gml]
Utilizando la función instance_find() y un bucle for podemos chequear todas las instancias del objeto indicado una a una. Podemos indicar el object_index de un objeto parent y todos sus hijos se chequearán también (muy útil para chequear colisiones con distintos tipos de plataformas, enemigos...).

En el ejemplo he utilizado instance_place(), pero puede utilizarse cualquier otra función de chequeo de colisiones.

Además, si tenemos instancias desactivadas (por ejemplo, plataformas fuera de la vista) la función instance_find() las descarta automáticamente, por lo que el código es bastante eficiente.

Espero que a alguien le sirva de ayuda ;)