PDA

Просмотр полной версии : Загрузка нескольких swf через XML и заброс ссылок на элементы в массив - пример?


Killer_13
09.12.2009, 01:40
Загрузка нескольких swf через XML и заброс ссылок на элементы в массив - соственно ищу пример, а то начал сам клепать, че т не оч выходит?

Пасиб.

bicubic_bublic
09.12.2009, 02:15
var loaded:Array = [];
public function loadMovie(url:String):void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMovieLoaded);
loader.load(new URLRequest(url));
}
public function onMovieLoaded(e:Event):void {
loaded.push((e.currentTarget as LoaderInfo).content);
}

Killer_13
09.12.2009, 02:37
Че т я неправильно делаю.. :(

Error #2044: Необработанный IOErrorEvent:. text=Error #2124: Неизвестный тип загруженного файла.

mov.xml в скобочках поставил вместо url
<?xml version="1.0"?>
<mover>
<mov id="1">
<datname>Soviet.swf</datname>
<autname>Сталин</autname>
<movname>Взрыв атомной бомбы Soviet</movname>
</mov>
<mov id="2">
<datname>Trinity.swf</datname>
<autname>Neo</autname>
<movname>Взрыв атомной бомбы Trinity</movname>
</mov>
<mov id="3">
<datname>Underwater.swf</datname>
<autname>Водная бомбочка</autname>
<movname>Взрыв атомной бомбы Underwater</movname>
</mov>
</mover>

немогу оттрасировать обращение к элементу массива...
function onMovieLoaded(e:Event):void {
loaded.push((e.currentTarget as LoaderInfo).content);
trace("Mov ID -> "+loaded[1]);
}

bicubic_bublic
09.12.2009, 02:45
trace("Mov ID -> ", loaded[loaded.length - 1]);

Killer_13
09.12.2009, 02:49
воть...
не идет..
package {

import flash.display.*;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.net.*;
import flash.events.*;
import flash.events.ProgressEvent;

public class VideoLoader extends Sprite {

private var loadStatus:TextField = new TextField();
public var loaded:Array = [];

public function VideoLoader(nr:int) {

trace("Mov1 -> "+nr);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMovieLoaded);
loader.load(new URLRequest("mov.xml"));

}

function onMovieLoaded(e:Event):void {

loaded.push((e.currentTarget as LoaderInfo).content);
trace("Mov ID -> ", loaded[loaded.length - 1]);
}
}
}

та же ошибка

bicubic_bublic
09.12.2009, 03:07
ладненько...
то что я выложил - это половина программы, отвечающая за загрузку одного мувиклипа - все что нужно было это загрузить xml и выдрав из него ссылки на мувики отправить их на функцию loadMovie

вот расширенный код.. для загрузки xml...

public function loadMoviesXML(xmlUrl:String):void {
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onMoviesXMLLoad);
loader.load(new URLRequest(xmlUrl));
}
private function onMoviesXMLLoad(e:Event):void {
var xmlData:XML = new XML((e.target as URLLoader).data);
var movies:XMLList = xmlData..datname;
for (var i:int = 0; i < movies.length(); i++) {
loadMovie(movies[i].toString());
}
}


останется только вызвать loadMoviesXML("mov.xml");

Killer_13
09.12.2009, 03:21
:( неизвесный метод "loadMovie"

bicubic_bublic
09.12.2009, 03:34
:( неизвесный метод "loadMovie"

да епрст...
package {

import flash.display.Sprite;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;

public class VideoLoader extends Sprite {

private var loadStatus:TextField = new TextField();
public var loaded:Array = [];

public function VideoLoader() {
loadMoviesXML("mov.xml");
}

public function loadMovie(url:String):void {
trace('Load new movie: ', url);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMovieLoaded);
loader.load(new URLRequest(url));
}

private function onMovieLoaded(e:Event):void {
loaded.push((e.currentTarget as LoaderInfo).content);
trace('Movie Loaded #', loaded.length, (e.currentTarget as LoaderInfo).content);
}

public function loadMoviesXML(xmlUrl:String):void {
trace('Load XML', xmlUrl);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onMoviesXMLLoad);
loader.load(new URLRequest(xmlUrl));
}

private function onMoviesXMLLoad(e:Event):void {
trace('XML loaded');
var xmlData:XML = new XML((e.target as URLLoader).data);
var movies:XMLList = xmlData..datname;
for (var i:int = 0; i < movies.length(); i++) {
loadMovie(movies[i].toString());
}
}
}
}

