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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.10.2007, 18:24
NeverSummer вне форума Посмотреть профиль Отправить личное сообщение для NeverSummer Найти все сообщения от NeverSummer
  № 1  
Ответить с цитированием
NeverSummer

Регистрация: Nov 2006
Сообщений: 32
По умолчанию Не устанавливается обработчик события - не могу понять почему

Подскажите плиз - есть такой код (картинка нормально подгружается но обработчик onRelease не работает )

Код:
var loader_mcl:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
loader_mcl.addListener(listener);

set_thumbnail();

function set_thumbnail( )
{
	this.createEmptyMovieClip("img_thumb", 0);
	loader_mcl.loadClip("suse10_t.jpg", this.img_thumb);
}

trace("img_thumb = " + this.img_thumb._name); 

this.img_thumb.onRelease = function()
{
	trace("Release entered");
}

listener.onLoadInit = function(target_mc:MovieClip) {
		target_mc._x =  544;
		target_mc._y =  107;
}
вывод проги:

Код:
img_thumb = img_thumb
- т.е. объект существует - по идее должен присваиватся обрабтчик сообщений и работать.
Причем если я обрабтчик размещаю в onLoadInit подобным образом

Код:
listener.onLoadInit = function(target_mc:MovieClip) {
		target_mc._x =  544;
		target_mc._y =  107;

                 target_mc.onRelease = function()
		{
			trace("Release entered");
		}
}
то все работает - но не могу понять почему - объясните плиз - никак не могу врубится в логику работы флэша не говоря уже о том, что конструкции с вложенными функциями выглядят жуть как некрасиво имхо... Неаккуратненько как то
Желательно если укажете мне место в хелпе или статью какую (можно на инглиш) где прямо написанно почему работает так а не этак...

Старый 19.10.2007, 19:05
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
"Машенька, а как тебя зовут?"
Конечно же onRelease должен вешаться на клип только после загрузки, т.е. когда сработает onLoadInit.
__________________
Reality.getBounds(this);

Старый 19.10.2007, 19:28
NeverSummer вне форума Посмотреть профиль Отправить личное сообщение для NeverSummer Найти все сообщения от NeverSummer
  № 3  
Ответить с цитированием
NeverSummer

Регистрация: Nov 2006
Сообщений: 32
2Wolsh - а есть где написанно об этом? Блин никак не могу найти как сообщения ходят в хелпе .. Все равно не понятно - а можно в жтом случае определить обработчик не в тебе другой функции?

Старый 19.10.2007, 19:35
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Не совсем понятно, что Вы имеете в виду...
"не в тебе другой функции" - значит "в теле этой"
какой ЭТОЙ?
Может проще объяснить, чего Вы хотите добиться, что это будет.
__________________
Reality.getBounds(this);

Старый 19.10.2007, 19:56
NeverSummer вне форума Посмотреть профиль Отправить личное сообщение для NeverSummer Найти все сообщения от NeverSummer
  № 5  
Ответить с цитированием
NeverSummer

Регистрация: Nov 2006
Сообщений: 32
2Wolsh - я имел ввиду что хотел бы избежать определения функции обрабтчика onRelease в теле функции onInit - так как такие определения ведут к порождению запутанного и плохочитаемого кода (имхо конечно).
Во вторых мне не очень понятна логика флэша в том смысле - что я должен ждать пока в мувик загрузится содержимое что бы определить обработчик события. Отсюда вопрос - есть ли разделы хелпа или сторонние статьи (можно на инглиш) в которых хорошо разжеванная вот такая мудреная логика .. Просто я вот еще совсем новичок в AS хотя раньше писал много на С++ и у меня в процессе написания просто на кажом шагу затык какой то - измучился я совсем.

