PDA

Просмотр полной версии : goToAndPlay, scene. Трабл


AHKHOBA
09.03.2011, 19:09
Неожиданно столкнулась с проблемой перехода на другую сцену из клипа.
Структура такая: есть несколько сцен. На первой лежит клип, в котором кнопка, при нажатии на которую должен осуществляться переход на другую сцену. Однако не работает. Что меня удивляет, даже запись вида:
on (press) {
_root.gotoAndPlay("Scene 2", 1);
}
не дает нужного эффекта.
Пробовала на главной (первой) сцене создать функцию перехода, которая бы и вызывалась из кнопки. Однако же параметр scene должен быть в кавычки заключен, не воспринимается просто в виде строковой переменной.

Подскажите, как справиться с этой тонкостью, пожалуйста.

iNils
09.03.2011, 19:12
Неожиданно столкнулась с проблемой перехода на другую сцену из клипа.
Запись вида gotoAndPlay (сцена, кадр) работает только из основного таймлайна, из клипов она не работает.

AHKHOBA
09.03.2011, 19:26
да, это я уже поняла. Но должен же быть другой путь?.. Вы знаете?

mooncar
09.03.2011, 19:29
Вообще не пользоваться сценами - это неудобно и неправильно с т.зр. организации проекта.
От них уходят сразу после знакомства с флешем.

AHKHOBA
09.03.2011, 19:33
та я знаю. Но я всего лишь вношу изменения в готовый проект, который изначально был так дурацки скомпонован. А разносить все 25 сцен по клипам - не оправдывается ничем. Но спасибо Вам за ответы

mooncar
09.03.2011, 19:51
Тогда попробуйте так. На главном таймлайне организуйте функцию вида
function goNext(scene:String, frm:Number)
{
gotoAndPlay(scene, frm);
}
Код в кадре, разумеется.

И вызывайте ее откуда угодно:
_root.goNext('Scene 2', 1);

AHKHOBA
09.03.2011, 19:55
а может можно средствами actionscript выполнить команду, заданную строкой?

Насколько я помню, в некоторый языках за это отвечала функция eval (которая во флеше какую-то другую роль выполняет). Было бы так, если бы работала:
_root.command = 'gotoAndPlay("Scene 11", 1)';
eval(_root.command);

ну а есть вместо eval такая функция в actionscript?

mooncar
09.03.2011, 19:57
А чем мое решение не устраивает? Собственно то, что вы пытаетесь сделать с eval (которая тут вряд ли поможет), давно и прочно делается с помощью функций.

AHKHOBA
09.03.2011, 19:58
Тогда попробуйте так. На главном таймлайне организуйте функцию вида
function goNext(scene:String, frm:Number)
{
gotoAndPlay(scene, frm);
}
Код в кадре, разумеется.

И вызывайте ее откуда угодно:
_root.goNext('Scene 2', 1);

да пробовала же. Не нравится компилятору, что я сцену в виде переменной задаю - без кавычек. Ругается, и все портит

mooncar
09.03.2011, 20:03
да пробовала же. Не нравится компилятору, что я сцену в виде переменной задаю - без кавычек. Ругается, и все портит
Да, я ясно. Беда с этими сценами. Увы, не знаю, как быть.

iNils
09.03.2011, 20:43
ну а есть вместо eval такая функция в actionscript?Нет. Eval выполняет туже роль, что и в JS, только возможности ее урезаны. Связано это с тем, что код JS интерпретируется самим бразуером, а AS поступает флеш-плееру в виде скомпилированного байт-кода, и если бы eval обладал теме же возможностями, что и в JS, то в плеер пришлось бы встраивать компилятор.

Bred45
18.01.2012, 22:59
Столкнулся с этой же проблемой.
Решение так и не нашлось? :(

mooncar
18.01.2012, 23:29
Сожалею, но решение - не надо пользоваться сценами. С ними только неудобства, пользы ноль.

crazyone
19.01.2012, 03:45
Насколько я знаю, сцены в ас2 нигде не сохраняются, а все вызовы типа gotoAndStop("Scene 2",4); меняются компилятором на gotoAndStop(<Scene 2 firstframenum>+4)); поэтому можно сделать что-то похожее - при старте посчитать первые кадры сцен и потом считать - куда переходить. Правда переходы будут не по имени, но все равно проще.

Сделать это можно как-нибудь так:

var scenesStartFrames:Array;
onLoad=function(){
scenesStartFrames=[];
i=0;
var prevSceneStart:Number;
do{
prevSceneStart=_currentframe;
scenesStartFrames.push(prevSceneStart);
nextScene();
}while(prevSceneStart!=_currentframe)
gotoAndStop(1);
}

function gotoAndStopScene(scene:Number,frame:Number){
gotoAndStop(scenesStartFrames[scene]+frame);
}
function gotoAndPlayScene(scene:Number,frame:Number){
gotoAndStopScene(scene,frame);
play();
}

А вобще конечно сцены - кака.

Ugodniki
31.08.2012, 17:03
Решение существует!
Заходим в свойства кадра на который будет переход и даем ему имя (например - vera). Теперь пишем gotoAndStop("vera") вместо неработающего gotoAndStop("Scene 2",4), и воаля - работает!

mooncar
31.08.2012, 21:45
Пора уже забыть про "сцены" - это тупиковый и неудобный функционал. Да и теме уже больше года. Закрыто.