flash - Cómo crear Preloader en AS3
actionscript-3 flash-builder (5)
Aquí está el artículo sobre cómo crear el preloader Embedded As3 http://www.kirupa.com/forum/showthread.php?351689-actionscript-preloader-in-flash-develop
Mis aplicaciones flash son un poco grandes, así que quiero insertar un preloader en mi aplicación. ¿Puede alguien decirme cómo crear un preloader en una nueva ''Escena'' y cargar otra escena después de completar la precarga?
¡Gracias por adelantado!
Recomiendo ir a la ruta "swf ligero carga un swf pesado", ya que es el más eficiente que he visto. Hay infinidad de tutoriales inflados, pero a mí me gusta este http://doogog.com/actionscript-3-external-preloader.html. Va directamente al grano.
También puede usar una biblioteca de terceros como Greensock para precargar ambos antes del inicio de la aplicación y mientras se cargan los archivos de la aplicación.
Yo personalmente uso Greensock y lo recomiendo. Resuelve algunos errores con la clase loaderInfo.
[Frame (factoryClass = ''Preloader'')] ya no funciona en el nuevo compilador ASC 2.0. En su lugar, el precargador se convierte en su clase de documento, y necesita agregar un argumento de compilación adicional para decirle a flash que incluya su clase principal en el segundo marco (no lo haga referencia en el preloader):
-frame = NameDoesntMatter, Main
¿ASC 2.0 reconoce las etiquetas de metadatos [Frame] (por ejemplo, para Preloader factoryClass)?
Actualizar:
Opción 1. Flash IDE, un archivo swf
Para tener un preloader incorporado al compilar con Flash IDE, debe mover su código de Document Class
al segundo marco de su archivo FLA (sin el constructor de paquete y clase, por supuesto), y eliminar el archivo .as de Document Class
de las propiedades del proyecto. En el primer cuadro, debe colocar dicho código:
stop(); // stops the timeline at preloader frame
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
function onProgress(e:ProgressEvent):void {
var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
//additional code to update preloader graphics
//..
if (percent == 100) onLoaded();
}
function onLoaded() {
this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
nextFrame();
}
Una vez que se carga swf, avanza al siguiente cuadro y se debe ejecutar el código de inicialización de la aplicación original. Esto funciona bien si organizó su proyecto de forma que la mayoría de los activos (imágenes, etc.) se encuentran en la Biblioteca Flash IDE y no se cargan en el primer cuadro (puede verificarlo en las propiedades de cada elemento de la biblioteca).
Opción 2. Flash IDE, dos archivos swf
Otra opción, como ya lo recomendó otro comentarista, es mantener su aplicación como está, y crear otro swf liviano que cargue el primero. El código de preloader.swf en el primer fotograma:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
loader.load(new URLRequest("path/to/application.swf"));
function onProgress(e:ProgressEvent):void
{
var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
//additional code to update preloader graphics
//..
if (percent == 100) onLoaded();
}
function onLoaded():void
{
loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
var application:DisplayObject = loader.content;
addChild(application);
}
A veces hay problemas adicionales con este enfoque, cuando intenta acceder a la stage
desde su Document Class constructor
, etc., pero para la mayoría de los casos esto debería hacer el trabajo.
Opción 3. IDE diferente, mi recomendación: FlashDevelop
Si trataste de compilar mi código originalmente publicado con FlashDevelop, Flash Builder o cualquier otro IDE, debería funcionar.
Publicación original:
Aquí hay una configuración básica para un preloader incorporado. Su Document Class
debería verse así:
package {
import flash.display.Sprite;
[Frame(factoryClass=''Preloader'')] //class name of your preloader
public class Main extends Sprite {
public function Main() {
//init
}
}
}
Clase de preloader:
package {
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.ProgressEvent;
import flash.utils.getDefinitionByName;
public class Preloader extends MovieClip {
public function Preloader()
{
//add preloader graphics
//check loading progress
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
}
private function onProgress(e:ProgressEvent):void
{
var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
if (percent == 100)
{
this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
onLoaded();
}
}
private function onLoaded():void
{
nextFrame(); //go to next frame
var App:Class = getDefinitionByName("Main") as Class; //class of your app
addChild(new App() as DisplayObject);
}
}
}