Старый 19.10.2007, 23:28
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 6  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
В вашем примере логика такова, имхо.
вы создали ПУСТОЙ мувик "img_thumb" и попытались ТУТЖЕ повесить на него "onRelease" - обработчик не работает, хотябы потому, что в этот момент "img_thumb" имеет размеры 0х0
если вешать "onRelease" на НЕПУСТОЙ мувик, т.е с уже загруженной картинкой - все в порядке.
проблема в том что
Код:
this.img_thumb.onRelease = function()
{
	trace("Release entered");
}
выполняется РАНЬШЕ, чем
Код:
loader_mcl.loadClip("suse10_t.jpg", this.img_thumb);
т.к. загрузка идет асинхронно.
некрасивость можно легко исправить
Код:
var handleFunc = function () {
	trace("Release entered");
};
var loader_mcl:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
loader_mcl.addListener(listener);
set_thumbnail();
function set_thumbnail() {
	this.createEmptyMovieClip("img_thumb", 0);
	loader_mcl.loadClip("suse10_t.jpg", this.img_thumb);
}
trace("img_thumb = " + this.img_thumb._name);
listener.onLoadInit = function(target_mc:MovieClip) {
	target_mc._x = 544;
	target_mc._y = 107;
	target_mc.onRelease = handleFunc;
};
............
что касается общего понимания и разжевывания - то как говорится "мы все учились по-немногу, чему-нибудь и как-нибудь..."
искать базовые знания в нете - полный изврат, вмечсто знаний получится каша в голове.
варианты:
- обычная книга (на этом форуме особой популярностью пользуется (и вполне заслуженно) автор Колин Мук (Colin Moock, http://moock.org)
и как минимум два его бестселлера
"ActionScript for Flash MX: The Definitive Guide"
"Essential ActionScript 2.0"
(есть переводы, ссылок на скачку нет!)
- хороший наставник.
Наилучшим результатам способствует сочетание 1 и 2


Последний раз редактировалось alexcon314; 19.10.2007 в 23:44.
Старый 20.10.2007, 00:14
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
alexcon314 , отличный ответ, только одна поправка. Обработчик не работает не потому что размер клипа 0х0 Нет, всё гораздо логичнее. Просто после загрузки нового содержимого в клип все повешанные на него обработчики отменяются (слетают). Это легко проверить, создав my_mc вручную, с какой-нить картинкой внутри, поместив его на сцене. И повесить, скажем, такой код
Код:
my_mc.onRelease = function(){trace("Release!")}
my_mc.loadMovie("img.jpg");
После загрузки картинки никакого релиза не будет.
По аналогии с работой вручную это примерно тоже самое, что перейти с одного ключевого кадра, на котором повешен код, на другой ключевой кадр, где кода с обработчиком уже нет, хотя экземпляр вроде тотже и даже с тем же именем - код с первого ключевого кадра на него уже не действует. Т.е. имя остается, но сам объект уже считается другим, прежний удаляется - ну и логично, что его обработчики удаляются вместе с ним. но есть интересный момент - его свойства при этом не удаляются и переходят объекту с таким же именем, т.е. в данном случае - преемнику Именно поэтому новая картинка будет иметь те же координаты, что и созданный вручную my_mc. Переменные типа my_mc.a также останутся в доступе. Я думаю, это вызвано простой экономией ресурсов - при удалении "первого" my_mc переменные не удаляются по той простой причине, что с исчезновением my_mc вроде как пропадает ссылка на них (my_mc.a).
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 20.10.2007 в 00:48.
Старый 20.10.2007, 00:31
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 8  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
"мы все учились по-немногу, чему-нибудь и как-нибудь..."
я действительно этого не знал, спасибо.
впрочем я исходил из этого
Код:
this.createEmptyMovieClip("mc",0);
this.mc.onRelease = function(){
	trace("Release");
}
Код:
this.createEmptyMovieClip("mc",0);
this.mc.onEnterFrame = function(){
	trace("EnterFrame");
}
обработчик onRelease не работает из-за "0х0" имхо, причем тут загрузка? хотя это, конечно не относится к примеру темы, дествительно:
Код:
this.createEmptyMovieClip("mc", 0);
this.mc.onEnterFrame = function() {
	trace("EnterFrame");
};
var loader_mcl:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
loader_mcl.addListener(listener);
loader_mcl.loadClip("suse10_t.jpg", mc);
ОДИН раз выводит в output EnterFrame


Последний раз редактировалось alexcon314; 20.10.2007 в 01:03.
Старый 20.10.2007, 01:16
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
>> обработчик onRelease не работает из-за "0х0" имхо, причем тут загрузка?
Поделись как проверял?
__________________
Reality.getBounds(this);

Старый 20.10.2007, 01:26
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 10  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Код:
this.createEmptyMovieClip("mc",0);
this.mc.onRelease = function(){
	trace("Release");
}
в output ничего не выводит. возможная причина - нулевой размер клипа.
сам обработчик у клипа есть.
Код:
for( i in mc){
	trace(i);
}
вот и вся проверка. физически не возможно реализовать onRelease у объекта нулевых размеров. разве не логично?

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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