saludox terricolas, hace muuuuuuuuuucho que no venia por estos lados pero me alegra saber que el foro sigue progresando, les explico mi duda a continuacion:

tengo dos objetos obj1 y obj2, el obj1 crea al obj2 y le asigna un path, mi duda es si puedo controlar el evento
End of path del obj2 desde el obj1

de antemano muchas graxias

pones with el nombre_del_objeto {aquí_el_script};
Padre Nuestro del Programador de C           
C Nuestro que estas en la Memoria,
Compilado sea tu código,
venga a nosotros tu software,
carguense tus punteros.
así en la RAM como en el Disco Duro,
Danos hoy nuestro Array de cada día,
Perdona nuestros Warnings,
así como nosotros también los eliminamos,
no nos dejes caer en Bucles,
y libranos del Windows, Enter.

Si por controlar te refieres a ejecutar el evento End of Path desde obj1:

with (obj2) //Hacemos que el código se ejecute en todas las instancias de obj2, de otro modo se va a ejecutar en obj1
{
event_perform_object(obj2,ev_other, ev_end_of_path); //Manualmente llamamos al evento End of Path de obj2.
}
//Si quieres ejecutarlo únicamente dentro de una instancia de obj2, debes guardar en una variable el valor del id de la instancia de obj2 al crearla. Esto se hace anteponiendo a la función instance_create() donde creas la instancia de obj2 una variable seguida del signo de equivalencia.
//Por ejemplo: obj2_id = instance_create(x,y,obj2);
//Luego, en lugar de with(obj2), escribes with(obj2_id). Así el código sólo se ejecuta en esa instancia.

Eso ejecutará el evento End of Path en obj2. Ten en cuenta que esto va a ejecutar el código del evento sin necesidad de que se cumpla la condición normal de ejecución del código, es decir, sin necesidad de que la instancia haya llegado al final del path.

Si por controlar te refieres a introducir código en el End of Path de obj2 desde obj1, es un poco más complicado. Si pudieses aclarar exactamente a qué te refieres con "controlar el evento", es decir, si te refieres a su contenido o a su ejecución, te puedo escribir un ejemplo para lograr el cometido :)

Cita de: calio en Enero 16, 2013, 12:43:29 PM

Si por controlar te refieres a introducir código en el End of Path de obj2 desde obj1, es un poco más complicado. Si pudieses aclarar exactamente a qué te refieres con "controlar el evento", es decir, si te refieres a su contenido o a su ejecución, te puedo escribir un ejemplo para lograr el cometido :)

exactamente eso es lo que necesito,para explicar mejor, el obj2 es una mano, en el obj1 que seria el cuerpo, tengo dos variables mano_izq y mano_der que son los "apodos" que tienen los dos obj2 que crea, cada uno tiene su path, el detalle es que obj2 no tiene ningun evento y lo que deseo es que al terminar el path de cada mano, se escuche un sonido, mis disculpas por no explicarme mejor, saudox y graxias por la ayuda 

#4 Enero 16, 2013, 06:08:04 PM Ultima modificación: Enero 16, 2013, 06:14:25 PM por calio
Estuve metiéndome en el asunto. Está bastante complicado (y no haber dormido mucho ni muy bien tampoco ayuda mucho, a decir verdad...) y no tengo idea si es cosa del intérprete de Mac de Game Maker o si realmente sucede así en todos lados.

Hay una variable que se llama path_position. Básicamente, es una variable que indica la posición dentro del path que lleva la instancia, siendo 0 el principio y 1 el final, con todos los números decimales indicando el entre medio.

Primer problema: al menos en Mac, la variable path_position nunca es un número entero a menos que el path_endaction (la acción a ejecutar al terminar el path) sea 0, es decir, que la instancia que sigue el path se detenga.

Lo quise resolver amplificando el valor de la variable redondeada, lo que sólo resultó en darme cuenta que la variable nunca terminaba en el mismo numero; la amplifiqué por 10 y el valor final siempre era 9, pero nunca 10. Amplificado por 100 el valor oscilaba entre 99 y 97.

