Marzo 24, 2013, 08:06:57 AM Ultima modificación: Marzo 25, 2013, 09:56:51 PM por AndreiiCx
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][/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], 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!
Solo intento crear ideas, en forma de obras de arte interactivas.

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.
Solo intento crear ideas, en forma de obras de arte interactivas.

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]
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

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]