Comunidad de diseño web y desarrollo en internet online

Problema con la precarga del tutorial

Citar            
MensajeEscrito el 09 Abr 2008 11:46 am
Hola,
Soy nuevo en AS3 y estoy haciendo una web que usa la precarga del tutorial. De momento tengo dos frames en la película. La precarga funciona bien, el problema viene cuando quiero acceder a los objetos del segundo fotograma. Parece que cuando ejecuta el código aun no están cargados (Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo). Aquí teneis el código que llevo de momento:

package {
//imports
import flash.display.*;
import flash.net.*;
import flash.text.*;
import flash.xml.*;
import flash.events.*;
import flash.geom.ColorTransform;
import flash.filters.*;
import caurina.transitions.Tweener;

import flash.events.*

public class main extends MovieClip {
/* main *********************************************************************/
public function main() {
stop();
configFile();
}
/* configFile ***************************************************************/
private function configFile() :void {
stage.quality = StageQuality.BEST;
stage.scaleMode = "noScale";
stage.showDefaultContextMenu = false;
preload();
}
/* startAnimation ***********************************************************/
private function startAnimation() :void {
//menu.visible = false;
}
/* messenger ****************************************************************/
private function messenger(msg: String) :void {
var request:URLRequest = new URLRequest("javascript:alert('"+ msg + "');");
navigateToURL(request, "_self");
}

/* window *******************************************************************/
private function window (url:String, wwidth: Number, wheight: Number) {
var request:URLRequest = new URLRequest("javascript:popUp('" + url + "', " + wwidth + ", " + wheight + ");");
navigateToURL(request, "_self");
}

/* preload ******************************************************************/
private function preload () :void {
var ldrFrame:Shape = new Shape();
var ldrBar:Shape = new Shape();

ldrFrame.graphics.lineStyle(1, 0x000000);
ldrFrame.graphics.drawRoundRect(0, 20, 100, 5, 0);
ldrBar.graphics.beginFill(0x9A3D1E);
ldrBar.graphics.drawRect(0, 20, 100, 5);
ldrBar.graphics.endFill();
ldrText.selectable = false;
ldrText.autoSize = TextFieldAutoSize.CENTER;
ldrText.y = stage.stageHeight / 2 - ldrText.height / 2;
ldrFrame.y = ldrBar.y = ldrText.y + 2;

addChild(ldrFrame);
addChild(ldrBar);

this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
this.loaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);

/*************************************************/
function onLoadProgress (event:ProgressEvent) :void {
var cargado:int = event.bytesLoaded / 1024;
var total:int = event.bytesTotal / 1024;
var porcentaje:int = cargado / total * 100;
ldrFrame.x = ldrBar.x = stage.stageWidth / 2 - ldrFrame.width / 2;
ldrText.text = "Cargados " + String(cargado) + "kb de " + String(total) + "kb";
ldrBar.width = porcentaje * ldrFrame.width / 100;
}

/*************************************************/
function onLoadComplete (event:Event) :void {
removeChild(ldrText);
removeChild(ldrFrame);
removeChild(ldrBar);
nextFrame();
startAnimation();
}
}
}//end class
}//end package

Espero que me podais ayudar. Gracias de antebrazo :P

Por sNk

1 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 09 Abr 2008 01:01 pm
Al moverte a un fotograma, el código de la línea de tiempo se ejecuta antes que la inicialización del contenido (pasa desde tiempos inmemoriales y había un notable artículo cuya URL no recuerdo) Esto es, tienes que hacer un pequeño delay antes de referirte a cosas que estén en el segundo fotograma, quizás largando un Timer para que invoque una función dentro de medio segundo o algo así.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Abr 2008 03:00 pm
OK, eso ya lo sabia pero antes en el IDE podias acceder a los objetos de ese frame aunque solo estuviesen en ese frame...

¿Serviria si en lugar de tener dos fotogramas alargase hasta 3 fotogramas y pusiese dos nextFrame();?

Gracias por la respuesta.

Por sNk

1 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 09 Abr 2008 04:35 pm
Nop, se trata de darle un retardo a las acciones, ej

Código :

gotoAndStop(1)
         camConf_btn.sel = true
         var t = setInterval(function(w) {
            w.camConf_btn.sel = true
            w.camConf_btn.gotoAndStop(2)
            w.micConf_btn.sel = false
            w.micConf_btn.gotoAndStop(1)
            for (var i:Number = 0; i < w.cameraList.length; i++) {
               w.cameraListCombo.addItem(w.cameraList[i])
            }
            w.cameraListCombo.addEventListener("change", Delegate.create(w, w.cameraSelection))
            
            clearInterval(t)
         }, 300, this)
         cameraSelection({})


Mas allá del contenido del script, uso un setInterval con un delay de 300 ms para inicializar todo, pasa una referencia al timeline porque el setInterval pierde el scope. Acá uso el setInterval de forma "autocontenida", es decir se autoborra. Pero esto es AS2, en AS3 puedes usar un timer con la misma idea y no tienes problemas de scope
Agregar más o menos fotogramas no hace diferencia

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Abr 2008 06:41 pm
Gracias por la ayuda Jorge.

Funcionar, funciona, pero... ¿no hay otra forma? es que esta no me gusta mucho, ¿es la forma oficial? Me refiero, has visto el resto del codigo, no hay nada que este mal? Quiza deberia hacer la precarga en otra clase o algo, no se... :?

Gracias de nuevo

Por sNk

1 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 09 Abr 2008 06:50 pm
No es la forma oficial, es la forma en que funciona Flash: ejecuta código desde la línea de tiempo más externa hacia adentro. Luego frente a eso, tu haces lo que quieras, hasta que alguien me cuente algo mejor, me quedo con esto

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.