Decidí que a lo mejor podía trabajar manualmente cada uno de los estados, estableciendo una variable que actuase como path_endaction, pero escribiendo el código que cada acción debería tomar, y darle por valor a path_endaction 0, pues es el único valor en que path_position equivale a 1 en algún momento.

En teoría es sencillo, si path_position es 1 y:
- La variable personalizada es 0 (detener el path), cambia el speed del path a 0.
- Si la variable es 1 (volver al punto inicial) establece el valor de path_position a 0.
- Si la variable es 2 (reiniciar el path desde el punto en que se encuentra la instancia), termina el path y lo vuelve a llamar, provocando que empiece desde allí.
- Si la variable es 3 (hacer el path a la inversa), multipica la velocidad del path por -1

Segundo problema: Al llegar al final del path, escribiese lo que escribiese, el objeto se detiene. Al principio pensé que tenía sentido porque path_endaction equivalía a 0, y a lo mejor eso preponderaba a cualquier otra órden que le diese a la instancia que seguía el path, sin embargo según el manual de Game Maker sí se pueden modificar éstos valores. Ni path_speed ni path_position parecen reaccionar, incluso si los cambio manualmente en modo debug.

Si no necesitas que tus instancias de mano_der y mano_izq hagan algo luego de acabar el path, la solución es:

with (mano_der)
if (path_position == 1)
{
sound_play(sfx_tusonido);
}


De lo contrario, te pediría por favor que debuggearas lo que te escribí anteriormente. Si la variable path_position vale 0 al comienzo y 1 al final en el intérprete de Windows de Game Maker 8 en otros comportamientos del path, la solución es tan sencilla como comprobar si es que la variable equivale a 1 y en ese caso reproducir el sonido. De lo contrario, ojalá que ésta experiencia fallida te ayude en algo ._.

Tengo la sensación de que estoy pasando por alto algo muy obvio y estúpido, pero no logro fijarme en qué ._.

Necesito dormir =_=

vaya y descanse Mr calio y que sueñe con chicas en bikini  XD

ya en serio, probé el ultimo codigo que puso, pero al terminar el path el sonido seguia sonando hasta que enpezaba de nuevo, pero lo arreglé y al final quedó asi


with (mano_der)
if (path_position == 1)
{
sound_play(sfx_tusonido);
path_position=0
}


con ponerle path_position=0 al final el sonido ya solo se escuchaba una vez

graxias por la ayuda, eso resuelve mi problema con el sonido, pero aun deseo saber si se puede controlar un evento desde otro objeto

saludox

(la única forma que se me ocurre de ejecutar código desde una instancia en el evento de otra instancia es utilizando la función object_event_add(), donde

object_event_add(obj2,ev_other,ev_end_of_path,"sound_play(sfx_tusonido)");

en el evento Create después de crear mano_izq y mano_der añadiría ese código al objeto obj2 (la función sólo funciona para añadir código en los eventos del objeto, no en instancias, y no hay forma de crear un evento sólo para una instancia. el primer argumento en la función DEBE ser un indice de objeto, no de instancia)
Mi único problema es que me parece que ésta función es poco fiable, pues las funciones que en general añaden código dinámicamente utilizando strings que luego son ejecutadas durante el juego suelen ser funciones muy incompatibles con el código compilado. Sólo para aclarar, esto debiese ser imposible, pues en ningún lenguaje compilado se puede escribir código aparte y luego dejar que el programa lo interprete después de ser compilado. El uso de éstas funciones (como string_execute() que ejecuta código a lo bruto desde una string, las familias de funciones variable_local_ y variable_global_ que ejecutan código para definir y buscar variables escritas como strings) está completamente desaconsejado, resulta en tiempos de ejecución absurdamente lentos y ayudan a crear malos hábitos de programación.

Pero no me hagan caso, yo estoy durmiendo :D)