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 ;)
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 ;)