PDA

Просмотр полной версии : цикл создаёт кнопки.


bettrrr
18.09.2007, 19:26
AS2 создаёт некоторое количество кнопок при помощи ф-ции _root.createEmptyMovieClip.
во время создания каждой из кнопок в клипе-кнопке рисуется прямоугольник, который будет областью для клика.

После компиляции, при нажатии на любую кнопку происходит переход не на разные ссылки, а на одинаковую, независимо от того, на какую кнопку я нажал.

for(i in ppmn){
buttonAttrib = ppmn[i].attributes;
_root.createEmptyMovieClip(buttonAttrib.id, _root.getNextHighestDepth());
//подготовка переменных с координатами для рисования квадрата
x1 = Number(buttonAttrib.x);
y1 = Number(buttonAttrib.y);
x2 = (Number(buttonAttrib.x) + Number(buttonAttrib.w));
y2 = (Number(buttonAttrib.y) + Number(buttonAttrib.h));
//Рисование квадрата
with (_root[buttonAttrib.id]) {
useHandCursor = true
beginFill (buttonAttrib.x + 10, buttonAttrib.y + 10);
moveTo (x1, y1);
lineTo (x2, y1);
lineTo (x2, y2);
lineTo (x1, y2);
lineTo (x1, y1);
endFill ();
}
//События
_root[buttonAttrib.id].onRelease = function () {
trace(buttonAttrib.url);
SWFAddress.setValue(buttonAttrib.url);
}
_root[buttonAttrib.id].onRollOver = function() {
SWFAddress.setStatus(buttonAttrib.url);
}
_root[buttonAttrib.id].onRollOut = function() {
SWFAddress.resetStatus();
}
_root.error_txt.text = _root.error_txt.text + buttonAttrib.x;
}


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

PS: После решения проблемы со ссылками, как мне сделать, чтобы кнопки нажимались, но их небыло видно? Альфа = 0 - это тру?

++++++++++++++++++++++++++++++++++++++++++++++++++++++

Теперь появилось другое предполажение, что проблема тут:

_root[buttonAttrib.id].onRelease = function () {
trace(buttonAttrib.url);
SWFAddress.setValue(buttonAttrib.url);
}

возможно после завершения цикла, строка SWFAddress.setValue(buttonAttrib.url); для каждой из кнопок имеет именно такой вид (вуквально), а не то, что я бы хотел получить.

Мне надо, чтобы после выполнения цикла, у меня для каждой кнопки эта строка имела вид:
SWFAddress.setValue("моё значение");
,а не
SWFAddress.setValue(buttonAttrib.url);

udaaff
18.09.2007, 20:40
Не тестировал, но должно работать.
function generator(url:String):Function {
return function () {
trace(url);
SWFAddress.setValue(url)
};
}
for (i in ppmn) {
buttonAttrib = ppmn[i].attributes;
_root.createEmptyMovieClip(buttonAttrib.id, _root.getNextHighestDepth());
// ---- второй способ
_root[buttonAttrib.id].url = buttonAttrib.url
//
//подготовка переменных с координатами для рисования квадрата
x1 = Number(buttonAttrib.x);
y1 = Number(buttonAttrib.y);
x2 = (Number(buttonAttrib.x)+Number(buttonAttrib.w));
y2 = (Number(buttonAttrib.y)+Number(buttonAttrib.h));
//Рисование квадрата
with (_root[buttonAttrib.id]) {
useHandCursor = true;
beginFill(buttonAttrib.x+10, buttonAttrib.y+10);
moveTo(x1, y1);
lineTo(x2, y1);
lineTo(x2, y2);
lineTo(x1, y2);
lineTo(x1, y1);
endFill();
}
//События
// ---- первый способ
_root[buttonAttrib.id].onRelease = generator(buttonAttrib.url)
// ---- второй способ
_root[buttonAttrib.id].onRollOver = function() {
SWFAddress.setStatus(this.url);
};
//
_root[buttonAttrib.id].onRollOut = function() {
SWFAddress.resetStatus();
};
_root.error_txt.text = _root.error_txt.text+buttonAttrib.x;
}

PS: Чтобы не было видно кнопок, но они нажимались: _root[buttonAttrib.id]._alpha = 0

udaaff
18.09.2007, 21:26
bettrrr, если на ваше сообщение уже ответили не нужно его редактировать, создавайте новый пост.
_root[buttonAttrib.id].onRelease = function () {
trace(buttonAttrib.url);
SWFAddress.setValue(buttonAttrib.url);
}
buttonAttrib -- это переменная которыю вы создаете при первой итерации, в последующих ее значение постоянно перезаписывается, следоватьельно, ваши функции, ссылки на которые вы записываете в обработчики, будут использовать последнее значение, которое запишется в buttonAttrib. Я предложил два действующих варианта, следовательно, ошибка в другом месте.

bettrrr
19.09.2007, 12:09
bettrrr, если на ваше сообщение уже ответили не нужно его редактировать, создавайте новый пост.
_root[buttonAttrib.id].onRelease = function () {
trace(buttonAttrib.url);
SWFAddress.setValue(buttonAttrib.url);
}
buttonAttrib -- это переменная которыю вы создаете при первой итерации, в последующих ее значение постоянно перезаписывается, следоватьельно, ваши функции, ссылки на которые вы записываете в обработчики, будут использовать последнее значение, которое запишется в buttonAttrib. Я предложил два действующих варианта, следовательно, ошибка в другом месте.
Вы ответили в процессе редактирования мною моего поста :).

Про buttonAttrib я понял, предварительно сломав себе мозг, т.к. я привык к другому поведению кода. Нажал на ссылку, заново выполнился скрипт и т.п. (разовое линейное выполнение кода). Если бы я такое написал на PHP, то всё бы прекрасно работало.

Я думал, что этот цикл создаст кучу кнопок, и каждой назначит обработчик, а в этот обработчик передаст (присвоит) ЗНАЧЕНИЕ переменной.
А оказалось, что в обработчик передаётся ссылка на область памяти, которая после отработки цикла, содержит последнее значение.

Второй способ не работает так, как мне это надо, т.к. у меня нет this.url, а первый работает, что мне не понятно.



поясните пожалуйста, чем для плеера отличаются ваш первый способ и мой? Т.е. почему в вашем способе используется значение переменной текущего шага цикла, а не последнее?

udaaff
19.09.2007, 22:43
На счет второго способа. Возможно вы упустили момент:
_root[buttonAttrib.id].url = buttonAttrib.url
По поводу первого. Ссылки в возвращаемых функциях указывают на параметры, указанные при генерации (т.е. на локальные переменные генерирующей функции), которые, по всей видимости, не удаляются (возможно, от того, что на них и указывают эти ссылки).