PDA

Просмотр полной версии : как избавиться от вложенной функции


teion
07.09.2011, 08:28
создаю типа видео галерею.. На данный момент код таков:

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
Вынести функцию 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 - это все-таки переменная.

teion
07.09.2011, 10:01
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();

teion
07.09.2011, 10:32
Да, у меня там ошибка, нужно 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();
}

}

}

Genzo
07.09.2011, 10:45
У вас 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();
}

teion
07.09.2011, 14:40
У вас 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) тут

Genzo
07.09.2011, 14:51
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
Спасибо большое за подсказку! :)
Получилось заставить работать этот код путем исправления пары строчек:
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
ясно. Спасибо