Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Загадочные тайны языка AS3 или не вижу мувик на сцене! (http://www.flasher.ru/forum/showthread.php?t=161918)

swing1991 28.07.2011 23:13

Загадочные тайны языка AS3 или не вижу мувик на сцене!
 
Здравствуйте,мозг на гране разрыва.Делаю мини-галерею.Просмотр реализую так:
Беру создаю много "элементов -контейнеров" фотографий,поскольку галерея рассчитана на много альбомов.Помещаю все контейнеры в массив,потом при выборе альбома нового,удаляю контейнер[0] и добавляю контейнер[1] ...Контейнер ДОБАВЛЯЕТСЯ,contains возвращает true,visible =true,ширина 400 ,высота столько-же,координаты (0:0),но все равно я не вижу контейнер при выборе нового альбома!Тоесть первый альбом загружается нормально(он рандомный из всего xml),но если я выбираю новый,то флеш заходит в тупик.Ошибок нет.
Куски кода:
1.Создание контейнеров:
Код AS3:

 
fill();
function fill():void
{
        for (var i:uint=0;i<num;i++)
        {
                gallery1 = new MovieClip();
                currObj.push(gallery1);
        }
}

2.Эта функция грузит ссылки на фотки в выбранных альбомах
Код AS3:

 
function LoadXML(e:Event=null):void {
//массив с фотками был тут
        numphot=img.length;
        prevCount++;
}

3.Эта функция происходит при каждой загруженной фотке:
Код AS3:

 
function loadedImage(e:Event):void {
        ttn++;
        var border:MovieClip = new MovieClip();
        var myOb=e.target.loader;
        currObj[prevCount].addChild(myOb);
//рамочка,размеры и блаблабла
        if (ttn==numphoto)
        {
                removeChild(loader);
                gallery.addChild(currObj[prevCount]);
                trace('Последний объект загружен и добавлен!');
        }
}

4.Это происходит при выборе альбома:
Код AS3:

 
function tn_click(e:MouseEvent):void {
        gallery.removeChild(currObj[prevCount]);
        ttn=0;
        current=0;
        LoadXML();
}

В Output ошибок нет,даже выводит текст про то что последний объект добавился,мувиклип находится на сцене и имеет numChildren более нуля.

Я не новичок,потому попрошу не кидать мне советы от кепа :)
Надеюсь на вашу помощь!

СлаваRa 28.07.2011 23:36

Судя по коду, при выборе альбома вы вызываете tn_click, удаляете со сцены currObj[prevCount], вызываете LoadXML, в которой изменяете numphot и prevCount и все. Вызова loadedImage после всех этих действий я не заметил, поэтому currObj[prevCount] и на сцену не добавляется.
Или покажите весь код, таким какой он есть.

swing1991 28.07.2011 23:56

Цитата:

Сообщение от я
Я не новичок,потому попрошу не кидать мне советы от кепа /

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

Сообщение от я
Контейнер ДОБАВЛЯЕТСЯ,contains возвращает true,visible =true,ширина 400 ,высота столько-же,координаты (0:0),но все равно я не вижу контейнер при выборе нового альбома!

Тоесть все функции проходят и даже количество детей gallery после добавления currObj[prevCount] изменяется с 0 на 1 .Тоесть все добавлено,размеры видимые,visible =true ,координаты в пределе видимости,но все равно не вижу контейнер с фотками.В контейнер фотки добавляются.

СлаваRa 29.07.2011 00:04

Покажи весь код, манна на телепатию кончилась.

swing1991 29.07.2011 00:11

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

СлаваRa 29.07.2011 00:16

Ну тогда у вас все правильно, и работает как и должно.

serogah 29.07.2011 00:17

Видимо gallery в список отображения не добавляется

swing1991 29.07.2011 00:27

Цитата:

Сообщение от serogah (Сообщение 1015659)
Видимо gallery в список отображения не добавляется

Код AS3:

trace(currObj[prevCount] is DisplayObject);

