Проблема получения переменных из класса и передачи ссылки на этот класс - PullRequest
0 голосов
/ 21 января 2010

еще раз меня мучает страшная ошибка Flash: Не удается получить доступ к свойству или методу .

Я создаю новый видеоплеер, и мне нужно отправить полную ширину моего индикатора выполнения (созданного в PlayerControls.as) в мой класс VideoPlayer.as. А также контролировать ширину индикатора выполнения из функции обновления внутри моего класса VideoPlayer.as.

Я не могу получить эти значения в своем классе VideoPlayer, мне интересно, имеет ли это какое-либо отношение к порядку, в котором я вызываю эти классы в моем классе Document:

Класс документа

package {
    // IMPORTS

    public class TEN extends Global {

        //private consts
        //private vars

        public function TEN():void {
            if (stage) {
                init();
            } else {
                addEventListener(Event.ADDED_TO_STAGE,init);
            }
        }

        private function init(e:Event=null):void {
            removeEventListener(Event.ADDED_TO_STAGE,init);
            // Using the BulkLoader class to phrase XML
        }

        private function onBulkLoadComplete(e:Event):void {
            trace("[BulkLoader] COMPLETE"+"\r");

            Global.xml=loader.getXML("xmldata");
            // I get XML values
            // XML info goes into ARRAYS here

            drawBackground();
            drawVideo();
            drawControls();
        }
        // Background.as
        private function drawBackground():void {
            trace("\r"+"          drawBackground();");
            trace("------------------------------");
            bg=new Background  ;
            bg.drawBackground(globalWidth,globalHeight,firstTitle);
            stage.addChild(bg);
        }
        // VideoDisplay.as
        private function drawVideo():void {
            trace("\r"+"          drawVideo();");
            trace("------------------------------");
            vd=new VideoDisplay  ;
            vd.drawVideo(globalWidth,globalHeight,videoName,videoHDiff,limeLight);
            vd.x=videoX;
            vd.y=videoY;
            stage.addChild(vd);
        }
        // PlayerControls.as
        private function drawControls():void {
            trace("\r"+"          drawControls();");
            trace("------------------------------");
            pc=new PlayerControls  ;
            pc.drawControls(globalWidth,globalHeight,HEX,specialCheck,specialText,specialUrl);
            pc.x=videoX;
            pc.y=controlsY;
            pc.addEventListener("onPlay",vd.playVideo);
            pc.addEventListener("onPause",vd.pauseVideo);
            stage.addChild(pc);
        }

        private function onBulkLoadProgress(e:BulkProgressEvent):void {

            //trace(e.weightPercent);
        }
    }
}

PlayerControls.as

package src.ui
{
    // IMPORTS

    public class PlayerControls extends MovieClip
    {
        // private consts
        // private vars

        public var progressBar:MovieClip;
        public var progressTotalW;

        public function PlayerControls():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {            
            removeEventListener(Event.ADDED_TO_STAGE, init);
        }

        public function drawControls(w, h, color, specialCheck, extraTxt, extraLink):void
        {           
            // SET VALUES w,h,color, etc...

            vd = new VideoDisplay(); // <-- VideoDisplay Class

            // I create graphics

            // I add graphics


            createSpecialBtn(); // Create special button
        }

        // Create Special Button ·······································
        public function createSpecialBtn():void
        {
            // other code
            fullscreenCreate(btn_SpecialW); // Create FullScreen Button
        }

        // Create Fullscreen Button ·····································
        public function fullscreenCreate(extraW):void
        {
            // other code
            createSoundBtn(btn_Fullx); // Create Sound Button
        }

        // Create Sound Button ·····································
        public function createSoundBtn(xSpacer):void
        {
            // other code           
            createTimeCounter(timeCountX); // Create Time Clock
        }

        // Create Time Count ·····································
        public function createTimeCounter(spaceX):void
        {           
            // other code           
            createGroove(); // Create progress bar background
        }

        // Create Groove Bar ············································
        public function createGroove():void
        {
            // Here we go!
            groove       = new Groove();
            groove.width = grooveW;
            groove.x     = grooveX;
            groove.y     = grooveY;


            progressTotalW = grooveW;
            //trace("grooveW = "+grooveW);
            //trace("progressTotalW = "+progressTotalW);

            vd.setProgressW(progressTotalW);

            createProgress();
        }

        // Create Progress Bar ··········································
        public function createProgress():void
        {
            progressBar       = new ProgBar;
            TweenLite.to(progressBar, .1, {tint:xmlColor});
            progressBar.x     = grooveX;
            progressBar.y     = grooveY;
            progressBar.width = 1;

            //trace("progressBar.x = "+progressBar.x);
            //trace("progressBar.y = "+progressBar.y);

            controls.addChild(groove);
            controls.addChild(progressBar);
        }

        // BUTTON EVENTS here

    }

}

VideoDisplay.as

