PDA

Просмотр полной версии : Динамическое создание функций в AS2


point111
29.10.2009, 13:19
Есть массив клипов, который создается динамически, хочется, чтобы процедуры реакции на нажатие каждого клипа тоже генерировались автоматически.
Т.е.:
box[0].onRelease = function () {release_fn (0);};
box[1].onRelease = function () {release_fn (1);};
box[2].onRelease = function () {release_fn (2);};
box[3].onRelease = function () {release_fn (3);};
box[4].onRelease = function () {release_fn (4);};
box[5].onRelease = function () {release_fn (5);};
box[6].onRelease = function () {release_fn (6);};


замениь на что-то типа:

// не рабочий код
for (i=0; i<=totalSlides; i++){
box[i].onRelease = function () {release_fn (i);};
}

исходник для ковыряния:
http://dddcenter.narod.ru/15/15.zip

lexa2000lexa
29.10.2009, 13:35
вот for (i=0; i<=totalSlides; i++){
this["box"+i].id= i;
this["box"+i].onRelease = function () {release_fn (this.id);};
}так

iNils
29.10.2009, 13:37
не так.
1. i общее
2. множество копий одной функции

поэтому так (при условии, что box массив, иначе this["box" + i])
for (var i:Number = 0; i < 7; i++) {
box[i].i = i;
box[i].onRelease = sample;
}

function sample () {
release_fn (this.i);
};

lexa2000lexa
29.10.2009, 13:40
а можно вопрос к iNils ? что вот это значит box[0]

point111
29.10.2009, 14:23
iNils, спасибо!

lexa2000lexa, не прикалывайся, ну ошибся человек, надо

box[i].i = i;
box[i].onRelease = sample;
главное смысл - каждому клипу дается переменная "i", и вот она будет отправляется в "release_fn", а не номер итерации

lexa2000lexa
29.10.2009, 14:33
да каие приколы ,мне даже не понятна вот эта канструкцияbox[i].i
она ведь недолжна работать. либо она должна работать при условии существования клипа box а уже в нем клипы 1-7, но такого не может быть так как флешь не позволяет название клипов числами. Может я просто чегото не знаю , вот поэтому и спрашиваю.

point111
29.10.2009, 14:48
в первой мессаге я выложил рабочий исходник пятнашек, именно из него взяты фрагменты кода, которые здесь обсуждаются.
Общий смысл такой:
1. создаем массив "box"
2. создаем клип и запихиваем его в первый элемент массива

box[a] = this.createEmptyMovieClip ("bx" + a, -16000 + a);
this["bx" + a].createEmptyMovieClip ("xxx",0);
box[a].xxx.loadMovie ("pic" + (1 + a) + ".jpg");

теперь совершенно безразлично, что созданный клип называется "bx" , и что в него вложен другой клип "xxx", (в который я загружаю картинки - ), теперь я обращаюсь к нему как к элементу массива

мне даже не понятна вот эта канструкция

box[i].i = i;
box[i].onRelease = sample;

можно заменить на
for (var i:Number = 0; i < 7; i++) {
box[i].iii = i;
box[i].onRelease = sample;
}

function sample () {
release_fn (this.iii);
trace (this.iii)
};


тебя наверно сбило с толку имя "i" после точки, и ты приравнял его к номеру итерации - но, оно может быть любым

lexa2000lexa
29.10.2009, 15:31
Нет меня ни это смутило, просто я думал что box это клип а не массив , а так тогда все понятно.