Viendo los vídeos de Jucarave me surgió un pequeño problema y aunque lo resolví, no he logrado entender el porque de este.
Verán estoy en la parte en la que unos picos(obj_trampa) caen de arriba si mi personaje pasa por debajo de esté y colisionan con el primer objeto solido que se encuentra en su camino, para esto use un pequeño script que verifica si hay un objeto solido por debajo de esté:
var bloque;
bloque = collision_rectangle(x-14,y+16,x+14,room_height*argument0,obj_solidparent,0,0);
if (bloque){return bloque.y-32;} //si hay objeto solido debajo

Ahora, este código se supone que guardara la id del primer objeto solido
que se encuentra de arriba hacia abajo, como tambien la distancia existente entre la trampa y el solido.
Luego en el obj_trampa en step guardo la distancia(el script) en una variable:
dist = scr_Distance(1);
Acto seguido:
var play;
play = collision_rectangle(x-14,y+16,x+14,dist,obj_Hero,0,0);

se verificara si mi personaje esta por debajo de la trampa en el rectángulo de colisión acordado.
(dist = distancia entre la trampa y el primer objeto solido de abajo)
Ahora el problema que tengo es que el código funciona bien a la primera, pero si pongo un solido mas arriba, la trampa sigue cayendo en el mismo cuadro, ahora si borro este cuadro (el que esta mas hacia abajo)y lo vuelvo a poner el código se respeta y cae en el cuadro de arriba, en pocas palabras no importa cuantos sólidos estén por debajo de la trampa siempre va a caer sobre el solido mas viejo, es decir, sobre el que puse primero antes que todos en esa área de colisión.
Entonces esa es mi duda ¿la collision_rectangle no debería de guardar a la primera id que se encuentra en el camino?
Espero que halla sido entendible mi duda.

#1 Abril 27, 2015, 05:37:42 AM Ultima modificación: Abril 27, 2015, 05:49:43 AM por penumbra
Por el código que pones, me parece que estás usando rectángulos de colisión muy grandes, por ejemplo, en el primer script, estás usando room_height*argument0 como la altura del rectángulo. Si otra cosa no se me escapa, eso es DEMASIADO

¿Por qué? Según el manual:

CitarIt should also be noted that the return value of the function can be the id of any one of the instances considered to be in collision.

Entonces, si el rectángulo definido en la función colision_rectangle contacta con más de un objeto hijo de obj_solidparent (como seria el caso, ya que es MUY GRANDE), el id devuelto puede ser el de CUALQUIERA de esos objetos, es decir, no hay ninguna garantía de que siempre devuelva el del objeto sólido más cercano a la trampa.

Yo recomendaría usar un método alternativo para activar la trampa y detectar el primer objeto sólido.




Cita de: penumbra en Abril 27, 2015, 05:37:42 AM
Por el código que pones, me parece que estás usando rectángulos de colisión muy grandes, por ejemplo, en el primer script, estás usando room_height*argument0 como la altura del rectángulo. Si otra cosa no se me escapa, eso es DEMASIADO

¿Por qué? Según el manual:

CitarIt should also be noted that the return value of the function can be the id of any one of the instances considered to be in collision.

Entonces, si el rectángulo definido en la función colision_rectangle contacta con más de un objeto hijo de obj_solidparent (como seria el caso, ya que es MUY GRANDE), el id devuelto puede ser el de CUALQUIERA de esos objetos, es decir, no hay ninguna garantía de que siempre devuelva el del objeto sólido más cercano a la trampa.

Yo recomendaría usar un método alternativo para activar la trampa y detectar el primer objeto sólido.
Gracias es bueno saberlo, por el momento lo dejare como lo tengo ya que es un error que se puede solucionar con tan solo poner el objeto con el que colisionara la trampa antes que los demás sólidos en el área de colisión, y pues no he tenido fallas desde entonces.
Ademas no he digerido muy bien este código como para probar otras formas, la función return aun se me complica un poco, en este caso me da a entender que reduce el area de colisión rectangular a la distancia entre el solido y la trampa, por lo que al final el valor del script seria la distancia existente entre el solido y la trampa o mas bien en este caso 32 pixeles mas hacia arriba del bloque de colisión.
Por lo que tengo unas dudas:
Por ejemplo ¿Al asignar dist = scr_Distance le asigno la coordenada bloque.y-32 a dist?.
¿Si este return no estuviera lo que se guardaría en esta variable seria la pura instancia del bloque?
¿El return en pocas palabras le da un nuevo valor al argument0, es decir, establece un nuevo punto partiendo de la variable bloque, por lo que al final el valor de scr_Distance seria este punto?
Probablemente sean preguntas muy básicas pero aun no domino muy bien los scripts.

#3 Abril 27, 2015, 07:22:11 AM Ultima modificación: Abril 27, 2015, 07:29:58 AM por penumbra
Cita de: woolf7 en Abril 27, 2015, 06:47:51 AM
Probablemente sean preguntas muy básicas pero aun no domino muy bien los scripts.
Creo que estás algo confundido, a ver si puedo explicarlo claramente.

Cita de: woolf7 en Abril 27, 2015, 06:47:51 AM
Por ejemplo ¿Al asignar dist = scr_Distance le asigno la coordenada bloque.y-32 a dist?.
Sí. Pero esa coordenada puede ser de cualquiera de las instancias bloque que el rectángulo se encuentre.

Cita de: woolf7 en Abril 27, 2015, 06:47:51 AM
¿Si este return no estuviera lo que se guardaría en esta variable seria la pura instancia del bloque?
No. Si return no estuviera, no se guardaría nada en la variable  dist. En el script, la variable bloque seguiría almacenando el id de instancia de un bloque, pero como no hay una instrucción return, el script símplemente no devuelve nada. No siempre es necesario que el script devuelva algo, pero en este caso, sí.

Cita de: woolf7 en Abril 27, 2015, 06:47:51 AM
¿El return en pocas palabras le da un nuevo valor al argument0, es decir, establece un nuevo punto partiendo de la variable bloque, por lo que al final el valor de scr_Distance seria este punto?
En principio, return no tiene relación directa con ningún argumento. Es posible que un script devuelda (mediante return) el valor de un argumento de entrada, pero esto no es muy útil, ya que si llamas a un script para darle un argumento de 5, y el script devuelve ese mismo 5, pues no estás aprovechando el script. argument0 (en este caso) es un valor que indica qué porcentaje de la altura del room se va a considerar para crear el rectángulo de colisión, es decir, argument0 te ayuda a decidir qué tan alto va a ser tu rectángulo de colisión. Esto no tiene relación directa con la instrucción return. La instrucción return hace posible que, después de hacer cálculos, o procesar los argumentos, el script devuelva un resultado/valor. Incluso puedes tener un script al que no se le pasen argumentos, pero que de todas maneras pueda usar un return para devolver "algo". O al revés, un script al que se le pasen argumentos, pero que no tenga un return.

return símplemente sirve para que, al llamar al script, éste devuelva un valor.