package src.display
{
    // IMPORTS

    public class VideoDisplay extends PlayerControls
    {
        // Variables...
        private var pc:PlayerControls;

        public function VideoDisplay():void
        {
            this.addEventListener(Event.ADDED_TO_STAGE, stageListens);
        }

        //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ NetStream Check
        private function netStatusHandler(event:NetStatusEvent):void {

            switch (event.info.code) {
                //case "NetConnection.Connect.Success": ... etc
            }
        }

        //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Error Handling
        private function asyncErrorHandler(event:AsyncErrorEvent):void {trace(event.text);}
        private function onBWDone(...args):void {}
        private function onXMPData(infoObject:Object):void {}

        //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Declare MetaData     
        function getMetaData(client_ns) {
            // Meta data
        }

        // ☼ --------------------------------------------------------------------------------- Connect to Stream
        public function connectStream():void 
        {   
            // NetStream code
        }

        public function drawVideo(w, h, flvUrl, minusHeight, LL):void
        {
            sizeW     = w;
            sizeH     = h;
            flvSource = flvUrl;
            appName   = LL;

            pc        = new PlayerControls();  // <- PlayerControls.as

            // RTMP - ns - nc CODE

            // draw graphics

            // Timer
            tmrDisplay = new Timer(DISPLAY_DELAY);
            tmrDisplay.addEventListener(TimerEvent.TIMER, updateDisplay); // <--

            // addChilds
        }

        public function playVideo(e:CustomEvent = null):void
        {
            // play function
        }

        public function pauseVideo(e:CustomEvent = null):void
        {
            // pause function
        }

        // Getter & Setter
        public function setProgressW(setMe):void
        {
            progressTotalW = setMe;
            ajoyTest = setMe;
            trace("Getter & Setter - progressTotalW = "+progressTotalW);

            /*tmrDisplay = new Timer(DISPLAY_DELAY);
            tmrDisplay.addEventListener(TimerEvent.TIMER, updateDisplay);*/
        }

        private function updateDisplay(e:TimerEvent):void
        {
            //trace("ns.time * 287 / videoDuration = "+(ns.time * 287 / videoDuration));
            //pc.progressBar.width = ns.time * pc.progressTotalW / videoDuration;
            //trace("ns.time = "+ns.time);
            //trace("videoDuration = "+videoDuration);
            trace("ajoyTest = "+ajoyTest);
            trace("progressTotalW = "+progressTotalW);
        }

        // Other functions

    }

}

^ по какой-то причине я не могу настроить таргетинг на progressBar.width внутри PlayerControls.as

Ответы [ 4 ]

1 голос
/ 21 января 2010

Попробуйте изменить эти две строки и посмотрите, поможет ли это вам.

pc.addEventListener("onPlay",vd.playVideo);
pc.addEventListener("onPause",vd.pauseVideo);

до

pc.addEventListener("onPlay",function(e) { vd.playVideo() });
pc.addEventListener("onPause",function(e) { vd.pauseVideo() });
1 голос
/ 21 января 2010

Где вы на самом деле передаете ссылку на PlayerControls на VideoDisplay? Насколько я могу судить по вашему коду, ваш нет. Вы должны установить это, прежде чем пытаться получить к нему доступ.

так что-то вроде:

myVideoDisplay.pc = myPlayerControls

возможно, я просто что-то упускаю, хотя ...

1 голос
/ 21 января 2010

Вы создаете экземпляры VideoDisplay и PlayerControls в DocuementClass. Это хорошо. Но если вы не передадите ссылку на объект PlayerControls "pc" в класс VideoControls, то класс ViedoControls не сможет узнать, что делать с pc. Вам нужно опубликовать больше кода, чтобы показать порядок запуска методов drawVideo и drawControls.

Возможно, вам нужно что-то вроде в вашем классе документов:

drawVideo();
drawControls();
vd.playerControls = pc;
pc.videoDisaply = vd;

Затем измените

private var pc:PlayerControls;
to
public var playerControls:PlayerConrols;

И, конечно, изменить

pc.progressBar.width = ns.time * pc.progressTotalW / videoDuration;
to
playerControls.progressBar.width = ns.time * playerControls.progressTotalW / videoDuration;

Те же изменения, что и для VideoDisplay. Измените на public var, измените имя и измените ссылки с именем vd. Причина, по которой я предлагаю изменить имена переменных внутри классов VideoDisplay и PlayerControls, заключается в том, что мне это кажется ужасным:

vd.pc = pc
pc.vd = vd

Да, это твоя проблема. Когда у вас есть

pc=new PlayerControls;

в вашем DocumentClass вы создаете новый экземпляр PlayerControls и сохраняете его как pc в DocuemntClass. Таким образом, если вы спросите DocumentClass, что такое ПК, он скажет: «Это экземпляр PlayerControls, который я сохранил».

Затем в VideoDisplay вы делаете то же самое

 pc        = new PlayerControls();  // <- PlayerControls.as

Это НЕ ссылается на тот же PlayerControls DocumentClass, который есть. Вы говорите, создайте новый экземпляр PlayerControls и сохраните его в VideoDisplay. Теперь это два разных экземпляра. Решение, которое я написал выше, должно работать для вас.

1 голос
/ 21 января 2010

Попробуйте изменить порядок, в котором вы звоните addChild и progressBar.width. Также убедитесь, что PlayerControls добавлены на сцену при вызове createProgress.

UPDATE

Извините, я неправильно понял проблему. Так что эта линия вызывает горе

pc.progressBar.width = ns.time * pc.progressTotalW / videoDuration;

Порядок, в котором у вас есть перечисленные функции, не имеет значения, но порядок, в котором вы их вызываете. Я думаю, что проблема в вашем Timer. Я не вижу кода, который его выполняет, но я предполагаю, что первая отправка события из Timer в VideoDisplay происходит до того, как будет создан PlayerControls, или до того, как будет создан progressBar внутри PlayerControls.

Если это не решит проблему, вы можете опубликовать код как для порядка вызова функций init (drawVideo, drawControls), так и для конструкторов для этих классов и кода инициализации Timer. Из того, что у тебя там, я не могу сказать больше, потому что не могу выработать поток управления.

...