Форум 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=155165)

HorusWM 29.04.2011 02:44

Последовательность выполнения условий
 
Впервые столкнулся с этим на as2, на 3й версии таких вещей я не наблюдал. Есть вот такое условие в событии onMouseUp:
Код AS1/AS2:

if (то-то && (то-то == undefined || то-то == null || то-то == temp))
{
    trace("+");
    Add(temp._name);
    temp.Destroy();
    temp = null;
}
else if (temp != null)
{
    trace("-");
    temp.base.Add(temp._name);
    temp.Destroy();
    temp = null;
}

Проблема заключается в том, что всегда сначала выполняется альтернативное условие и только потом главное. Причем даже когда главное условие вполне выполнимо, я всеравно получаю в окне трассера сначала "-" и только потом "+". А если вынести temp.Destroy(); и temp = null; под условие, что было бы логично для упрощения кода, то сначала выполнятся вообще эти две строчки. Тоесть все работает задом-наперед. Может просто я уже сплю и чего-то не понимаю, подскажите)

dark256 29.04.2011 03:12

Явно уже спите :)
Булева алгебра. Приоритет выполнения логических операций.

if (то-то && (то-то == undefined || то-то == null || то-то == temp))

Какая-то странаня конструкция. Если "то-то" - булевая, то условия всегда FALSE, если оно НЕ булевое, то и подавно false и вообще оно не будет нормально работать :)

HorusWM 29.04.2011 12:02

Нет, там все нормально, иначе я бы не получал трассера из этого блока. Вот эта строка:
if (CheckItem(temp) && (this.child == undefined || this.child == null || this.child == temp))
CheckItem и возвращает булево значение, я просто сократил код за ненадобностью, трассер-то работает. Прочитайте внимательно, пожалуйста, мой пост - я получаю оба трассера. Кроме того, если убрать альтернативный блок после else, то все будет работать как надо.
Еще такая вещь - если добавить в else каких-нибудь бессмысленных условий, но чтобы их было много, то последовательность выполнения становится нормальной. Неужели компилятор бросается выполнять сначала то, что проще?

Crazy 29.04.2011 12:37

Цитата:

Сообщение от HorusWM (Сообщение 992757)
Неужели компилятор бросается выполнять сначала то, что проще?

Для начала добавьте trace перед первым if'ом, чтобы убедиться, что код вызывается только один раз. Есть вероятность, что Вы получаете два вызова -- в первом попадаете во второй блок, во втором -- в первый.

HorusWM 29.04.2011 13:14

Да, все верно, само событие onMouseUp вызывается на всех инстансах класса, которые находятся на сцене. Этого можно как-то избежать?

dark256 29.04.2011 13:21

не цепляйте onMouseUp на ВСЕ инстансы....
или выполняйте только для активного элемента...

HorusWM 29.04.2011 13:24

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

Все, разобрался - создал вложенную функцию onMouseUp в функции onMouseDown с условием фокуса на определенном мувике.

За идею благодарен обоим, спасибо.


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

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