Killer_13
09.12.2009, 03:49
Ура! Пас! Работает.
Сейчас наверное глупый еще один вопрос задам...

Из другого класса хочу вызвать произвольное видео из массива.
соответственно создю экземпляр этого класса и обращаюсь к элементу массива, - потом ложу в контейнер, ... опять че т не так... :(

public var v:VideoLoader = new VideoLoader;
public var cVideo:Sprite = new Sprite();

public function Main(){

this.addChild(cVideo);
cVideo.addChild(v.loaded[1]);

cVideo.x = 160;
cVideo.y = 50;

}

bicubic_bublic
09.12.2009, 04:00
немного исправляем VideoLoader

public function VideoLoader () {
}
private function onMovieLoaded(e:Event):void {
loaded.push((e.currentTarget as LoaderInfo).content);
trace('Movie Loaded #', loaded.length, (e.currentTarget as LoaderInfo).content);
dispatchEvent(new Event(Event.COMPLETE)); // создаем событие на загрузку
}


в мейне:
public var v:VideoLoader = new VideoLoader;
public function Main(){
v.addEventListener(Event.COMPLETE, onVideoLoad); // подписываемся на созданное событие загрузки
v.loadMoviesXML("mov.xml");
}
private function onVideoLoad(e:Event):void {
v.removeEventListener(Event.COMPLETE, onVideoLoad);
var video:DisplayObject = v.loaded[0]; // массивы начинаются с ноля!
addChild(video);
video.x = 160;
video.y = 50;
}

Killer_13
09.12.2009, 04:12
почти получилось...

:(

Load XML mov.xml
XML loaded
Load new movie: Soviet.swf
Load new movie: Trinity.swf
Load new movie: Underwater.swf
Movie Loaded # 1 [object AVM1Movie]
ArgumentError: Error #2180: Недопустимо перемещать содержимое AVM1 (AS1 или AS2) в другую часть displayList после его загрузки в содержимое AVM2 (AS3).
at flash.display::DisplayObjectContainer/addChild()
at Main/onVideoLoad()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at VideoLoader/onMovieLoaded()
Movie Loaded # 2 [object AVM1Movie]
Movie Loaded # 3 [object AVM1Movie]

bicubic_bublic
09.12.2009, 04:25
...
проблема в том что вы пишите в AS3 а загружаемые флешки написаны в AS1 или AS2..
советую перекомпилить загружаемые в AS3

Killer_13
09.12.2009, 04:28
бррр, чуток не понял, или... точнее понял, но не совсем...
у меня 3 флешки, 3 видеофайла продолжытельностью где т по минуте..
которые я переконвертировал с avi в swf
мне кажется, что это не относится к ошибке.. :(

bicubic_bublic
09.12.2009, 04:40
ошибка в том что они скомпилированы в AS2 формате..
грубо говоря: В Publish Settings нужно указать ActionScript3

Killer_13
09.12.2009, 04:45
но при чем здесь флеш и его свойства публикации к видеофайлам, в настройках публикации и стоял ActionScript3.
Видео я конвертировал обычным конвертером "Tipard Video Converter", когда пробовал загружать без ХМЛ - по одиночке, то все прекрасно проигрывалось, правда я их совал в контейнер типа Sprite()

bicubic_bublic
09.12.2009, 12:11
а почему бы не переводить видео в flv ?

Killer_13
09.12.2009, 12:26
есть и flv, но насколько я понимаю этот загрузчик берет только swf файлы, сейчас попробую

Добавлено через 7 минут
при замене на flv добавляется ошибочка еще одна

Load XML mov.xml
XML loaded
Load new movie: Soviet.flv
Load new movie: Trinity.swf
Load new movie: Underwater.swf
Error #2044: Необработанный IOErrorEvent:. text=Error #2124: Неизвестный тип загруженного файла.
Movie Loaded # 1 [object AVM1Movie]
ArgumentError: Error #2180: Недопустимо перемещать содержимое AVM1 (AS1 или AS2) в другую часть displayList после его загрузки в содержимое AVM2 (AS3).
at flash.display::DisplayObjectContainer/addChild()
at Main/onVideoLoad()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at VideoLoader/onMovieLoaded()
Movie Loaded # 2 [object AVM1Movie]


Добавлено через 29 минут
исходник на Dropboxe (http://dl.************/u/1112309/Arr_xml.rar)

вот исходник, может подскажете че т еще... а то снилось мне это все сегодня, ответы на фруме разные, чесн слово, даже помню какие посты отписывали, как проблему решить, но все эт только сон.. и там правильных ответов небыло. :(

bicubic_bublic
09.12.2009, 16:24
чтобы избежать ошибки ArgumentError: Error #2180: Недопустимо перемещать содержимое AVM1 (AS1 или AS2) в другую часть displayList после его загрузки в содержимое AVM2 (AS3).
надо добавлять в массив не сами объекты AVM1Movie, а их лоадеры - соответственно:
private function onMovieLoaded(e:Event):void {
loaded.push((e.currentTarget as LoaderInfo).content.parent);
trace('Movie Loaded #', loaded.length, (e.currentTarget as LoaderInfo).content);
}
После этого можно swf'ки загружать
для загрузок же flv надо использовать другие методы и классы (не Loader, а flash.media.Video)

Killer_13
09.12.2009, 21:20
Компилируется без ошибок, типо все ок, но пока не ставит видео на stage :(
Не показывает. :(
вот мейн, может опять че т неправильно визываю? :(

main.as
package {

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import VideoLoader;
import XmlLoader;
import Buttons;

public class Main extends Sprite{

public var cButt:Sprite = new Sprite();
public var cVideo:Sprite = new Sprite();
public var v:VideoLoader = new VideoLoader;

var btn1:Buttons = new Buttons("Movie1fgh f f fg hgfhfg hgfh ");
var btn2:Buttons = new Buttons("Movie2");
var btn3:Buttons = new Buttons("Movie3");

public function Main(){


if(stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);

v.addEventListener(Event.COMPLETE, onVideoLoad); // подписываемся на созданное событие загрузки
v.loadMoviesXML("mov.xml");

}

private function onVideoLoad(e:Event):void {

v.removeEventListener(Event.COMPLETE, onVideoLoad);
var video:DisplayObject = v.loaded[1]; // массивы начинаются с ноля!
addChild(video);
video.x = 160;
video.y = 50;
}

private function init(e:Event = null):void {

removeEventListener(Event.ADDED_TO_STAGE, init);

this.addChild(cButt);
btn1.x = 15;
btn1.y = 50;
btn1.addEventListener(MouseEvent.CLICK, click);

btn2.x = 15;
btn2.y = 150;
btn2.addEventListener(MouseEvent.CLICK, click);

btn3.x = 15;
btn3.y = 250;
btn3.addEventListener(MouseEvent.CLICK, click);

cButt.addChild(btn1);
cButt.addChild(btn2);
cButt.addChild(btn3);

}

private function click(event:MouseEvent):void {

switch (event.target){

case btn1:
var v1:VideoLoader = new VideoLoader;
break;

case btn2:
var v2:VideoLoader = new VideoLoader;
break;

case btn3:
var v3:VideoLoader = new VideoLoader;
break;

}
}

}
}

VideoLoader.as
package {

import flash.display.Sprite;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.text.*;

public class VideoLoader extends Sprite {

private var loadStatus:TextField = new TextField();
public var loaded:Array = [];

public function VideoLoader () {
}

private function onMovieLoaded(e:Event):void {
loaded.push((e.currentTarget as LoaderInfo).content.parent);
trace('Movie Loaded #', loaded.length, (e.currentTarget as LoaderInfo).content);
}

public function loadMovie(url:String):void {
trace('Load new movie: ', url);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMovieLoaded);
loader.load(new URLRequest(url));
}

public function loadMoviesXML(xmlUrl:String):void {
trace('Load XML', xmlUrl);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onMoviesXMLLoad);
loader.load(new URLRequest(xmlUrl));
}

private function onMoviesXMLLoad(e:Event):void {
trace('XML loaded');
var xmlData:XML = new XML((e.target as URLLoader).data);
var movies:XMLList = xmlData..datname;
for (var i:int = 0; i < movies.length(); i++) {
loadMovie(movies[i].toString());
}
}
}
}


Добавлено через 2 часа 35 минут
Думаю, нашел почему не работает, но незнаю как исправить.. :(
Подскажите...

Из мейна в публик функции не визывается собитие
v.addEventListener(Event.COMPLETE, onVideoLoad); // подписываемся на созданное событие загрузки

в функцию onVideoLoad обработчик события не заходит. :(

вот кусочек кода мейн..

package {

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import VideoLoader;
import XmlLoader;
import Buttons;

public class Main extends Sprite{

public var cButt:Sprite = new Sprite();
public var cVideo:Sprite = new Sprite();
public var v:VideoLoader = new VideoLoader;

var btn1:Buttons = new Buttons("Movie1fgh f f fg hgfhfg hgfh ");
var btn2:Buttons = new Buttons("Movie2");
var btn3:Buttons = new Buttons("Movie3");

public function Main(){


if(stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);

v.addEventListener(Event.COMPLETE, onVideoLoad); // подписываемся на созданное событие загрузки
v.loadMoviesXML("mov.xml");

}

function onVideoLoad(e:Event):void {
trace("1->>>>");
v.removeEventListener(Event.COMPLETE, onVideoLoad);
var video:Sprite = v.loaded[1]; // массивы начинаются с ноля!
trace("1->>>>"+v.loaded[1]);
addChild(video);
video.x = 160;
video.y = 50;
}

Пасибо.

bicubic_bublic
10.12.2009, 04:13
ошибка в том что вы это событие забыли вызвать..
в классе VideoLoader метод:

private function onMovieLoaded(e:Event):void {
loaded.push((e.currentTarget as LoaderInfo).content.parent); // parent для AVM1
trace('Movie Loaded #', loaded.length, (e.currentTarget as LoaderInfo).content);
dispatchEvent(new Event(Event.COMPLETE)); // создаем событие на загрузку
}

Killer_13
10.12.2009, 04:20
осталась та же ситуация.. :(

11->>>>undefined
Load XML mov.xml
XML loaded
Load new movie: Soviet.swf
Load new movie: Trinity.swf
Load new movie: Underwater.swf
Movie Loaded # 1 [object AVM1Movie]
1загружаемый обьект->>>>[object Loader]
TypeError: Error #2007: Параметр child не должен быть равен нулю.
at flash.display::DisplayObjectContainer/addChild()
at Main/onVideoLoad()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at VideoLoader/onMovieLoaded()


Добавлено через 21 час 8 минут
Хммм, - неужели никто не сталкивался с такой ошибкой? :(

11->>>>undefined
Load XML mov.xml
XML loaded
Load new movie: Soviet.swf
Load new movie: Trinity.swf
Load new movie: Underwater.swf
Movie Loaded # 1 [object AVM1Movie]
1загружаемый обьект->>>>[object Loader]
TypeError: Error #2007: Параметр child не должен быть равен нулю.
at flash.display::DisplayObjectContainer/addChild()
at Main/onVideoLoad()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at VideoLoader/onMovieLoaded()

Мне кажется ее решение здесь, - но незнаю как исправить, - все грузится, - немогу на stage закинуть!!! :( Хелп...

private function onVideoLoad(e:Event):void {

v.removeEventListener(Event.COMPLETE, onVideoLoad);
var video:DisplayObject = v.loaded[1]; // массивы начинаются с ноля!
addChild(video);
video.x = 160;
video.y = 50;
}