Просмотр полной версии : Флеш альбом
Ребята, помогите, пожалуйста, найти и исправить ошибку! Делаю флеш-альбом с перелистыванием страниц с использованием xml. Вот код подключения и использования xml файла:
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.Loader;
var xmlLoader:URLLoader = new URLLoader(new URLRequest("xml/my.xml"));
var xmlData:XML;
var xmlList:XMLList;
var picLoader:Loader;
xmlLoader.addEventListener(Event.COMPLETE, getXML);
function getXML(e:Event):void
{
trace("загрузился");
xmlData = XML(e.target.data);
trace(xmlData);
xmlList = xmlData.children();
trace(xmlList);
for (var i:int=0; i<xmlList.length(); i++)
{
var picLoader:Loader = new Loader();
picLoader.load(new URLRequest(xmlList[i].attributes()[1]));
picLoader.x = 0;
picLoader.y = 0;
addChild(picLoader);
}
}
Я был практически уверен, что всё написал правильно, но выскакивает ошибка:
TypeError: Error #2007: Parameter url must be non-null.
at flash.display::Loader/_load()
at flash.display::Loader/load()
at album_fla::MainTimeline/getXML()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
Подскажите, пожалуйста, где я ошибся, и как исправить, если можно...
undefined
13.12.2017, 16:08
а если положить xml рядом с флэшкой и заменить путь на просто
var xmlLoader:URLLoader = new URLLoader(new URLRequest("my.xml"));
?
а если положить xml рядом с флэшкой и заменить путь на просто
var xmlLoader:URLLoader = new URLLoader(new URLRequest("my.xml"));
?
Нет, тоже не получается.
Дело в том, что до строки for (var i:int=0; i<xmlList.length(); i++) всё работает нормально, и в трейсе показывает как надо. Ошибка в последнем коде, определяющим цикл. Вот здесь:
for (var i:int=0; i<xmlList.length(); i++)
{
var picLoader:Loader = new Loader();
picLoader.load(new URLRequest(xmlList[i].attributes()[1]));
picLoader.x = 0;
picLoader.y = 0;
addChild(picLoader);
}
undefined
13.12.2017, 16:24
а, там еще внутри загрузка, ну очевидно же что xmlList[i].attributes()[1] равен null,на то и ругаются
а, там еще внутри загрузка, ну очевидно же что xmlList[i].attributes()[1] равен null,на то и ругаются
Ну да, там внутри xml прелоадер, чтобы была видна загрузка картинок. Так это из-за него?
ZergMaster
13.12.2017, 16:31
там внутри xml прелоадер
нет, там внутри null, написано же)
TypeError: Error #2007: Parameter url must be non-null.
Loader не может загрузить null
если сделать
for (var i:int=0; i<xmlList.length(); i++)
{
var picLoader:Loader = new Loader();
trace('xmlList['+i+'].attributes()[1] = '+xmlList[i].attributes()[1]);
picLoader.load(new URLRequest(xmlList[i].attributes()[1]));
picLoader.x = 0;
picLoader.y = 0;
addChild(picLoader);
}
, то перед ошибкой вы увидите null в трэйсе
undefined
13.12.2017, 16:33
Parameter url must be non-null
Что переводится как "параметр url не может быть null".XML, очевидно, грузится без проблем,значит проблема не в нем.
значит проблема не в нем.
на всякий случай попробовал убрать прелоадер из xml. Всё равно выдаёт ту же ошибку.
undefined
13.12.2017, 16:40
код с убранным прелодером плз
код с убранным прелодером плз
Здесь весь код xml-файла. С прелоадером. Код прелоадера <usePreloader> true </usePreloader>
<?xml version="1.0" encoding="windows-1251"?>
<FlippingBook>
<width>964</width>
<height>700</height>
<firstPage>0</firstPage>
<alwaysOpened> false </alwaysOpened>
<autoFlip> 200 </autoFlip>
<flipOnClick> true </flipOnClick>
<shadowsDepth> 1 </shadowsDepth>
<moveSpeed> 5 </moveSpeed>
<closeSpeed> 3 </closeSpeed>
<gotoSpeed> 3 </gotoSpeed>
<flipSound> mp3/01.mp3 </flipSound>
<pageBack> 0xB4DBF5 </pageBack>
<loadOnDemand> true </loadOnDemand>
<cachePages> true </cachePages>
<usePreloader> true </usePreloader>
<pages>
<page>img/00.jpg</page>
<page>img/01.jpg</page>
<page>img/02.jpg</page>
<page>img/03.jpg</page>
<page>img/04.jpg</page>
<page>img/05.jpg</page>
<page>img/06.jpg</page>
<page>img/08.jpg</page>
<page>img/09.jpg</page>
<page>img/07_1.jpg</page>
<page>img/07_2.jpg</page>
<page>img/11_1.jpg</page>
<page>img/11_2.jpg</page>
<page>img/12_1.jpg</page>
<page>img/12_2.jpg</page>
<page>img/10.jpg</page>
</pages>
</FlippingBook>
undefined
13.12.2017, 16:46
проблема в as3 коде, а не xml.Конкретно в этой строке
picLoader.load(new URLRequest(xmlList[i].attributes()[1]));
xmlList[i].attributes()[1] равен null о чем и сообщается
ZergMaster
13.12.2017, 17:03
а что показывает
xmlList = xmlData.children();
trace(xmlList);
for (var i:int=0; i<xmlList.length(); i++)
{
trace('xmlList['+i+'].attributes()[1]'+xmlList[i].attributes()[1]);
}
?
проблема в as3 коде, а не xml.Конкретно в этой строке
picLoader.load(new URLRequest(xmlList[i].attributes()[1]));
xmlList[i].attributes()[1] равен null о чем и сообщается
Попробовал подставить не цифровое значение, а конкретный атрибут картинки. Написал вот так:
picLoader.load(new URLRequest(xmlList[i].attributes("img")));
Вышла вот такая ошибка:
ArgumentError: Error #1063: Argument count mismatch on XML/http://adobe.com/AS3/2006/builtin::attributes(). Expected 0, got 1.
at album_fla::MainTimeline/getXML()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
Добавлено через 2 минуты
а что показывает
xmlList = xmlData.children();
trace(xmlList);
for (var i:int=0; i<xmlList.length(); i++)
{
trace('xmlList['+i+'].attributes()[1]'+xmlList[i].attributes()[1]);
}
?
Вот, что показывает
xmlList[0].attributes()[1]undefined
xmlList[1].attributes()[1]undefined
xmlList[2].attributes()[1]undefined
xmlList[3].attributes()[1]undefined
xmlList[4].attributes()[1]undefined
xmlList[5].attributes()[1]undefined
xmlList[6].attributes()[1]undefined
xmlList[7].attributes()[1]undefined
xmlList[8].attributes()[1]undefined
xmlList[9].attributes()[1]undefined
xmlList[10].attributes()[1]undefined
xmlList[11].attributes()[1]undefined
xmlList[12].attributes()[1]undefined
xmlList[13].attributes()[1]undefined
xmlList[14].attributes()[1]undefined
xmlList[15].attributes()[1]undefined
undefined
13.12.2017, 17:12
слово undefined вас не смущает?
слово undefined вас не смущает?
Та да... не определён. И что это может значить?
undefined
13.12.2017, 17:17
что нет такого аттрибута.Выведите в трейс значение
trace(xmlList[i]);
ZergMaster
13.12.2017, 17:17
значит, не правильное обращение к элементу.
ок, хорошо, а
for (var i:int=0; i<xmlList.length(); i++)
{
trace('xmlList['+i+'] = '+xmlList[i]);
}
что дает?
значит, не правильное обращение к элементу.
ок, хорошо, а
for (var i:int=0; i<xmlList.length(); i++)
{
trace('xmlList['+i+'] = '+xmlList[i]);
}
что дает?
xmlList[0] = 964
xmlList[1] = 700
xmlList[2] = 0
xmlList[3] = false
xmlList[4] = 200
xmlList[5] = true
xmlList[6] = 1
xmlList[7] = 5
xmlList[8] = 3
xmlList[9] = 3
xmlList[10] = mp3/01.mp3
xmlList[11] = 0xB4DBF5
xmlList[12] = true
xmlList[13] = true
xmlList[14] = true
xmlList[15] = <pages>
<page>img/00.jpg</page>
<page>img/01.jpg</page>
<page>img/02.jpg</page>
<page>img/03.jpg</page>
<page>img/04.jpg</page>
<page>img/05.jpg</page>
<page>img/06.jpg</page>
<page>img/08.jpg</page>
<page>img/09.jpg</page>
<page>img/07_1.jpg</page>
<page>img/07_2.jpg</page>
<page>img/11_1.jpg</page>
<page>img/11_2.jpg</page>
<page>img/12_1.jpg</page>
<page>img/12_2.jpg</page>
<page>img/10.jpg</page>
</pages>
ZergMaster
13.12.2017, 17:23
видимо, вам нужен xmlList[15]
видимо, вам нужен xmlList[15]
Так он же есть!
xmlList[15] = <pages>
ZergMaster
13.12.2017, 17:26
скорее всего так
var pages:XMLList = xmlList[15].attributes()[0];
for (var i:int=0; i<pages.length(); i++)
{
var picLoader:Loader = new Loader();
picLoader.load(new URLRequest(pages[i]));
picLoader.x = 0;
picLoader.y = 0;
addChild(picLoader);
}
[QUOTE=ZergMaster;1203423]скорее всего так
Тоже не правильно
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at album_fla::MainTimeline/getXML()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
undefined
13.12.2017, 17:44
а вот так?
function getXML(e:Event):void
{
trace("загрузился");
xmlData = XML(e.target.data);
var list:XMLList=xmlData.pages;
for (var i:uint=0;i<list.children().length();i++) {
var picLoader:Loader = new Loader();
picLoader.load(new URLRequest(list.children()[i]));
picLoader.x = 0;
picLoader.y = 0;
addChild(picLoader);
}
}
[QUOTE=undefined;1203425]а вот так?
А так что-то оживает. Появилась только одна картинка, но флешка не работает, страницы альбома не перелистываются. Программа ошибок не выдаёт.
undefined
13.12.2017, 17:53
так вы добавляете все картинки на одно и тоже место, в один и тот же контейнер.Поэтому и видна всего одна из них(последняя)
так вы добавляете все картинки на одно и тоже место, в один и тот же контейнер.Поэтому и видна всего одна из них(последняя)
А как же альбом будет перелистывать, если все картинки в разных контейнерах?
Что-то я совсем запутался.
ZergMaster
13.12.2017, 17:56
А как же альбом будет перелистывать, если все картинки в разных контейнерах?
Что-то я совсем запутался.
как вы напишете программу, так и будет. Пока что у вас нет никакого обеспечения данного интерактива - просто добавление картинок на сцену
undefined
13.12.2017, 17:57
сохраняйте картинки в массив и при листании просто меняйте у них visible
как вы напишете программу, так и будет. Пока что у вас нет никакого обеспечения данного интерактива - просто добавление картинок на сцену
То есть получается, что из xml-файла только картинки грузятся, а весь остальной код не работает?
Но почему?
Добавлено через 1 минуту
сохраняйте картинки в массив и при листании просто меняйте у них visible
Вот с массивами у меня засада. Никак не могу в них разобраться. Я и этот-то код с грехом пополам сваял, без шпаргалок не смог обойтись. Может покажете, как он должен выглядеть, чтобы работал?
undefined
13.12.2017, 18:02
он работает, но не так, как вы ожидаете.
он работает, но не так, как вы ожидаете.
Это плохо, что не так. Хочется, чтобы так. Столько времени на него потратил...
ZergMaster
13.12.2017, 18:14
по сути, вы просите сделать все за вас
undefined
13.12.2017, 18:17
Вот с массивами у меня засада. Никак не могу в них разобраться. Я и этот-то код с грехом пополам сваял, без шпаргалок не смог обойтись. Может покажете, как он должен выглядеть, чтобы работал?
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.*;
import flash.display.Loader;
var xmlLoader:URLLoader = new URLLoader(new URLRequest("xml/my.xml"));
var xmlData:XML;
var xmlList:XMLList;
var picLoader:Loader;
var curImage:int=0;
var images:Array=[];
xmlLoader.addEventListener(Event.COMPLETE, getXML);
next_btn.addEventListener(MouseEvent.CLICK,onClick);
prev_btn.addEventListener(MouseEvent.CLICK,onClick);
function getXML(e:Event):void
{
trace("загрузился");
xmlData = XML(e.target.data);
var list:XMLList=xmlData.pages;
for (var i:uint=0;i<list.children().length();i++) {
var picLoader:Loader = new Loader();
picLoader.load(new URLRequest(list.children()[i]));
picLoader.x = 0;
picLoader.y = 0;
addChild(picLoader);
picLoader.visible=(i==curImage);
images.push(picLoader);
}
}
function onClick(e:MouseEvent):void
{
if (e.target==next_btn) {
images[curImage].visible=false;
curImage++;
if(curImage>images.length-1) curImage=0;
images[curImage].visible=true;
} else if (e.target==prev_btn) {
images[curImage].visible=false;
curImage--;
if(curImage<0) curImage=images.length-1;
images[curImage].visible=true;
}
}
next_btn,prev_btn - кнопки листания.Должны лежать на сцене и иметь именно такие имена.
по сути, вы просите сделать все за вас
Да я понимаю, что это не этично. но я, честное слово, был уверен, что всё правильно написал. Думал, без массивов обойдусь. Никак они мне не даются...
ZergMaster
13.12.2017, 18:18
нужно
1. загрузить картинки в массив
2. добавить две кнопки на сцену (влево -вправо)
3. завести int переменную, которая будет отвечать за показывающийся сейчас слайд.
4. при нажатии на кнопку изменять переменную (+1 либо -1 - в зависимости от направления) и показывать элемент массива, соответствующий переменной. Единственное, что нужно будет учесть - возвращать переменную в 0, если она становится больше длины массива и делать равно длине массива-1, если она становится больше или равно его длине
нужно
1. загрузить картинки в массив
2. добавить две кнопки на сцену (влево -вправо)
3. завести int переменную, которая будет отвечать за показывающийся сейчас слайд.
4. при нажатии на кнопку изменять переменную (+1 либо -1 - в зависимости от направления) и показывать элемент массива, соответствующий переменной. Единственное, что нужно будет учесть - возвращать переменную в 0, если она становится больше длины массива и делать равно длине массива-1, если она становится больше или равно его длине
Большое вам спасибо, ребята, за участие! Вы много со мной проваландались. Вот, просто от души благодарен!
Appleman
13.12.2017, 18:24
и делать равно длине массива-1, если она становится больше или равно его длине
В последней фразе ты хотел сказать, "если она становится меньше нуля", я полагаю.
undefined
13.12.2017, 18:28
Никак они мне не даются
В чем конкретно сложность?Для начала, все что надо понимать, это что массив - это просто список объектов.Добавлять в него новые элементы можно так:
myArray.push(myObject);
либо так
myArray[10]=myObject;
получать элемент из массива можно так:
trace(myArray[10]);
Правда, флешка всё равно не работает. Добавил кнопки, дал им имена, но загрузилась только первая картинка, и всё. Но, не смею вас больше беспокоить. Потому что в итоге получится, что вы всё сделаете за меня...
ZergMaster
14.12.2017, 10:46
Comer
для того, чтобы понять, что такое массив - идете в гугл и набираете "Array as3" и проходите по первой ссылке.
Лучше, конечно, почитать какую-нибудь книгу на вроде "Алгоритмы и структуры данных" - помогает. И, кстати, очень даже интересно.
чтобы работало, попробуйте переделать немного метод onClick из примера undefined
function onClick(event:MouseEvent):void
{
var target:MovieClip = event.target as MovieClip;
trace('target = '+target);
for(var i:int=0; i<images.length; i++)
{
images[curImage].visible=false;
}
if (target==next_btn as MovieClip)
{
curImage++;
if(curImage>(images.length-1)) curImage=0;
}
else if (target==prev_btn as MovieClip)
{
curImage--;
if(curImage<0) curImage=images.length-1;
}
images[curImage].visible=true;
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.