Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.10.2009, 23:34
Art_133 вне форума Посмотреть профиль Отправить личное сообщение для Art_133 Посетить домашнюю страницу Art_133 Найти все сообщения от Art_133
  № 11  
Ответить с цитированием
Art_133
 
Аватар для Art_133

блогер
Регистрация: Feb 2007
Адрес: Москва
Сообщений: 538
Записей в блоге: 2
Отправить сообщение для Art_133 с помощью Skype™
Если я не ошибаюсь то target_mc - это аргумент функции метода onLoadInit.
mooncar Пардон за глупый вопрос, а как это именованые элементы массива? Можете привести пример?

Старый 15.10.2009, 23:57
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 12  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Код:
onLoadInit = function([target_mc]) {}
target_mc: [optional] - A movie clip loaded by a MovieClipLoader.loadClip() method.
Art_133,
Цитата:
Сообщение от Art_133 Посмотреть сообщение
Если я не ошибаюсь то 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 Посмотреть сообщение
откуда берется target_mc?
target_mc - это аргумент, который, когда наступает onLoadInit, внутри функции его метода равен мувику-контейнеру, куда грузили.
Цитата:
Сообщение от sy555 Посмотреть сообщение
что делает listenerEFoto.onLoadInit?
Дает возможность работать с мувиком-контейнером с загруженным контентом дальше - гарантирует, что загрузка завершилась. В силу асинхронности AS какие-либо действия с мувиком-контейнером с загруженной картинкой можно предпринимать дальше только внутри этого метода (точнее, его функции) - он дает гарантию завершения загрузки. Без него нельзя.
Кстати, а зачем вы альфу контейнера приравняли 100? Для отладки? Эти мувики ведь временные, они будут мельтешить при загрузке картинок. Они вообще не нужны в дальнейшем.
_____________________
Читайте о классе MovieClipLoader и его методах, смотрите примеры.


Последний раз редактировалось mooncar; 16.10.2009 в 00:28.
Старый 16.10.2009, 00:36
sy555 вне форума Посмотреть профиль Отправить личное сообщение для sy555 Найти все сообщения от sy555
  № 13  
Ответить с цитированием
sy555

Регистрация: Mar 2009
Сообщений: 49
да хотел отладить, увидеть картинку.. в итоге закомментил 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

Старый 16.10.2009, 00:49
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 14  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Какая переменная описана глобально? Куда что выносите?
Может ВЕСЬ код приведете, догадываться сложно, помощь вам затрудняется.

Старый 16.10.2009, 00:54
sy555 вне форума Посмотреть профиль Отправить личное сообщение для sy555 Найти все сообщения от sy555
  № 15  
Ответить с цитированием
sy555

Регистрация: Mar 2009
Сообщений: 49
Код 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]

Старый 16.10.2009, 10:53
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 16  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Вот это зачем?
Код 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]);
	}	
}


Последний раз редактировалось mooncar; 16.10.2009 в 12:23.
Старый 16.10.2009, 16:17
sy555 вне форума Посмотреть профиль Отправить личное сообщение для sy555 Найти все сообщения от sy555
  № 17  
Ответить с цитированием
sy555

Регистрация: Mar 2009
Сообщений: 49
Спасибо большое, буду разбираться, как раз почитал про класс 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, время: 11:37.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
xml , буферизация , массивы , парсинг

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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