PDA

Просмотр полной версии : Функция не возвращает переменную.


AlexBob
21.09.2011, 13:53
Добрый день!
Есть такой код, который отлично работает (благодаря помощи Goodguy).
В функции четко определено имя мувиклипа, поэтому нет возможности функцию использовать в другом кадре с другими мувиклипами.


SE_mc.stop();
SE_mc.visible=false;

function SyncMovies1(event:Event):void
{
if (Raduga_mc.currentFrame == 7)
{
SE_mc.gotoAndPlay(1);
SE_mc.visible=true;
Raduga_mc.removeEventListener(Event.ENTER_FRAME, SyncMovies1);
}
}
Raduga_mc.addEventListener(Event.ENTER_FRAME, SyncMovies1);

Я решил изобразить нечто такое:



var Sost:Number = 0;
function SyncMovies1(event:Event):Number
{
if (Raduga_mc.currentFrame == 7)
{
Sost = 1;
return Sost; }
else
{
Sost = 2;
return Sost; }
}

trace (Sost);

if (Sost == 1)
{
SE1_mc.gotoAndPlay(1);
SE1_mc.visible=true;
SE2_mc.gotoAndPlay(1);
SE2_mc.visible=true;
}


Trace выдает 0, значит функция не передает переменную.
Что можно сделать? Или для каждого кадра надо определять свою функцию со своим набором мувиклипов?

BezDelnik
21.09.2011, 13:56
перед трейсом напишите:
Sost = SyncMovies1(null);

AlexBob
21.09.2011, 14:21
Шайтан! :)
Всё работает! СПАСИБО!
Теперь буду разбираться в чем магия выражения Sost = SyncMovies1(null);

Ещё, самое интересное, что если оставить этот Trace (Sost); то теперь выдает "2", а если вообще убрать Trace, то всё работает как надо и условие выполняется. Не думал, что Trace на что-то вообще влиять может.

BezDelnik
21.09.2011, 14:26
трейс и не влияет.. разве что на время выполенния.. копайте глубже :)

AlexBob
21.09.2011, 15:40
Получается что проверка условия if (Sost == 1) производится только 1 раз. А как сделать, чтобы условие проверялось после каждого события (перехода на новый кадр)?

BezDelnik
21.09.2011, 16:15
Raduga_mc.addEventListener(Event.ENTER_FRAME, SyncMovies1);
function SyncMovies1(event:Event):void {
if (Raduga_mc.currentFrame == 7) {
Sost = 1;
} else {
Sost = 2;
}

if (Sost == 1) {
SE1_mc.gotoAndPlay(1);
SE1_mc.visible=true;
SE2_mc.gotoAndPlay(1);
SE2_mc.visible=true;
}
}


чем так не устраивает?

AlexBob
21.09.2011, 16:28
Сейчас у вас два условия в одной функции. И если понадобится синхронизировать Raduga_mc с , например, SE4...,SE5..., SE6... надо будет определять новую функцию. Поэтому я и пытаюсь запускать SE-мувики вне функции.
Думаю попробовать через цикл While или For.

fish_r
21.09.2011, 16:53
Raduga_mc.addEventListener(Event.ENTER_FRAME, SyncMovies1);

function SyncMovies1(event:Event):void
{
if (Raduga_mc.currentFrame == 7)
{
checkSost(1);
} else {
checkSost(2);
}


}

function checkSost(nm:Number):void
{
if ( nm === 1 )
{
SE1_mc.gotoAndPlay(1);
SE1_mc.visible=true;
SE2_mc.gotoAndPlay(1);
SE2_mc.visible=true;
}
}



?

Добавлено через 3 минуты
Наверняка всё можно ещё проще и универсальнее сделать, но не видя задачи трудно продуктивнее что то подсказать.

AlexBob
21.09.2011, 16:58
Правильно я понимаю, что и в этом случае, например, в 4м кадре надо будет свою функцию определять?


function checkSost4(nm:Number):void
{
if ( nm == 1 )
{
SE5_mc.gotoAndPlay(1);
SE5_mc.visible=true;
SE6_mc.gotoAndPlay(1);
SE6_mc.visible=true;
}
}


Для новых SE... Я вот думал уйти от большого количества функций. Но если никак не получится, тогда да :)

fish_r
21.09.2011, 17:00
а чем вас пугает кол-во функций? в программировании очень популярно правило: "разделяй и властвуй" :),
так что плодите, не стесняйтесь :)

Добавлено через 2 минуты
Главное чтобы они проясняли структуру программы, а не запутывали её

AlexBob
21.09.2011, 17:19
Да, вы правы! Другого ничего не придумать :)
Спасибо за помощь!