Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Запись в массив? (http://www.flasher.ru/forum/showthread.php?t=131243)

Art_133 15.10.2009 23:34

Если я не ошибаюсь то target_mc - это аргумент функции метода onLoadInit.
mooncar Пардон за глупый вопрос, а как это именованые элементы массива? Можете привести пример?

mooncar 15.10.2009 23:57

Код:

onLoadInit = function([target_mc]) {}
target_mc: [optional] - A movie clip loaded by a MovieClipLoader.loadClip() method.

Art_133,
Цитата:

Сообщение от Art_133 (Сообщение 858221)
Если я не ошибаюсь то target_mc - это аргумент функции метода onLoadInit.

Верно. Внутри обработчика метода этот аргумент у меня и используется.
Когда загружаем картинку в контейнер через loadClip, он равен
Код AS1/AS2:

this['eventFoto' + year + n]

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

Насчет массива с именованными элементами - посмотрите материалы в любом справочнике или учебнике по флешу на тему "Ассоциативные массивы".

Кстати, любой мувик, или даже сам _root, если внутри него есть еще какие-то элементы - другие мувики, переменные, функции, свойства - это также ассоциативный массив, доступ элементам которого осуществляется по их именам. Например:
Код AS1/AS2:

_root['movie_mc'];
this['movie' + 2 + 'mc'];
movie_mc['_alpha'] = 75;
btn.onRelease = this._parent['doIt'];

и т.д.
Это - основы.

sy555,
Цитата:

Сообщение от sy555 (Сообщение 858218)
откуда берется target_mc?

target_mc - это аргумент, который, когда наступает onLoadInit, внутри функции его метода равен мувику-контейнеру, куда грузили.
Цитата:

Сообщение от sy555 (Сообщение 858218)
что делает listenerEFoto.onLoadInit?

Дает возможность работать с мувиком-контейнером с загруженным контентом дальше - гарантирует, что загрузка завершилась. В силу асинхронности AS какие-либо действия с мувиком-контейнером с загруженной картинкой можно предпринимать дальше только внутри этого метода (точнее, его функции) - он дает гарантию завершения загрузки. Без него нельзя.
Кстати, а зачем вы альфу контейнера приравняли 100? Для отладки? Эти мувики ведь временные, они будут мельтешить при загрузке картинок. Они вообще не нужны в дальнейшем.
_____________________
Читайте о классе MovieClipLoader и его методах, смотрите примеры.

sy555 16.10.2009 00:36

да хотел отладить, увидеть картинку.. в итоге закомментил unLoadMovie;

Так вроде понятно , еще один вопросик созрел по ходу отладки .

В теле onLoadInit :

Код AS1/AS2:

EVENTSBITMAP[num] = myImg;
                trace(" name : "+num+ " :" + EVENTSBITMAP[num] + " hey: " );
num++;

заменил на числовые.

output:
Код:

name : 0 :[object Object] hey:
 name : 1 :[object Object] hey:
 name : 2 :[object Object] hey:

Вроде верно.

Но когда выношу в другую функцию данные теряются.. хотя переменная описана глобально..

Код AS1/AS2:

var linksID:Array=["1","2","3","4","5","6","7","p1","p2","p3"];
 
trace("linksId: " + linksID);
trace ("\n");
for(u=0;u<3;u++)
{
linksID[u]=EVENTSBITMAP[num];
}

output
Код:

linksId: 1,2,3,4,5,6,7,p1,p2,p3


totalundefined,undefined,undefined,4,5,6,7,p1,p2,p3


mooncar 16.10.2009 00:49

Какая переменная описана глобально? Куда что выносите?
Может ВЕСЬ код приведете, догадываться сложно, помощь вам затрудняется.

sy555 16.10.2009 00:54

Код AS1/AS2:

import flash.display.BitmapData;
import mx.controls.Button;
 
var EVENTSBITMAP:Array = new Array(); //массив фото событий , глобальная переменная
var num :Number= new Number();
var massiv:Array;
num=0;
//......
var mcLoaderEventsFoto:MovieClipLoader = new MovieClipLoader();
var listenerEFoto:Object = new Object();
var timeout:Number= new Number();
var totals:Number= new Number();
var effect:String= new String();
timeout=5000;
effect="oval";
//EVENTSBITMAP=["gf","fdf","sdf"];
 
//XML
 
var my_lv:LoadVars = new LoadVars();
 
function loadXML(loaded) {
        if (loaded) {
                xmlNode = this.firstChild;
                image = [];
                description = [];
                total = xmlNode.childNodes.length;
                totals=total;
                for (i=0; i<total; i++) {
                        image[i] = xmlNode.childNodes[i].childNodes[0].firstChild.nodeValue;
                        description[i] = xmlNode.childNodes[i].childNodes[1].firstChild.nodeValue;
                }
                firstImage();
 
 
 
        } else {
                content = "file not loaded!";
        }
}
xmlData = new XML();
xmlData.ignoreWhite = true;
xmlData.onLoad = loadXML;
xmlData.load("images.xml");
gogo();
//setInterval(pic_preview(5),100);
function gogo()
{
        filesize = picture.getBytesTotal();
        loaded = picture.getBytesLoaded();
}
 
//
 
 
 
 
 
function firstImage() {
 
        if (true) {
                for(j=0;j<total;j++)
                {
                                        loadMovie(image[j], 1);
                                trace("j: "+j + " , " + "im: "+image[j]);
                }
        }
}
//END XML
//array tranclate
 
mcLoaderEventsFoto.addListener(listenerEFoto);
 loadEventsSlide(1999,5);
function loadEventsSlide (year, n) {
        //создание пустого мувиклипа
        this.createEmptyMovieClip('eventFoto' + year + n, this.getNextHighestDepth());
        this['eventFoto' + year + n]._alpha = 100; //чтобы в прелоадере не мелькали загружаемые картинки
 //когда объект загружен ,создаем функции с входным аргументом - муви,клип
        listenerEFoto.onLoadInit  = function (target_mc:MovieClip) {
                //создаем объект типа BitmapData, под подгружаемый mc
                var myImg:BitmapData = new BitmapData(target_mc._width, target_mc._height, false);       
                //отборжение эффекта
                myImg.draw(target_mc);
                //выгрузка мувиклипа из контейнера
                //target_mc.unloadMovie();
 //Массив муикльипа ,с имееными индексами заполнеяеться конкретной картикой
                EVENTSBITMAP[num] = myImg;
                trace(" name : "+num+ " :" + EVENTSBITMAP[num] + " hey: " );
num++;
                return EVENTSBITMAP;
        };       
 
        listenerEFoto.onLoadError = function  (target_mc:MovieClip) {//если нет фото к событию
                if (year >= yearsTotal) {
                        trace("ERROR, can't find file");
                loadEventsStatus = 1; //конец
                }
        };       
 trace("ROUTE!::"+EventsPath + "foto/" + year + "." + n + ".jpg" + suffix );
        mcLoaderEventsFoto.loadClip("fon.JPG", 1);
        mcLoaderEventsFoto.loadClip("fon2.JPG", 2);
        mcLoaderEventsFoto.loadClip("fon3.JPG", 3);
 
        //p1.loadClip("fon.JPG",1);
p1.attachBitmap(EVENTSBITMAP[1], this.getNextHighestDepth());
};
 
 
//array traclate end
 
var linksID:Array=["1","2","3","4","5","6","7","p1","p2","p3"];
 
trace("linksId: " + linksID);
trace ("\n");
for(u=0;u<3;u++)
{
linksID[u]=EVENTSBITMAP[num];
}
//linksID=image[];
trace("total" +linksID);
 
for (var i:Number = 0; i < linksID.length; i++) {
        bitmaps[i]=BitmapData.loadBitmap(linksID[i]);
}
 
//по сути надо что бы было
//bitmaps[i]= EVENTSBITMAP[i]


mooncar 16.10.2009 10:53

Вот это зачем?
Код AS1/AS2:

return EVENTSBITMAP;

Возврат значения функции делаем только при такой записи:
Код AS1/AS2:

b = my_functon (a);

и после return дальнейшие вычисления в функции останваливаются

Добавлено через 4 минуты
Что-то у вас в коде каша какая-то - зачем вы закомментировали загрузку loadClip, у вас же ничего грузится не будет теперь.
Потом, функция за раз грузит одну картинку, вот так делать нельзя:
Код AS1/AS2:

        mcLoaderEventsFoto.loadClip("fon.JPG", 1);
        mcLoaderEventsFoto.loadClip("fon2.JPG", 2);
        mcLoaderEventsFoto.loadClip("fon3.JPG", 3);

Вызывайте функцию в цикле.

Добавлено через 1 час 18 минут
Едем дальше.
Еще раз - вот в сжатом виде алгоритм:
Код AS1/AS2:

var BITMAPDATA:Array = new Array(); //массив фото событий
......
var mcLoaderEventsFoto:MovieClipLoader = new MovieClipLoader();
var listenerEFoto:Object = new Object();
mcLoaderEventsFoto.addListener(listenerEFoto);
 
function loadEventsSlide (num) {
        this.createEmptyMovieClip('foto' + num, this.getNextHighestDepth());
        this['foto' + num]._alpha = 0; //чтобы в прелоадере  на виду не мелькали загружаемые картинки
 
        listenerEFoto.onLoadInit  = function (target_mc:MovieClip) {
                var myImg:BitmapData = new BitmapData(target_mc._width, target_mc._height, false);       
                myImg.draw(target_mc);
                target_mc.unloadMovie();
 
                BITMAPDATA[target_mc._name] = myImg;
        };       
 
        mcLoaderEventsFoto.loadClip(num + '.jpg', this['foto' + num]);
};
 
//вызов загрузки, например, так:
for (i = 1; i < 11; i++) {
        loadEventsSlide(i);
}

Все лишнее я убрал.
Загружаем, заполняем массив.
Дальше. Если записать проверку наполненности массива сразу после этого кода, то все должно быть undefined, потому что AS асинхронно работает с данными.
Поэтому проверку наполненности массива мы имеем право делать:
- либо внутри метода onLoadInit
- либо только спустя какое-то время, когда загрузка гарантированно завершена.
Для эксперимента можно нарисовать кнопку, на нее повесить вызов цикла обхода элементов массива:
Код AS1/AS2:

test_btn.onRelease = function  () {
        for (k in BITMAPDATA) {
                trace(k + '  ' + BITMAPDATA[k]);
        }       
}


sy555 16.10.2009 16:17

Спасибо большое, буду разбираться, как раз почитал про класс MovieClipLoader.

Добавлено через 6 часов 10 минут
Разобрал код, потестил ,работает.. Возник вопрос, как это сделать без кнопки ,
надумал повесить слушатель, мол когда закончит чтение xml, запускать тоже самое что в кнопке ..
Код AS1/AS2:

 
var array_test:Array=new Array();
var array_test1:Array=new Array();
var image:Array=new Array();
var lisen:Object=new Object();
 
function array_return(loaded)
{
        array_test=['el1','el2','el3'];
        for(i=0;i<array_test.length;i++)
        trace ("array element: " + i + " content: " + array_test[i]);
//        return array_test;
 
 
        if (loaded) {
                xmlNode = this.firstChild;
                image = [];
                description = [];
                total = xmlNode.childNodes.length;
                for (i=0; i<total; i++) {
                        image[i] = xmlNode.childNodes[i].childNodes[0].firstChild.nodeValue;
                        trace("image["+i+"]= "+image[i]);
                        description[i] = xmlNode.childNodes[i].childNodes[1].firstChild.nodeValue;
                }
 
        } else {
                trace("file not loaded!");
        }
        return image;
 
 
 
}
 
//start function
xmlData = new XML();
xmlData.ignoreWhite = true;
xmlData.onLoad = array_return;
xmlData.load("images.xml");
 
lisen.onChanged =function() //Вопрос что поставить вместо onChanged
{
        trace ("lisen is working");
 
}
btn1.onPress=function()
{
array_test1=array_return();
for(j=0;j<array_test1.length;j++)
trace ("j: " + j + " con: " + array_test1[j]);
 
}
 
 
array_return.addListener(lisen);

правильно ли я понял как работает слушатель?
Там не он onChanged понятное дело должен быть, а что то типо onComplete) не смог найди, хелп перестал работать.


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

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