Yo de nuevo(:
esta vez me ah surgido la necesidad de crear un rango donde se revise si se encuentra el Objeto2, si es así, cumplir un bucle, si no es así, cortar el bucle.
En sentencia lo que quiero es que, si el Objeto2 se encuentra en una distancia menor a 128 pixeles hacia arriba (no encima) del Objeto1 (solo hacia arriba, ni a la derecha ni a la izquierda ni abajoC:), se ejecute la acción.
El rango debería ser mas o menos como en la imagen adjunta
[spoiler](http://www.comunidadgm.org/index.php?action=dlattach;topic=18416.0;attach=12009;image)[/spoiler]
Agradezco cualquier respuesta desde ya y espero haber sido claro :-[
PD: yo había intentado con point_distance() pero este devuelve una distancia de punto a punto, y yo solo necesito la distancia superior.
En el grupo de Facebook de la comunidad [Link al post (http://www.facebook.com/groups/118507478221146/472157452856145)], Jesús Jiménez (perdón no conozco tu alias in forum) me propuso solucionarlo con
[gml]arriba=abs(obj_1.y - obj_2l.y)
ah if place_meeting(x+tamaño del objeto1,y-arriba,obj_2l)// la x del objeto 1 debe de estar a su izquierda [/gml]
pero esto solo hace que el rango sea en un espacio limitado dependiendo del tamaño de la mascara de colision del Objeto1 (que para mi objeto son 32pixeles) y yo necesito 128 pixeles. además que al ubicar la el Objeto2 en distinta posición Y en el Room, el rango se desfasa completamente, haciéndolo distinto para cada Objeto2.
Creo que lo puedes hacer con un collision_rectangle que se cree partiendo de la posición del objeto 1 y luego con un place_meeting verificas si el objeto 2 está dentro de ese rectángulo (rango).
Es lo primero que se me ocurre y lo respondo así rápido y sin ejemplos porque ando un poco ocupado, si me equivoco alguien que por favor me corrija, y si no lo entiendes muy bien avísame para hacer un ejemplo más tarde cuando me desocupe.
¡Saludos!
Probá así, en el step poné
[gml]if collision_rectangle(x,y,x+sprite_width,y-128,objeto_a_chequear,1,1)
{
//hacer cosas
}[/gml]
Con ese código bastaría que un poquitín del otro objeto esté adentro del rango para que se cumpla el bucle, si necesitás que el objeto entero esté dentro del rango si o sí, ignorá el código anterior y en step poné lo siguiente
[gml]asd=0
with(objeto_a_chequear) {if x>other.x and x+sprite_width<other.x+other.sprite_width and y>other.y-128 and y+sprite_height<other.y {other.asd=1}}
if asd=1
{
//hacer cosas
}[/gml]
AndreiiCx, ten en cuenta que el código que te dio Texic funciona perfectamente SOLO si el origen de ambos sprites es 0,0.
Bueno, si no resulta ser 0 simplemente hay que restar el orígen para cada aparicion de x o y en la ecuación, que se obtiene con una función que ahora no logro recordar
seguramente te refieres a:
[GML]sprite_xoffset
sprite_yoffset[/GML]
gracias por sus respuestas! ambos codigos de Texic me han funcionado de maravilla! y pues si, tengo los sprites con su origen en el centro, solo eh tocado un poco los valores de cada X y Y y han funcionado perfectamente! (supongo que a esa función a la que se refieren hace automáticamente esto pero sinceramente no se como aplicarla ???) y pues hasta el momento duda resuelta!
La cosa quedaría algo así creo
[gml]if collision_rectangle(x-sprite_xoffset,y-sprite_yoffset,x-sprite_xoffset+sprite_width,y-sprite_yoffset-128,objeto_a_chequear,1,1)
{
//hacer cosas
}[/gml]
Y el otro así
[gml]asd=0
with(objeto_a_chequear) {if x-sprite_xoffset>other.x-other.sprite_xoffset and x-sprite_xoffset+sprite_width<other.x-other.sprite_xoffset+other.sprite_width and y-sprite_yoffset>other.y-128-other.sprite_yoffset and y-sprite_yoffset+sprite_height<other.y-other.sprite_yoffset {other.asd=1}}
if asd=1
{
//hacer cosas
}[/gml]
muchisimas gracias Texic!!