He creado este script
with(argument0) {
obCtrl.vrPlaceMeetingWith = place_meeting(argument1, argument2, argument3);
}
return obCtrl.vrPlaceMeetingWith;
La idea es poder hacer un place_meeting usado la colisión de OTRO objeto, pero no desde ese objeto. La idea es hacer el width y guardar el resultado en otro objeto, obCtrl, que es persistente y siempre está ahí, para recuperar el resultado. Por qué no funciona?
ObCtrl ya tiene en create la inicialización de la variable. No da ningún error, simplemente... no funciona. O sea, que no devuelve lo que tiene que devolver
NO quiero usar variables globales, las odio a más no poder, no hice pruebas extensas pero creo que daban errores por todos lados. Usar una variable local de un objeto persistente debería servir, no?
Cita de: DarkKRuleR en Septiembre 03, 2015, 05:26:43 PM
He creado este script
with(argument0) {
obCtrl.vrPlaceMeetingWith = place_meeting(argument1, argument2, argument3);
}
return obCtrl.vrPlaceMeetingWith;
La idea es poder hacer un place_meeting usado la colisión de OTRO objeto, pero no desde ese objeto. La idea es hacer el width y guardar el resultado en otro objeto, obCtrl, que es persistente y siempre está ahí, para recuperar el resultado. Por qué no funciona?
ObCtrl ya tiene en create la inicialización de la variable. No da ningún error, simplemente... no funciona. O sea, que no devuelve lo que tiene que devolver
NO quiero usar variables globales, las odio a más no poder, no hice pruebas extensas pero creo que daban errores por todos lados. Usar una variable local de un objeto persistente debería servir, no?
Me podrías mostrar que code hay en ObCtrl?
En create:
vrPlaceMeetingWith = false;
Y esa variable no la toca ningún otro objeto ni script, ni la toca el propio obCtrl. Es sólo un contenedor auxiliar para poder guardar el resultado del "with" y recogerlo en el script. ObCtrl tiene muchas cosas, crear la cámara 3D, ajustar display, inicializar variables clave...
Y realmente no importaría ni el valor inicial, ni si otro objeto lo modifica. SIEMPRE que voy a leer esa variable dentro del script es porque acabo de asignarle un nuevo valor al hacer place_meeting, así que no importa qué suceda fuera del script con la variable. Y obCtrl es persistente. Realmente sólo tengo una room por ahora, y puedo asegurar que el objeto nunca se desactiva ni se destruye
Lo que hace tu script es guardar en la variable vrPlaceMeetingWith de las instancias de obCtrl el resultado de comprobar si la instancia argument0, colocada en las coordenadas argument1,argument2, colisiona con la instancia argument3. Si el script devuelve false, existen estas posibles causas:
-No existe una colisión de argument0 con argument3 en esas coordenadas
-Una o ambas instancias no tienen máscaras de colisión definidas
-la instancia argument0 o la instancia argument3 no existe
- Puedo asegurar que argument0 colisiona con argument3. Tengo ese mismo código en otra parte pero de forma manual, y veo cómo sí colisionan. Pero el script no.
-Ambas tienen máscara, o sprite en su lugar. A demás, por el punto 1, sí colisionan si el código es HECHO desde una de ellas y manualmente.
-Ambas existen
Tan bien se ve el script? Significa que está bien y el error está en otro lado que yo no puedo percibir?... :C
PD: sólo hay UN obCtrl
Cita de: DarkKRuleR en Septiembre 03, 2015, 08:03:23 PM
- Puedo asegurar que argument0 colisiona con argument3. Tengo ese mismo código en otra parte pero de forma manual, y veo cómo sí colisionan. Pero el script no.
-Ambas tienen máscara, o sprite en su lugar. A demás, por el punto 1, sí colisionan si el código es HECHO desde una de ellas y manualmente.
-Ambas existen
Tan bien se ve el script? Significa que está bien y el error está en otro lado que yo no puedo percibir?... :C
PD: sólo hay UN obCtrl
Entonces puede ser que el problema está en otra parte. Si estás seguro de que el script debe devolver
true, tal vez la instancia que debe llamarlo en realidad no lo está llamando y nunca se ejecuta; eso puedes comprobarlo fácilmente agregando un
show_message dentro del script, mostrando, por ejemplo, los valores de
argument0 a
argument3.
Buenas ideas, sin duda.
He confirmado que ENTRA en la porción de código que toca, que ENTRA en el script (sólo lo llamo aquí, en ninguna otra parte más) y...
if (scKey(vk_space)) {
with(argument0) {
obCtrl.vrPlaceMeetingWith = place_meeting(argument1, argument2, argument3);
show_message("A"+string(place_meeting(argument1, argument2, argument3)));
}
show_message("B"+string(argument0 == obCly));
show_message("C"+string(argument3 == obPilarCristales));
show_message("D"+string(obCtrl.vrPlaceMeetingWith));
return obCtrl.vrPlaceMeetingWith;
}
A0, B1, C1, D0.
He pulsado espacio justo cuando yo veía que ambos objetos, Cly y PilarCristales, colisionan. Asegurado, pues el segundo temblaba, y sólo pasa mediante un código a parte cuando colisionan. Resultado anterior, no lo ha detectado. Nadamás pulsar espacio ha mostrado eso anterior. Ambos place_meeting devuelven 0.
Las instancias van bien, pero place_meeting, ni siquiera el que se ejecuta originalmente DENTRO del with, funciona. Esto ya no lo entiendo.. algo va mal con el propio "with"?
En la llamada he probado estas 4 combinaciones
scPlaceMeetingWith(obCly, x, y, obPilarCristales)
scPlaceMeetingWith(obCly.id, x, y, obPilarCristales)
scPlaceMeetingWith(obCly.id, x, y, obPilarCristales.id)
scPlaceMeetingWith(obCly.id, x, y, obPilarCristales.id)
Sigue sin funcionar (aún no tengo claro cuándo va bien .id y cuándo el nombre del objeto, incluso en casos en que sólo haya UNA instancia de él, pero no parece ser el problema)
EDIT: Me acabo de dar cuenta que a la llamada de paso las x e y incorrectas. Debo pasarle obCly.x, obCly.y. Ya funciona!
Muchas gracias por la ayuda, qué fallo más tonto xDD Al final no colisionaban... porque chequeaba donde no tenía que hacerlo