Форум 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)
-   -   onRelease = function() (http://www.flasher.ru/forum/showthread.php?t=121983)

sector_222 27.02.2009 23:11

onRelease = function()
 
не пойму почему в коде
Код AS1/AS2:

function Vertical() {
 
        /******id темы - для обращения к базе и вывода горизонтального списка************/
        /****************************************************************/
        //обработчик для передачи параметров
        formData = new LoadVars();
        //при загрузке флешки в пустое поле выводить сообщение
        formData.onLoad = function(success:Boolean) {
                if (success) {
 
                        //стартовая позиция картинок по X
                        var startXv:Number = vert_x;
                        //стартовая позиция картинок по Y
                        var startYv:Number = vert_y;
                        //текущая координата картинки
                        var currImageXv:Number = 0;
 
                        // создаём пустой клип с нужными координатами для панели прокрутки с мелкими фотками
                        _root.createEmptyMovieClip("container_mcV",_root.getNextHighestDepth());
                        container_mcV._x = vert_x;
                        container_mcV._y = vert_y;
 
                        //вносим список имён тем в массив
 
                        var my_str1:Array= formData.name_tema
                        var nameTemes_array = new Array();
                        nameTemes_array = my_str1.split("$$");
 
                        //вносим ID тем
                        var my_str2:Array= formData.id_tema;
                        var idTemes_array = new Array();
                        idTemes_array = my_str2.split("$$");
 
                        _global.sdvigV = _global.imageShift * (nameTemes_array.length-1);
                        //пока не кончится все фотки  загружаем их в контейнер
 
 
                        for (var i = 0; i<nameTemes_array.length-1; i++)
                        //for (var i = 0; i<3; i++)
                        {               
                                //добовляем картинку из библиотеки
                                var tema:MovieClip = _root.container_mcV.attachMovie("tema","tema"+i,i);
                                //оптимизируем скрипт создавая переменную tema передавая ей ссылку на нашу картинку
 
 
                                tema._x = startXv;
                                tema._y = startYv;
                                //выщитываем новую координату для следующей картинки
                                startYv += tema._height+_global.imageShift;
 
 
 
                        tema.temaText.text = nameTemes_array[i];
                                //массивы для передачи ID темы и имя темы чтобы передать функции отображения
                                //горизонтального списка
                                tema.IdKey_array = idTemes_array[i];
                                tema.IdName_array = nameTemes_array[i];
 
 
 
                        //принажатии на изображение вызываем горизонтальную панель
                        tema.onRelease = function() {
 
                                Gorizontal(idTemes_array[i],nameTemes_array[i]);
                                /*var test:MovieClip = _root.main.attachMovie("test","test",_root.getNextHighestDepth());
                                test._x = 100;
                                test._y = 100;
 
                                //test.test_txt.text = "ПРОБА";
                                test.test_txt.text =i;*/

                                //trace(i);
 
                        };
            //при наведении на изображение - прозрачность на 50%
                        tema.onRollOver = function() {
                                this._alpha = 50;
                        };
            // и наоборот
                        tema.onRollOut = function() {
                                this._alpha = 100;
                        };
 
                        if (i == 0)//если первый запрос то загружаем сразу первую temu
                {                                              //здесь вызов срабатывает
                                        //Gorizontal(idTemes_array[i],nameTemes_array[i]);
                }
 
                                createMaskVert();
                                //scrolling();
 
                }
 
 
                } else{
                                //tema.temaText.text = "Error loading/parsing LoadVars.";
            }
 
 
        };
        //обмен данными с MySQL значения объекта formData методом POST
        formData.sendAndLoad('phpinitializ.php',formData,'POST');
 
 
 
}

в цикле
Код AS1/AS2:

test.test_txt.text =i;

всегда равен
Код AS1/AS2:

nameTemes_array.length-1

а хотелось бы чтобы равен номеру кнопки которой вызываю функцию.
т.е. не получается передать значение переменнной из массива в зависимости от номера кнопки( мувика) в списке. подскажите пожалуйста где накосячил? :umnik2:

Добавлено через 3 минуты
.т.е. в данном коде при нажатии кнопок tema0, tema1, итд - вызываеться Gorizontal(idTemes_array[i],nameTemes_array[i]); где i равно наибольшему i в этом цикле =(

Fatality 27.02.2009 23:29

Дело в том, что событие onRelease, будет вызываться после выполнения цикла. Соответственно i равно своему последнему значению. Чтобы данная конструкция работала нормально, необходимо выполнить привязку переменной i в текущей итерации цикла, к конкретному клипу. Но, так как даная привязка уже выполнена(глубина клипа), можно сделать так
Код AS1/AS2:

tema.onRelease = function() 
{
var id:Number = this.getDepth();
Gorizontal(idTemes_array[id], nameTemes_array[id]);
}


iNils 27.02.2009 23:31

Код AS1/AS2:

for (var i = 0; i < nameTemes_array.length - 1; i++) {
        ...
        tema.onRelease = function () {
                Gorizontal (idTemes_array[i], nameTemes_array[i]);
        };
}

В момент вызова onRelease, i имеет совсем другое значение. Поэтому нужно для конкретного клипа сохранить значение i во внутреннюю переменную.

sector_222 27.02.2009 23:34

спасибо =)
век живи - век учись

Добавлено через 1 минуту
Код AS1/AS2:

tema.onRelease = function() 
{
var id:Number = this.getDepth();
Gorizontal(idTemes_array[id], nameTemes_array[id]);
}

так и сделал =) :drinks:

scarbo 28.02.2009 00:57

Вообще,от такой конструкции в циклах mc.onRelease(или on_любой_обработчик_событий) = function(){},лучше отказаться,а использовать
Код AS1/AS2:

for(var i=0;i<10;i++){
var mc:MovieClip = target['mc'+i];
mc.id = i;//сохранили id мувика
mc.onRollOver = mcOver;
mc.onRollOut = mcOut;
mc.onPress = mcPress;
}
//а теперь уже за циклом описываем эти функции
function mcOver(){
trace(this);
}
function mcPress(){
trace(this.id);
}

Но это сугубо мое личное мнение,просто так код приятнее выглядит,и более четко разбит по блокам.

sector_222 28.02.2009 15:18

ну так ещё грамотней - спасибо, запомню


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

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