Цитата:

Сообщение от Output
true

Поскольку я делаю addChild он должен добавится.Я полагаю что это баг флеша.Как обойти?Был-бы очень благодарен.

СлаваRa 29.07.2011 00:31

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

КорДум 29.07.2011 00:34

Цитата:

Я не новичок,потому попрошу не кидать мне советы от кепа
По коду видно обратное. Также видно, что вы НЕ ДОБАВЛЯЕТЕ gallery в отображение.

СлаваRa 29.07.2011 00:38

Цитата:

Тоесть первый альбом загружается нормально(он рандомный из всего xml),но если я выбираю новый,то...
Но, если первый раз currObj[prevCount] виден, то gallery добавлен.

swing1991 29.07.2011 00:42

Добавлено через 1 минуту
Цитата:

Сообщение от КорДум (Сообщение 1015671)
По коду видно обратное. Также видно, что вы НЕ ДОБАВЛЯЕТЕ gallery в отображение.

Ну что-же,скажи как добавить,пожалуйста.

КорДум 29.07.2011 00:45

addChild(gallery), вестимо.

swing1991 29.07.2011 00:47

Цитата:

Сообщение от КорДум (Сообщение 1015681)
addChild(gallery), вестимо.

Пробовал на приступах бреда и такое,эффекта нету.
Слушай ты найди КОГДА Я УСПЕЛ gallery УДАЛИТЬ???

КорДум 29.07.2011 00:48

Код AS3:

if (ttn==numphoto)
{
        removeChild(loader);
        gallery.addChild(currObj[prevCount]);
        trace('Последний объект загружен и добавлен!');
}

Это условие всегда срабатывает?

Добавлено через 32 секунды
Цитата:

Слушай ты найди КОГДА Я УСПЕЛ gallery УДАЛИТЬ???
Попрошу без истерик. Вам это надо, а не мне.

swing1991 29.07.2011 00:51

Ну а что это было
Цитата:

НЕ ДОБАВЛЯЕТЕ
Сохраняю стиль.
Цитата:

Сообщение от я
даже выводит текст про то что последний объект добавился

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

КорДум 29.07.2011 00:53

Сообщение от я
Тогда Ваш код работает как надо.

Соберите минималистичный пример, илююстрирующий сие магическое явление и представьте народу. А телепатам, все же, дайте отдохнуть.

swing1991 29.07.2011 00:57

Выкладывать код в 650 строк нет смысла,могу скинуть цепочку функций:
Код AS3:

var gallery1:MovieClip;
var prevCount:Number = -1;
var currObj:Array = new Array();
var xml_url:String = "doma.xml";
var ia:Number=0;
var ic:Number=0;
var numphot:Number=0;
var i:Number;
var tn:int=0;
var current_no:Number=0;
 
fill();
function fill():void
{
        for (var i:uint=0;i<num;i++)
        {
                gallery1 = new MovieClip();
                currObj.push(gallery1);
        }
}
 
function XMLLoad():void {
        xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
        xmlLoader.load(new URLRequest(xml_path));
}
 
function LoadXML(e:Event=null):void {
        xmlData=new XML(xmlLoader.data);
        var img:Array = new Array();
        numphot=xmlData.category[ic].album[ia].image.length();
        for (var i:uint = 0; i<numphot; i++) {
                img.push(xmlData.category[ic].album[ia].image[i].@full.toString());
        }
        numphot=img.length;
        addLenta(img);
        prevCount++;
}
 
function addLenta(img):void {
            for (var i:uint = 0; i<numphot; i++) {
                var myLoader:Loader = new Loader();
                var myRequest:URLRequest=new URLRequest(img[i]);
                myLoader.load(myRequest);
                myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadedImage);
              }
}
 
