Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как избавиться от вложенной функции (http://www.flasher.ru/forum/showthread.php?t=166992)

teion 07.09.2011 08:28

как избавиться от вложенной функции
 
создаю типа видео галерею.. На данный момент код таков:

Код AS1/AS2:

                public function videoload()
                {
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(e:Event):void
                {
                        loadvideo();
                }
 
 
                function loadvideo()
                {
                        if (countarray < videoarray.length)//countarray просто счетчик
                        {
                                var vid:FLVPlayback = new FLVPlayback();
                                vid.autoPlay = false;
                                vid.source = videoarray[countarray];
                                //vid.x = xload;
                                var btnplay:MovieClip = new btn();//добавляю кнопку play
                                //btnplay.x = xload;
                                btnplay.addEventListener(MouseEvent.CLICK, playv);
                                addChild(vid);
                                addChild(btnplay);
                                //trace(xload);
                                //xload = xload + 320;
                                countarray++;
                                trace("loadvideo");
                                loadvideo();
                                function playv(e:MouseEvent) //вложенная функция
                                {
                                        vid.play();
                                }
                        }
 
                }
 
        }

имеется вложенная функция playv, умом понимаю, что это не гуд, но вот как избавиться от неё понять не могу.. Может кто помочь?

saikspaik 07.09.2011 08:50

Вынести функцию playv и переменную vid, из функции loadvideo?

teion 07.09.2011 09:18

Цитата:

Сообщение от saikspaik (Сообщение 1029034)
Вынести функцию playv и переменную vid, из функции loadvideo?

vid это не переменная, эт вроде как экземпляр FLVPlayback, и создаются они в цикле. Если его выносить из функции loadvideo то также нужно создавать массив. И массив кнопок тоже соответственно. Мне так кажется, что можно использовать что-то типа

Код AS3:

function playv(e:MouseEvent) //вынесенная вложенная функция
                                {
                                        e.target.vid.play();
                                }

но почему-то это не срабатывает

Silicium 07.09.2011 09:21

Не target, а currentTarget нужен

saikspaik 07.09.2011 09:54

Код AS3:

public function videoload()
                {
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(e:Event):void
                {
                        loadvideo();
                }
 
                var vid:FLVPlayback;
 
                function loadvideo()
                {
                        if (countarray < videoarray.length)//countarray просто счетчик
                        {
                                vid = new FLVPlayback();
                                vid.autoPlay = false;
                                vid.source = videoarray[countarray];
                                //vid.x = xload;
                                var btnplay:MovieClip = new btn();//добавляю кнопку play
                                //btnplay.x = xload;
                                btnplay.addEventListener(MouseEvent.CLICK, playv);
                                addChild(vid);
                                addChild(btnplay);
                                //trace(xload);
                                //xload = xload + 320;
                                countarray++;
                                trace("loadvideo");
                                loadvideo();
 
                        }
 
                }
 
                function playv(e:MouseEvent) //не вложенная функция
                {
                        vid.play();
                }
 
        }

Вот так все должно работать.
P.S. vid - это все-таки переменная.

teion 07.09.2011 10:01

Цитата:

Сообщение от saikspaik (Сообщение 1029044)
Код AS3:

public function videoload()
                {
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(e:Event):void
                {
                        loadvideo();
                }
 
                var vid:FLVPlayback;
 
                function loadvideo()
                {
                        if (countarray < videoarray.length)//countarray просто счетчик
                        {
                                vid = FLVPlayback();
                                vid.autoPlay = false;
                                vid.source = videoarray[countarray];
                                //vid.x = xload;
                                var btnplay:MovieClip = new btn();//добавляю кнопку play
                                //btnplay.x = xload;
                                btnplay.addEventListener(MouseEvent.CLICK, playv);
                                addChild(vid);
                                addChild(btnplay);
                                //trace(xload);
                                //xload = xload + 320;
                                countarray++;
                                trace("loadvideo");
                                loadvideo();
 
                        }
 
                }
 
                function playv(e:MouseEvent) //не вложенная функция
                {
                        vid.play();
                }
 
        }

Вот так все должно работать.
P.S. vid - это все-таки переменная.

ругается на строчку - vid = FLVPlayback();
Код:

videoload.as, Line 50        1136: Incorrect number of arguments.  Expected 1.
Добавлено через 3 минуты
Цитата:

Сообщение от Silicium (Сообщение 1029041)
Не target, а currentTarget нужен

e.currentTarget.vid.play();
ошибка TypeError: Error #1010: A term is undefined and has no properties.
at videoload/playv()

saikspaik 07.09.2011 10:15

Да, у меня там ошибка, нужно vid = new FLVPlayback();

teion 07.09.2011 10:32

Цитата:

Сообщение от saikspaik (Сообщение 1029048)
Да, у меня там ошибка, нужно vid = new FLVPlayback();

сейчас ошибок нет, но при нажатии на любой батон проигрывается почему-то только последний файл

листинг целиком
Код AS3:

package 
{
 
        import flash.display.MovieClip;
        import flash.display.Loader;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.display.LoaderInfo;
        import flash.display.Stage;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.display.StageDisplayState;
        import flash.events.MouseEvent;
        import fl.video.*;
 
 
        public class videoload extends MovieClip
        {
                var videoarray:Array = new Array("tema1.flv","tema2.flv","tema3.flv");
                var countarray:uint = 0;
                var xload:Number = 0;
                var vid:FLVPlayback;
 
                public function videoload()
                {
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(e:Event):void
                {
                        stage.scaleMode = StageScaleMode.SHOW_ALL;
                        stage.displayState = StageDisplayState.FULL_SCREEN;
                        stage.align = StageAlign.TOP_LEFT;
                        loadvideo();
                }
 
 
                function loadvideo()
                {
                        if (countarray < videoarray.length)
                        {
                                vid = new FLVPlayback();
                                vid.autoPlay = false;
                                vid.source = videoarray[countarray];
                                vid.x = xload;
                                var btnplay:MovieClip = new btn();
                                btnplay.x = xload;
                                btnplay.addEventListener(MouseEvent.CLICK, playv);
                                addChild(vid);
                                addChild(btnplay);
                                trace(xload);
                                xload = xload + 320;
                                countarray++;
                                trace("loadvideo");
                                loadvideo();
 
                        }
 
                }
                function playv(e:MouseEvent)
                                {
                                        vid.play();
                                }
 
        }
 
}


Genzo 07.09.2011 10:45

У вас 1 Объект FLVPlayback естественно будет 1 видео файл проигрываться

Добавлено через 2 минуты
Код AS3:

function loadvideo()
                {
                        if (countarray < videoarray.length)
                        {
 
                                var btnplay:MovieClip = new btn();
                                btnplay.x = xload;
                                btnplay.addEventListener(MouseEvent.CLICK, playv);
                                btnplay.name = countarray;
                                addChild(btnplay);
                                trace(xload);
                                xload = xload + 320;
                                countarray++;
                                trace("loadvideo");
                                loadvideo();
 
                        }
 
                }
                function playv(e:MouseEvent)
                                {
                                        var index:uint = uint(e.currentTarget.name);
                                        vid = new FLVPlayback();
                                        vid.autoPlay = false;
                                        vid.source = videoarray[index];
                                        vid.x = xload;
                                        vid.play();
                                }


teion 07.09.2011 14:40

Цитата:

Сообщение от Genzo (Сообщение 1029052)
У вас 1 Объект FLVPlayback естественно будет 1 видео файл проигрываться

Добавлено через 2 минуты
Код AS3:

function loadvideo()
                {
                        if (countarray < videoarray.length)
                        {
 
                                var btnplay:MovieClip = new btn();
                                btnplay.x = xload;
                                btnplay.addEventListener(MouseEvent.CLICK, playv);
                                btnplay.name = countarray;
                                addChild(btnplay);
                                trace(xload);
                                xload = xload + 320;
                                countarray++;
                                trace("loadvideo");
                                loadvideo();
 
                        }
 
                }
                function playv(e:MouseEvent)
                                {
                                        var index:uint = uint(e.currentTarget.name);
                                        vid = new FLVPlayback();
                                        vid.autoPlay = false;
                                        vid.source = videoarray[index];
                                        vid.x = xload;
                                        vid.play();
                                }


Не, немного не то, что нужно.. в данном варианте экземпляр проигрывателя создается в момент нажатия на кнопку.. А нужно, чтоб они все были сразу на сцене

кстати, нету строчки addChild(vid) тут

Genzo 07.09.2011 14:51

Код AS3:

package 
{
 
        import flash.display.MovieClip;
        import flash.display.Loader;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.display.LoaderInfo;
        import flash.display.Stage;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.display.StageDisplayState;
        import flash.events.MouseEvent;
        import fl.video.*;
 
 
        public class videoload extends MovieClip
        {
                var videoarray:Array = new Array("tema1.flv","tema2.flv","tema3.flv");
                var countarray:uint = 0;
                var xload:Number = 0;
                var vid:Vector.<FLVPlayback>;
 
                public function videoload()
                {
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(e:Event):void
                {
                        vid = new Vector.<FLVPlayback>();
                        stage.scaleMode = StageScaleMode.SHOW_ALL;
                        stage.displayState = StageDisplayState.FULL_SCREEN;
                        stage.align = StageAlign.TOP_LEFT;
                        loadvideo();
                }
 
 
                function loadvideo()
                {
                        if (countarray < videoarray.length)
                        {
                                vidO = new FLVPlayback();
                                vidO.autoPlay = false;
                                vidO.source = videoarray[countarray];
                                vidO.x = xload;
                                var btnplay:MovieClip = new btn();
                                btnplay.x = xload;
                                btnplay.addEventListener(MouseEvent.CLICK, playv);
                                btnplay.name = countarray;
                                addChild(vidO);
                                vid.push(vidO);
                                addChild(btnplay);
                                trace(xload);
                                xload = xload + 320;
                                countarray++;
                                trace("loadvideo");
                                loadvideo();
 
                        }
 
                }
                function playv(e:MouseEvent)
                                {
                                        var index:uint = uint(e.currentTarget.name);
                                        var vidO = vid[index];
                                        vidO.play();
                                }
 
        }
 
}


teion 08.09.2011 08:25

Спасибо большое за подсказку! :)
Получилось заставить работать этот код путем исправления пары строчек:
Код AS3:

package 
{
 
        import flash.display.MovieClip;
        import flash.display.Loader;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.display.LoaderInfo;
        import flash.display.Stage;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.display.StageDisplayState;
        import flash.events.MouseEvent;
        import fl.video.*;
 
 
        public class videoload extends MovieClip
        {
                var videoarray:Array = new Array("tema1.flv","tema2.flv","tema3.flv");
                var countarray:uint = 0;
                var xload:Number = 0;
                var vid:Vector.<FLVPlayback>;
 
                public function videoload()
                {
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(e:Event):void
                {
                        vid = new Vector.<FLVPlayback>();
                        stage.scaleMode = StageScaleMode.SHOW_ALL;
                        stage.displayState = StageDisplayState.FULL_SCREEN;
                        stage.align = StageAlign.TOP_LEFT;
                        loadvideo();
                }
 
 
                function loadvideo()
                {
                        if (countarray < videoarray.length)
                        {
                                var vidO:FLVPlayback = new FLVPlayback();
                                vidO.autoPlay = false;
                                vidO.source = videoarray[countarray];
                                vidO.x = xload;
                                var btnplay:MovieClip = new btn();
                                btnplay.x = xload;
                                btnplay.addEventListener(MouseEvent.CLICK, playv);
                                btnplay.name = String(countarray);
                                addChild(vidO);
                                vid.push(vidO);
                                addChild(btnplay);
                                trace(xload);
                                xload = xload + 320;
                                countarray++;
                                trace("loadvideo");
                                loadvideo();
 
                        }
 
                }
                function playv(e:MouseEvent)
                                {
                                        var index:uint = uint(e.currentTarget.name);
                                        var vidO = vid[index];
                                        vidO.play();
                                }
 
        }
 
}

Только вот хотелось бы еще получить объяснение логики данного решения.. Хотя бы в двух словах :) Например, в первый раз встречаю такую конструкцию Vector.<FLVPlayback>;

Genzo 08.09.2011 10:53

Раз у вас все равно несколько объектов FLVPlayback то почему бы вам их не организовать в вектор/массив и обращаться к ним по индексу , при нажатии на кнопку мы знаем что эта нкопка привязана в Н-ному элементу массива , конструкция не особо правильная ,но в вашем случае с не одним FLVPlayback подходит

teion 08.09.2011 10:59

ясно. Спасибо


Часовой пояс GMT +4, время: 13:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.