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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.10.2014, 00:31
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 11  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Вы даже не знаете как цикл работает?

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

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Тогда сделайте через цикл for, чтобы ничего не отвлекало.

Старый 17.10.2014, 22:38
Павел Ткаченко вне форума Посмотреть профиль Отправить личное сообщение для Павел Ткаченко Найти все сообщения от Павел Ткаченко
  № 13  
Ответить с цитированием
Павел Ткаченко

Регистрация: May 2014
Сообщений: 3
Код AS3:
for (var i:int = 0; i < buttons.lenght; i++)
        buttons[i].addEventListener(MouseEvent.CLICK, onClickHandler);

Старый 19.10.2014, 02:53
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 14  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Эмм, народ, stepa232 на самом деле столкнулся с кривой реализацией примитивов и областей видимости в Flash Player. Давайте я поясню проблему кода из первого поста, смотрите:
Код AS3:
while(i<=10)
{
bt_head[i].addEventListener(MouseEvent.CLICK, function(){buyItem(head[i]);});
i++;
}
Итак, имеем самый обычный цикл, не ясно в чем проблема и почему работает так странно. Разбираем по пунктикам. Пунктик первый:
Код AS3:
bt_head[i]
- что нам вернет эта конструкция? Она вернет нам i-тый элемент массива.
Сейчас читайте внимательно. На каждой итерации цикла мы делаем следующее
1) берем переменную i
2) берем у переменной i ее текущее значение
3) берем массив bt_head
4) запрашиваем у массива элемент с номером, равным значению i

Зачем я так подробно все это расписываю? Затем что следующее использование аналогичной конструкции работает совсем по-другому. Смотрим:
Код AS3:
function() { buyItem(head[i]); }
Итак, имеем функцию. Функция тоже использует нашу переменную i, но почему-то в функции наша i всегда имеет одинаковое значение! Почему?!
А все просто. Потому что функция не выполняется внутри цикла, она создается внутри цикла. А выполняется она всегда строго после того, как цикл закончился.
А когда цикл закончился, i имеет значение с последней итерации (что логично).
Разбираем по пунктам, что делается на каждой итерации цикла:
1) Создаем новую безымянную функцию
2) Создаем код новой функции
- взять переменную i
- взять у i ее текущее значение
- взять массив head
- ну и дальше все как в прошлый раз
3) Нашу свежую функцию передаем в метод addEventListener в качестве аргумента.

Видите? Вся проблема в словах текущее значение.
В ActionScript переменная i почему-то не просто число, а объект, контейнер, у которого можно спросить его значение. И это большая проблема в таких вот замыканиях.

Но есть и решение. Оно некрасивое и неудобное в общем-то. Но оно есть. Нужно создать для каждой функции свой собственный контейнер для числа. Очень грубо это будет выглядеть вот так:
Код AS3:
while(i<=10)
{
    var listener:Function = getClickListener(i);
    bt_head[i].addEventListener(MouseEvent.CLICK, function(){listener();});
    i++;
}
 
...
 
function getClickListener(i:int):Function
{
    return function():void { buyItem(head[i]) };
}
Вот что тут происходит - когда мы передаем i в getClickListener, создается новый контейнер для числа. Копирование "простых" типов всегда происходит при передаче в новую область видимости. И, соответственно, в новом контейнере всегда хранится именно то значение, что нам нужно. То что было в i на момент итерации цикла.
__________________
...вселенская грусть

Старый 19.10.2014, 11:39
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 15  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Gerbert, честно говоря Вы немного поднадоели. Человек не имеет права не знать как работает цикл?
А если он не знает, то он удостоен Вашего содержательного ответа?
Идите пишите игры, программы, иначе у Вас будет социопатия.

Старый 19.10.2014, 14:02
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 16  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от stepa323 Посмотреть сообщение
Так этот код сделает обработчики с buttons[0] n к концу выполнения цикла i будет равна нулю, то и все buttons будут с указателем i=0 же?
Код AS3:
var i:int = buttons.length;
while( i-- > 0 ){
	buttons[i].addEventListener( MouseEvent.CLICK, buttons_clickHandler );
}
но спасибо, попробую по вашим примерам сделать. Надеюсь сработает
Кнопки "Купить"... их разве несколько? Кнопка одна, а значит и обработчик один. Совсем один. Зачем вам цикл? Создаете переменную, хранящую код выбранного товара, а в вызываемой функции записываете условный оператор, работающий с этим кодом. Каждый раз, когда товар в фокусе меняется, меняете и значение переменной. Так?

P.S. Ссылка неактивна, я не знаю, как у вас там все построено

Старый 19.10.2014, 14:30
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 17  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Цитата:
Gerbert, честно говоря Вы немного поднадоели. Человек не имеет права не знать как работает цикл?
Человек с пятилетним стажем?

Старый 19.10.2014, 14:53
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 18  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
Сообщение от Gerbert Посмотреть сообщение
Человек с пятилетним стажем?
Gerbert, я думаю MikroAcse хотел сказать Вам следующее, что просто нет смысла понукать кого либо в незнании чего либо. Раз человек спрашивает, значит он не знает, иначе он бы и не спрашивал правда? Просто например сообщения вида: "Как вы этого не знаете?" - не несут никакого полезного свойства, они не помогают ни тому, кому нужна помощь, ни Вам, а лишь засоряют тему от начавшихся обоюдных, словесных перепалок.
Я ни в коем случае не пытаюсь "поставить Вас на место", просто хочу показать эту ситуацию со стороны.

Старый 19.10.2014, 15:05
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 19  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
samana, я понимаю, что со стороны это может выглядеть,
как грубость или неадекватность.. Но дело в том, что я не вкладываю в слова отрицательных
эмоций, когда пишу их. Можно было написать -"нет" и это было бы равнозначно, но почему-то
я написал так. Возможно меня задело то, что показав человеку код, он ещё спрашивает - "а работает ли он",
вместо того, чтобы попробовать. В общем, я больше так не буду

Старый 19.10.2014, 16:29
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 20  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
Код AS3:
while(i<=10){
with({i: i}) bt_head[i].addEventListener(MouseEvent.CLICK, function(){buyItem(head[i]);});
i++;
}
Цитата:
В ActionScript переменная i почему-то не просто число, а объект, контейнер, у которого можно спросить его значение.
да не, переменная есть либо указатель на объект, либо примитив.
другое дело место хранения переменной

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

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

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


 


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


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