PDA

Просмотр полной версии : несколько функций в одном обработчике событий


udaaff
17.07.2007, 03:36
Есть ли какая нибудь возможность записать несколько функций в один и тоже обработчик событий?
К примеру. Я записал функцию в event handler onEnterFrame мувиклипа mc
, можено ли еще приписать функцию в этот же event handler этого же мувика не перезаписывая старую?

Kikasso
17.07.2007, 04:11
Можно, но осторожно. Если вы допишете функцию, а потом еще раз допишете, а потом еще раз...
Что - то вроде
onEnterFrame = function(){ trace(1); }
//сохраним
oef = onEnterFrame;
//перепишем
onEnterFrame = function(){ oef(); trace(2); }
Это чревато. Удобнее пользоваться наборами:
function doSome(){
f1(); // ну просто какие-то функции
f2();
}
function doSomethingElse(){
f1(); // другой набор инструкций
f3();
}
onEnterFrame = soSome;
btn.onPress = function(){
onEnterFrame = doSomethingElse;
}
Извините, что коряво написано, просто принцип. И надо быть осторожным с областью видимости.

udaaff
17.07.2007, 04:28
ни первое, ни второе не подходит к сожалению..
Сформулирую немного подругому... Работает 1 функция в onEnterFrame, если мы запихнем в него другой набор инструкций (1+2), то получается, что первая функция по новой вызовется... а хотелось бы, чтобы она не прерывалась, а просто начала вторая еще работать + к первой в этом же обработчике.

p.s. setInterval пожалуйста не предлагать, мне интересно именно про обработчики

Kikasso
17.07.2007, 04:33
код покажите.

udaaff
17.07.2007, 04:37
да дело не в коде.. я еще не написал, то что задумал, потому что думаю как это лучше реализовать. Чета мне казалось просто что где то как то можно было вот так вот сделать...

Kikasso
17.07.2007, 04:50
Работает 1 функция в onEnterFrame, если мы запихнем в него другой набор инструкций (1+2), то получается, что первая функция по новой вызовется... а хотелось бы, чтобы она не прерывалась, а просто начала вторая еще работать + к первой в этом же обработчике.
Она не _работает_ onEnterFrame, а _срабатывает_ каждый кадр.
Можно включить функцию в оба набора:

function f1(){ trace(1); }
function f2(){ trace(22); }
function f3(){ trace(333); }
function f4(){ trace(4444); }
function do1(){
f1();
f2();
}
function do2(){
f1();
f3();
f4();
}
onEnterFrame = do1;
setTimeout(function(){ trace('---------'); delete onEnterFrame;}, 500);
setTimeout(function(){ trace('---------'); onEnterFrame = do2;}, 2000);
setTimeout(function(){ trace('---------'); delete onEnterFrame;}, 2200);
setTimeout(function(){ trace('---------'); onEnterFrame = do1;}, 4000);
setTimeout(function(){ trace('---------'); onEnterFrame = null;}, 4400);

udaaff
17.07.2007, 04:56
я понимаю, что её можно включить хоть в десять наборов, но вызываться то она по новой будет, после перезаписи онинтерфрэйма, и все что в ней работало, соответственно, начнет работать с начала, а не продолжать функционировать, как будто бы ничего не произошло.

iNils
17.07.2007, 04:56
ни первое, ни второе не подходит к сожалению..
Сформулирую немного подругому... Работает 1 функция в onEnterFrame, если мы запихнем в него другой набор инструкций (1+2), то получается, что первая функция по новой вызовется... а хотелось бы, чтобы она не прерывалась, а просто начала вторая еще работать + к первой в этом же обработчике.Что то как то... я не понял. Что значит не прерывалась?

Самый простой способ, это создать массив методов и их аргументов и флаг запуска, и внутри onEnteFrame в цикле из прогонять. Так можно менять порядок их вызова, удалять, добавлять, аргументы, а через флаг запускать вызов или нет.

udaaff
17.07.2007, 05:06
Что то как то... я не понял. Что значит не прерывалась?
я отвечал на пост кикассо, где он предложил использовать группы функций. То есть сгрупировать первыю со вротой, вторую с третьей. Если первыю группу работающую в онинтерфрэйме заменить второй, то вторая функция начнет работать "сначала".

Самый простой способ, это создать массив методов и их аргументов и флаг запуска, и внутри onEnteFrame в цикле из прогонять. Так можно менять порядок их вызова, удалять, добавлять, аргументы, а через флаг запускать вызов или нет. -- самый действенный вариант по всей видимости.

Kikasso
17.07.2007, 05:09
Извините, а где начало у функции?

udaaff
17.07.2007, 05:11
к примеру.. работает счетчик i++ в функции
ты ее вызвал по новой счетчик соотвественно стал отсчитываться тоже по новой

Kikasso
17.07.2007, 05:45
Вы чуствуйте разницу между работает и срабатывает?
Функция именно срабатывает. В вашем случае каждый кадр.