function loadedImage(e:Event):void {
        ttn++;
        var border:MovieClip = new MovieClip();
        var myOb=e.target.loader;
        if (myOb.height>650)
        {
                myOb.height=650;
        }
        currObj[prevCount].addChild(myOb);
        if (ttn>=numphot)
        {
                removeChild(loader);
                trace(currObj[prevCount] is DisplayObject);
                gallery.addChild(currObj[prevCount]);
                trace('Последний объект загружен и добавлен!');
        }
}

И выбор альбомов:
Код AS3:

function tn_click(e:MouseEvent):void {
        var mc:MovieClip=MovieClip(e.target);
        current_no=parseInt(mc.name.slice(11,13));
        ia=current_no;       
        gallery.removeChild(currObj[prevCount]);
        ttn=0;
        current=0;
        LoadXML();
}

Как видите,почти разницы нету большой с той версией кода,разве что периферия добавилась.

p.s.Простите,код немного с мусором...

Котяра 29.07.2011 01:00

Блин и тут в кадрах пишут.
За такой код расстрелял бы.. )
Цитата:

tn_click
LoadXML
XMLLoad
loadedImage
Вы уж определитесь.

swing1991 29.07.2011 01:01

Я тут урезал часть твинов,работаю с твинами от caurina...Стоит выложить?Там только альфа myOb твинится...И уезд менюшки,в которой можно выбрать альбом.

Добавлено через 1 минуту
Цитата:

Сообщение от Котяра (Сообщение 1015698)
блин и тут в кадрах пишут..

Да уж простите...Пишу в классах часто,но подобные ,небольшие проектики,делаю в кадрах,удобнее ИМХО.

Добавлено через 7 минут
Что и у вас тупик??Что все примолкли??

Котяра 29.07.2011 01:10

Извините - мозг отказывается воспринимать ваш код и тем более искать в нём ошибки..
трэйс вас спасёт. пройдитесь по всей цепочке вызовов функций и потрэйсте всё что сможете)

swing1991 29.07.2011 01:11

Цитата:

Сообщение от Котяра (Сообщение 1015698)
Блин и тут в кадрах пишут.
За такой код расстрелял бы.. )

Вы уж определитесь.


Эммм...В чем определится?Что вам не нравится?

СлаваRa 29.07.2011 01:12

а самый первый раз альбом показывает? если да, то либо сам контейнер gallery, либо то что в нем не видимо, после смены, смотрите твины или моменты где "прячете" gallery или его содержимое.

пс
1. функция LoadXML, что будет если вызвать ее 10, 20, 50 раз (50 смен альбома)?
2. функция loadedImage замените var myOb=e.target.loader на var myOb=e.target.content
2.1 removeChild(loader); - откуда берется loader который вы удаляете?

пс2
Цитата:

Эммм...В чем определится?Что вам не нравится?
как минимум подход к написанию и оформлению кода.

Котяра 29.07.2011 01:12

Цитата:

В чем определится?Что вам не нравится?
3 варианта стиля написания функции
Читайте и соблюдайте конвенции. Ну или хотя бы будьте последовательны, если используете свою.
XMLLoad и loadXML тоже сломали мне мозг)

swing1991 29.07.2011 01:15

-1.Трейсил абсолютно все.Во всей цепочке ни одной ошибки.
0.Естевственно код тяжел для восприятия,там много переферии,но вы сами вынудили эту переферию оставить.
1.Цепочка загрузки будет проиходить заново,но с новыми параметрами.
2.Попробую..Но смысл?Я ведь на сцену loader добавляю,с результатом.
3.removeChild(loader); - это всплывающее окошко , о том что идет загрузка.

Добавлено через 2 минуты
Тут все ясно ,XMLLoad грузит сам xml файл и помещает его в data от xmlloader.А LoadXML пользуется загруженным XML.

СлаваRa 29.07.2011 01:19

prevCount++; - 50 раз вызови, должен открыться 50й альбом?
так я все таки правильно думаю, первый раз отображается альбом на мониторе?
Проверяйте тогда видимость\невидимость, больше предложить нечего.

Котяра 29.07.2011 01:20

Тема закрыта, название темы не отражает суть вопроса.


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

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