Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обобщил код Listener, и он теперь срабатывает максимум 1 раз (http://www.flasher.ru/forum/showthread.php?t=131746)

Furinax 27.10.2009 15:36

Обобщил код Listener, и он теперь срабатывает максимум 1 раз
 
Вот так работает как надо при каждом возникновении события.
Код AS3:

        private function place (e:MouseEvent):void {
                e.target.stopDrag();
                if (e.target.hitTestObject (pack2)) {
                        if (e.target.index == 1) {
                                e.target.index = 2;
                                itemsInPack1--;
                                itemsInPack2++;
                                numberOfItems1.text = itemsInPack1.toString();
                                numberOfItems1.setTextFormat (format)
                                numberOfItems2.text = itemsInPack2.toString();
                                numberOfItems2.setTextFormat (format)
                        };
                };
        };

А вот так срабатывает 1 раз при возникновении события, а потом работать перестает.
Код AS3:

        private function place (e:MouseEvent):void {
                e.target.stopDrag();
                if (e.target.hitTestObject (pack2)) {
                        if (e.target.index == 1) {
                                e.target.index = 2;
                                updateNumberOfItems (itemsInPack1, itemsInPack2, numberOfItems1, numberOfItems2);
                        };
                };
        };
 
        private function updateNumberOfItems (toReduce:Number, toEnlarge:Number, textToUpd1:TextField, textToUpd2:TextField):void {
                toReduce--;
                toEnlarge++;
                textToUpd1.text = toReduce.toString();
                textToUpd1.setTextFormat (format)
                textToUpd2.text = toEnlarge.toString();
                textToUpd2.setTextFormat (format)
        };

Почему так происходит и как с этим бороться?

SamFR 27.10.2009 15:54

Мистику какую-то вы нам рассказываете) Вы точно уверены, что больше ничего не меняли?
И за какое событие отвечает обработчик place?

Furinax 27.10.2009 15:57

Серьезно, код№1 работает. А код№2 србатывает один раз, а потом перестает работать.
Листенер отвечает за MouseEvent.MOUSE_UP.
Как видно, код№2 ничего больше не меняет, чего бы не менял код№1.
Самый прикол: что в коде№2 обобщенная функция вызывается, но
Код AS3:

        toReduce--;
        toEnlarge++;

во второй раз не срабатывают

silin 27.10.2009 16:18

itemsInPack1, itemsInPack2 передаются в функцию по значению и меняются там как локальные переменные, сами же не меяются
возможно из-за этого ломается что-то в общем алгоритме

к слову, зачем ты их передаешь, если они члены класса?

Furinax 27.10.2009 16:56

itemsInPack1, itemsInPack2, также как и numberOfItems1, numberOfItems2 - это переменные экземпляра. Чтобы каждый раз не писать:
Код AS3:

itemsInPack1--
itemsInPack2++

Решил написать обобщенную функцию. Но она, к сожалению не работает больше 1 раза.
А если в обобщенной функции все локальные переменные определить как переменные экземпляра - то это нормальное решение?

silin 27.10.2009 17:10

ну сам подумай, если в методе к ним и так есть доступ зачем их передавть в аргументах

Furinax 27.10.2009 17:21

Передаю в аргументы потому, что у меня очень много операторов if в усорвия которых будут входить и itemsPack3, и numberOfItems3 и т.д. Если для каждого из них столько расписывать, сколько в коде 1, то потом чтоб разобраться - придется в коде очень долго копаться. А тут одна функция, по которой все должно быть видно.
Осталость только додуматься, как при её повторном вызове менять переменную экземпляра больше чем 1 раз.

Felicast 27.10.2009 17:34

попробуйте сделать так
Код AS3:

trace(itemsInPack1);
updateNumberOfItems (itemsInPack1, itemsInPack2, numberOfItems1, numberOfItems2);
trace(itemsInPack1);

может поймете в чем ошибка.
значение itemsInPack1 не изменится
чтобы все работало, нужно, чтобы itemsInPack1 и itemsInPack2 изменялись не в функции, а перед
вот пример:
Код AS3:

updateNumberOfItems (--itemsInPack1, ++itemsInPack2, numberOfItems1, numberOfItems2);
 
///////////////
 
private function updateNumberOfItems (toReduce:Number, toEnlarge:Number, textToUpd1:TextField, textToUpd2:TextField):void
{
        textToUpd1.text = toReduce.toString();
        textToUpd1.setTextFormat (format)
        textToUpd2.text = toEnlarge.toString();
        textToUpd2.setTextFormat (format)
};

надеюсь понятно, к чему я клоню

silin 27.10.2009 17:38

Цитата:

Сообщение от Furinax (Сообщение 861200)
Передаю в аргументы потому, что у меня очень много операторов if в усорвия которых будут входить и itemsPack3, и numberOfItems3 и т.д. Если для каждого из них столько расписывать, сколько в коде 1, то потом чтоб разобраться - придется в коде очень долго копаться. А тут одна функция, по которой все должно быть видно.
Осталость только додуматься, как при её повторном вызове менять переменную экземпляра больше чем 1 раз.

все верно, функции/методы для того и нужны
просто имей ввиду, что простые типы, если ты передаешь их в функцию, передаются по значению, т.е. так ты сможешь только воспользоваться значением _num, но не изменить его:
Код AS3:

public class Main extends Sprite 
{
        private var _num:Number = 0;
        public function Main():void
        {
 
                increaseNum(_num);
                trace( "_num : " + _num );//_num : 0
 
        }
        private function increaseNum(par:Number):void
        {
                par++;
                trace( "par : " + par );//par : 1
        }
}

из-за этого, похоже, все и ломается в твоем примере

Furinax 27.10.2009 17:39

Спасибо огромное! Никогда бы не догадался, что можно увеличивать аргумент прямо передавая его в функцию. Теперь это будет новым приемом в моем арсенале :)


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

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