PDA

Просмотр полной версии : Проблема с обновлением картинки


Dub_Alex
08.12.2005, 15:59
Есть следующий код
function inObl(){
parent_text_city.nextFrame();
}

...

function obl(){
while(parent_text_city._currentframe<11){
IDInterval=setInterval(inObl(), 500);
updateAfterEvent();
}
}

Через трассировку смотрю - номер кадра увеличивается, но на экране ничего не обновляется, хотя с 1 по 11 кадр должна меняться _alpha от 0 до 100%. Обновление происходит после выхода из функции-обработчика
_root.mc.onRollOver = function() {
obl()
};
Но вся обработка происходит в функции obl() и нужно чтобы обновление происходило именно по ходу выполнения этой функции.
Прошу помочь.

Dimchansky
08.12.2005, 16:29
1. setInterval(inObl(), 500); - неправильный синтаксис. Нужно записать вот как: setInterval(inObl, 500); т.е. вместо значения функции нужно ставить имя функции (без скобок)

2. Цитата: updateAfterEvent - функция; перерисовывает экран(не зависит от установленной для документа частоты кадров) при вызове ее в обработчике событий onClipEvent() или ИЗ ФУНКЦИИ/МЕТОДА, вызываемых посредством setInterval(). Flash игнорирует все прочие вызовы updateAfterEvent.
Ставь updateAfterEvent() в функцию inObl().

3. интервал в 500 мс означает, что функция будет вызываться 2 раза в секунду. Частота смены кадров по умолчанию - 12.

Dub_Alex
08.12.2005, 16:50
1. имя функции без скобок - это я знаю. В этом случае при трассировке все, что вызывается посредством setInterval() выполняется в самую последнюю очередь, т.е. если бы в функции mc.OnRollOver после inObl стояла еще пара функций, то сначала выполнились бы они, а потом setInterval(). Такой вариант меня, к сожалению тоже не устраивает.
2. Я сделал:
function inObl(){
parent_text_city.nextFrame();
updateAfterEvent();
}
но изменений никаких нет. Попрежнему не обновляется.
3. С этим пунктом у меня, кстати, тоже трудности. Я ставил интервал в 5 мс. но кадры идут гораздо медленнее. fps стоит 120. Если можно, прошу пояснить, с чем это может быть связано.

Dub_Alex
08.12.2005, 17:12
Я довольно невнятно обрисовал ситуацию. Хочу немного поправить. setInterval(inObl, 500), т.е. inObl без скобок - это хороший вариант. Он работает. Проблема в том, что пока мы не пробежимся по всем 11 кадрам, вызвать clearInterval я не могу.
Пример: я навожу мышь на объект mc, срабатывает событие onRollOver, в нем выполняется setInterval (соответственно в функции inObl выполняется nextFrame.
Доходим до 6 кадра и я убираю мышь с объекта. После этого сразу должно выполняться событие onRollOut. А на самом деле получается, что сначала проходит до конца ролика (до 11 кадра), а затем начинает выполняться onRollOut.
Надеюсь, этим сообщением я помог понять смысл моей проблемы, а не запутал еще больше.

Dimchansky
08.12.2005, 17:31
насколько я понял, перед тобой стоит задача при наведении мышки на кнопку запустить мувик и дать ему проиграться до конца, независимо от того, будет ли мышка убрана с кнопки.

_root.mc.onRollOver = function() {
if(parent_text_city._currentFrame == 1) parent_text_city.play();
};

_root.mc.onRollOut = function() {
//никаких действий для parent_text_city
}

а что касается clearInterval - для этого нужно знать, какой интервал очищать.
var my_interval=setInterval(someFunction,some_time);
.
.
.
clearInterval(my_interval);

Dub_Alex
08.12.2005, 17:46
Нет, наоборот. Задача в том, чтобы при наведении на MOVIECLIP (а не кнопка) этот movieclip запускался, а если мышка убрана - проигрывание сразу останавливается (независимо от того, проиграли мы все кадры или нет) и сразу запускается onRollOver.
Что касается clearInterval, то имя интервала я знаю. Я не могу перейти к строке, в которой записано:
clearInterval(my_interval)
до тех пор, пока не проиграются все 11 кадров.

nyctota
08.12.2005, 19:40
а нельзя этот мувиклип запихать в кнопку в "Over"? и все проблемы сразу решатся =/

Dub_Alex
09.12.2005, 12:15
У меня таких мувиков около 30. Для каждого создавать кнопку - это не очень хорошо, по-моему. Нельзя ли найти другой выход?
Быть может можно изменить функцию следующим образом:
function obl(){
if ((parent_text_city._currentframe<11) and (MC.ONROLLOVER()){
IDInterval=setInterval(inObl(), 500);
}
}
Т.е. меня интересует, можно ли в условии if проверять, находится мышь в пределах мувиклипа или нет?

nyctota
09.12.2005, 12:30
можно в событии "on (rollOver)" кнопки устанавливать какое-то определенное значение какой-либо переменной, а в условии if его проверять... вот...
но, соответственно, будет задержка, зависящая от того, как часто ты эту переменную проверяешь... попробуй -- может в твоем случае это некритично.

Dub_Alex
09.12.2005, 12:54
Основная проблема в том, что я не могу выйти из функции inObl(), которую использует setInterval, до тех пор пока не пробегусь по всем 11 кадрам. Следовательно, я не смогу проверять эту переменную. Все сводится к тому, что мне нужно узнать, когда мышь покинула область мувиклипа и сразу после этого выйти из функции inObl() не доигрывая мувиклип до конца, а просто прерывая его на том кадре, до которого он дошел.

nyctota
09.12.2005, 12:57
да, кстати, можно и не создавать разные кнопки для разных мувиков, а сделать что-то вроде этого:

в батон во фрейм "Over" пихаешь пустой мувик, в котором аттачишь из библиотеки мувик (скажем, "mc" + кусок имени кнопки) и все..

нужно только кнопки называть одинаково в каким-то индексом (типа "but1", "but2" и т.д.) и мувики соответственно ("mc1", "mc2" и т.д.) или типа того %)

MOHCTEP
10.12.2005, 00:58
Вот так устраивает?

_sestra_
10.12.2005, 19:47
Дело в том, что while можно прервать только break; другие события, как ты уже заметил, будут выполнятся только после завершения цикла...
Лучше вообще убрать цикл и поставить проверку на Out...

примерно так:

//parent_text_city.stop();
function inObl(AParent) {
parent_text_city.nextFrame();
if (parent_text_city._currentframe >= 11 || !Play) {
clearInterval(AParent.IDInterval);
}
}
function obl() {
//......
IDInterval = setInterval(inObl, 50, this);
updateAfterEvent();
}
parent_text_city.onRollOver = function() {
//......
Play = true;
obl();
}
parent_text_city.onRollOut = function() {
//......
Play = false;
}


надеюсь поможет ;)