Просмотр полной версии : как избавиться от вложенной функции
создаю типа видео галерею.. На данный момент код таков:
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?
Вынести функцию playv и переменную vid, из функции loadvideo?
vid это не переменная, эт вроде как экземпляр FLVPlayback, и создаются они в цикле. Если его выносить из функции loadvideo то также нужно создавать массив. И массив кнопок тоже соответственно. Мне так кажется, что можно использовать что-то типа
function playv(e:MouseEvent) //вынесенная вложенная функция
{
e.target.vid.play();
}
но почему-то это не срабатывает
Silicium
07.09.2011, 09:21
Не target, а currentTarget нужен
saikspaik
07.09.2011, 09:54
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 - это все-таки переменная.
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 минуты
Не 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();
Да, у меня там ошибка, нужно vid = new FLVPlayback();
сейчас ошибок нет, но при нажатии на любой батон проигрывается почему-то только последний файл
листинг целиком
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();
}
}
}
У вас 1 Объект FLVPlayback естественно будет 1 видео файл проигрываться
Добавлено через 2 минуты
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();
}
У вас 1 Объект FLVPlayback естественно будет 1 видео файл проигрываться
Добавлено через 2 минуты
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) тут
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();
}
}
}
Спасибо большое за подсказку! :)
Получилось заставить работать этот код путем исправления пары строчек:
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>;
Раз у вас все равно несколько объектов FLVPlayback то почему бы вам их не организовать в вектор/массив и обращаться к ним по индексу , при нажатии на кнопку мы знаем что эта нкопка привязана в Н-ному элементу массива , конструкция не особо правильная ,но в вашем случае с не одним FLVPlayback подходит
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.