Como saber si termino de ver el tutorial en flash

¿Cómo puedo pescar el evento al cerrar la ventana donde esta una presentación de flash (el popup que tiene los 3 iconos: minimiza, resise, cerrar), si se esta viendo el flash y le dan en "cerrar" se puede pescar ese evento? Antes de cerrar todo y saber hasta donde se vio el tutorial, ¿y poder guardar la información de que no termino de verlo completo?
Y podrías mandarme un ejemplo

1 Respuesta

Respuesta
1
Se me ocurre una solución a tu problema, pero para ello no tienes que interceptar el evento de cerrar la aplicación.
No lo explicas en tu pregunta pero supongo que has elaborado un tutorial de alguna materia ¿?. Quizás esté dividido en capítulos, temas, acápitas...! que se yo! El caso es que debes establecer algún modo (me imagino que ya exista) de poder saltar directamente a un capitulo, acápite, etc determinado.
Es un poco difícil explicarme al desconocer cómo lo concebiste, así que imaginemos una estructura ¿está bien?
Supongamos que tu tutorial cuenta con 10 capítulos el primero se visuliza a partir del fotograma 1 hasta 19, en el 20 empieza el capítulo 2 hasta el 21... y así sucesivamente:
1-19 - Capítulo 1
20-29 - Capítulo 2
30- 39 - Capítulo 3
.
.
90- 91- Capítulo 9
100- 111 - Capítulo 10
Bastaría saber en qué fotograma estaba la cabeza lectora cuando el usuario decidió cerrar el swf.
Eso es fácil de lograr. Te escribo el código que debes poner en el primer fotograma de la linea de tiempo principal y luego te lo comento (suponiendo que los saltos se desarrollan en la linea de tiempo primcipal)
MyObjeto = SharedObject.getLocal("salva")
gotoAndStop(MyObjeto.data.salto)
dd = setInterval(escribir,1)
function escribir(){
MyObject.data.salto = _currentframe
}
En la primera linea se crea un objeto compartido persitente localmente, yo le di como nombre "salva", tu se lo puedes cambiar o lo abre si ya existe.
Ese objeto tiene un dato llamado "salto" con el valor de fotograma donde estaba al salir. Si se corre por primera vez ese dato no existe y se va al primer fotograma (linea 2)
Luego hay una función llamada "escribir" que constantemente mediante un intervalo le está asignando al valor de "salto" el de fotograma actual.
Al cerrar el swf. Automáticamente se escribe en el objeto el valor y cuando se vuelve a abrir se salta hacia donde estaba.
¿Qué te parece?
Tengo un .fla que hice de prueba. Te lo puedo facilitar si te interesa.
Jadso63
HOLA
Aquí el problema es que NO hay capítulos, es un película CONTINUA, solo cada cierto tiempo se habilita un botón para que le des pausa y/o continuar por si quieres descansar un rato, tienes que verlo TODO, y si lo lo viste TODO, poner que se vio todo, o si lo cerraste antes de terminar poner donde se quedo (f#otograma, porcentaje (por calculo))
y esto tengo que grabrarlo en la DB con el nombre del usuario y su avance
(esta en un servidor y uso asp.net).
PD: lo de la película CONTINUA ya esta hecho el diseño y NO LO PUEDO cambiar, solo tengo permiso de "arreglarlo" para poder identificar el avance.
Espero haberme explicado.
Y si tienes alguna prueba, (y con esto lo podrías ajustar a esto nuevo que explico) te lo agradecería
Que bueno que entraste en más detalles. Ahora tengo una idea más formada del problema.
En este estado de cosa la solución que te dí resuelve a medias. Aún puedes utilizar _currentFrame para saber en qué fotograma estaba cuando abandonó el tutorial. Como conoces el número total de fotogramas (1000) pues también calcular su por ciento:
Porciento= _currentframe/1000
El problema es salver en la Base de Datos esa información que debe estar acompañada o linkeada al nombre del usuario.
Bien, se cómo puedes hacerlo, pero hay un problema: No tengo experiencia en ASP, incluso no se si el Flash se comunica con script de servidor elaborados en ASP, me imagino que sí, porque al final dicho script lo que hace es escribir las avriables en la web y de allí las toma el flash, pero repito, jamás lo he hecho con ASP, siempre lo hago con PHP. Si tu servidor tiene montado los módulos de PHP y puede realizar consultas a la BD con MySQL te puedo dar entonces la solución. De todas maneras te advierto que debes tener los permidos necesarios (nombre del host, usuario, contraseña) así como conocer la estructura de la BD (nombre de la o las tablas en las que se va a leer y escribir). Ayudaría también que tuvieras conocimientos básicos en PHP, pero si no es así no importa, te escribiría el código lo más sencillo posible.
Si por un problema de licencia el servidor no admite otra cosa que no sea ASP.net (pudiera ser contrato con Microsoft, que solo admite SU .net) entonces lamentablemente no puedo ayudarte y lo sentiría muchísimo.
Respóndeme para saber... hasta pronto.
Jadaso63
[size= small; font-family: Times New Roman]Hola, ya vamos mejorando en aclarar el problema[/size]
[size= small; font-family: Times New Roman]No te preocupes del ASP.NET ( eso ya esta: hay DB,se el usuario,hay permisos, hay servidor, licenncia, etc)[/size]
[size= small; font-family: Times New Roman]Lo que necesito es el código para manejar el actionscript para sacar en que frame se quedo(ya me dijiste que con (_currentFrame), ¿Pero cómo pongo el código en el flash? En una función, al principio, ¿al final de la película?, ya trate de poner pero no me toma ningún evento y no puedo "pescar" ese valor.[/size]
[size= small; font-family: Times New Roman]tambien como pesco el evento si cierra el flash, no se pierde??, para tomar el frame donde se quedo y mandarlocomoparametros a un javascript(y aqui yo ya se como ligarlo al asp.net)[/size]
[size= small; font-family: Times New Roman]gracias nuevamente[/size]
[size= small; font-family: Times New Roman]y si pudieras mandarme tu ejemplo en flash para verlo y probarlo[/size]
No he podido encontrar ninguna manera de capturar el evento de cerrar el proyector, no obstante quiero que me permitas hacer algunas reflexiones sobre tu problema:
Evidentemente la solución es guardar el valor de _currentframe, y hacerlo constantemente, eso se logra asignándole su valor a otra variable y mediante la instrumentación de un intervalo con setInterval, si este intervalo se establece bien corto, 1 milisegundo por ejemplo, eso te garantiza saber por dónde estaba el usuario a la hora de cerrar. Solo hay que tener en cuenta que el _currentframe puede ser de cualquier clip, aunque me imagino que en tu caso estemos hablando de la linea de tiempo principal, la raíz, si no es así pues se modifica al efecto. Supongamos que dicha variable se llama "avance" y la hacemos global para no tener problemas estemos donde estemos quedaría entonces poner bien al principio:
aa = setInterval(capturar,1)
function capturar(){
 _global.avance = _currentframe}
Ahora ¿Cómo guardar ese valor para poder utilizarlo cuando se ejecute nuevamente la aplicación? Este es el verdadero problema.
En mi opinión tenemos dos situaciones:
1. Que no existen usuarios, es decir, alguien abre la aplicación, luego la cierra en determinado momento, cuando esa misma persona u otra cualquiera la abre se inicia donde se quedó. Pero no en función del usuario. Si es así la solución ya te la dí, que es mediante el uso de SharedObject
2. Que sí existen usuarios, y que en la BD se guarde el progreso de cada uno de ellos, por tanto al cerrar se debe de escribir enla BD el valor del progreso linkeado al usuario que cerró la aplicación. Si esta es la situación la cosa se complica pues para escribir en un servidor lo más profesional y lógico es tratar de conectarse y esperar respuesta. Esto no lo puede hacer SharedObject pues escribe localmente y de forma inmediata. Por tanto solo le veo, hasta ahora, la solución siguiente ¿Por qué no habilitar un botón que sea quien cierre la aplicación? (Con fscommand("quit")). Esto nos permitiría que antes de cerrar nos pudiéramos conectar con el servidor, esperar la respuesta y escribir en la base de datos. Para evitar que el usuario cierre el proyector de otra manera, pues lo pongo fullscreen (con fscommand("fullscreen", true). Pudiera suceder que mi swf forme parte de otra aplicación madre, entonces es mucho mejor, porque siempre hay una forma en que se sabe que el usuario quiere abandonar el soft o que llegó a un punto donde desea hacerlo (llegó ha determinado frame, transcurrió cierto tiempo, pulsó un botón, etc) entonces allí mismo se hace la conexión.
Un problema más complicado es si tu swf pertenece (como me imagino sucede) a una página web y no es una aplicación de escritorio. Imagínate, deseas entonces que cuando se cierre el navegador se escriba en la BD ! Eso no he visto que lo hace nadie! Siempre se pide al usuario que espere luego de pulsar un botón o algo, jamás se hace automáticamente al cerrar el explorador, por los problemas de conexión y la necesidad de esperar a ver si el servidor responde o no.
Conclusión:
1 - No hay personalización con usuarios: No hay problemas.
2 - Hay personalización con usuarios.
     2a- Es una aplicación de escritorio y se puede usar botón de cerrar: No hay problema.
     2b- Es una aplicación de escritorio y avanza por tramos: No hay problemas.
     2c- Es una aplicación de escritorio (.exe) pero se cierra al cerrar el proyector: No tengo solución. Lo siento.
3- El swf pertenece a una página web
    3d- Pertenece a una web y se puede cerrar con botón u otra cosa: No hay problemas.
    3d- Se quiere que salve al abandonar el navegador automáticamente: No tengo solución. I am sorry so much.
De todas maneras amigo ¿Pusiste la pregunta en el talón público? Recuerda que somos una comunidad. Si te llega algo te agradecería que me lo comunicaras, es algo en verdad interesante.
OK; gracias por el interés, seguiré buscando
PD: es una aplicación WEB y al terminar la película o al cerrar el navegador es cuando hay que grabar el avance
1) Si termina la película normalmente, ahí uso el fscommand, ya había checado esa parte
2) No puedo ponerle un botón para cerrar(no puedo modificar el diseño)
3) Si cierra el navegador ES EL GRAN PROBLEMA, ponerle hasta donde llego!
4) ¿Por ultimo me podrías mandar el ejemplo que hiciste haber que puedo exprimirle al código y complemnetar con lo que tengo?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas