PDA

Просмотр полной версии : Как избежать разбивки кода по кадрам?


xintrea
31.07.2006, 02:31
Здравствуйте дорогие флешеры.

Есть такой вопрос. У меня есть клип-таблица (некий массив объектов X*Y), который содержит внутри себя объекты-ячейки. Объекты-ячейки генерируются кодом в момент создания клип-таблицы. То есть, в клип-таблице изначально лежит одна скрытая ячейка, которая копируется через duplicateMovieClip(). Код копирования (создания) ячеек находится в первом кадре мувика таблицы.

У каждой ячейки есть свое состояние. Необходимо сделать так, чтобы при создании новой таблицы, ячейкам этой таблицы устанавливались стартовые значения. Причем за установку этих состояний должен отвечать не код, принадлежащий таблице, а код, разположеный на более высоком уровне.

То есть нужно создать конструктор для объекта "таблица", который будет создавать объект, и задавать дефолтное состояние его ячеек.

Новый объект таблицы я создаю путем копирования существующего скрытого объекта таблицы, через ту же функцию duplicateMovieClip(). И тут возникает ПРОБЛЕМА. После создания (по сути - копирования) таблицы, я могу изменить свойства представляющего ее мувика. Например, могу установить, свойство _x или _y или прозрачность.

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

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


for(i=0;i<tabs;i++)
{
// Создается таблица
duplicateMovieClip("logictab","logictab_"+i,startlayer+i);
setProperty("logictab_"+i, _x, shiftx+i*stepx);
setProperty("logictab_"+i, _y, shifty);

// Задаются свойства для ячеек
for (y=0; y<9; y++)
for (x=0; x<9; x++)
set("logictab_"+i+".cell"+x+y+".cell_state", glob_default[x][y]);
}


Я должен разбивать этот код на два кадра. В первом кадре у меня лежат команды создания таблиц


for(i=0;i<tabs;i++)
{
// Создается таблица
duplicateMovieClip("logictab","logictab_"+i,startlayer+i);
setProperty("logictab_"+i, _x, shiftx+i*stepx);
setProperty("logictab_"+i, _y, shifty);
}


А во втором кадре установка свойств под-объектов, т.к. к этому моменту они уже появились.


for(i=0;i<tabs;i++)
{
// Задаются свойства для ячеек
for (y=0; y<9; y++)
for (x=0; x<9; x++)
set("logictab_"+i+".cell"+x+y+".cell_state", glob_default[x][y]);
}


Вот. Только так я могу создать новую таблицу с нужными мне значениями ячеек.

И именно поэтому я не могу оформить код в нормальный вид, не могу создать конструктор, с помощью которого буду создаваить новую таблицу через new logictab();

Вопрос - есть ли решение этой проблеммы? Как обычно поступают в таких ситуациях? Очень бы хотелось иметь правильный код, потому что с разорваным на кадры кодом очень неудобно управляться. Может быть, я изначально как-то не так проектирую объекты "таблица" и "ячейка"?


ЗЫЖ В моем случае "таблица" и "ячейка" - это объекты, по своей сути далекие от понятий "таблица" и "ячейка". Я просто их так называю, чтобы внятно объяснить что мне нужно. По этой причине, использование компонета DataSet не предлагать. :)

wvxvw
31.07.2006, 08:31
А обязательно проигрывать какую-то анимацию между созданием и дублированием (заполнением)? Я бы подумал над другим, более практичным решением.
В любом случае, если возможно создать еще один слой проигрывающийся оба кадра с одним и тем же кодом, то my_mc._currentframe в помощь.

xintrea
31.07.2006, 14:02
А обязательно проигрывать какую-то анимацию между созданием и дублированием (заполнением)? Я бы подумал над другим, более практичным решением.

Так я и не хочу проигрывать анимацию между созданием и дублированием (заполнением). Но не могу без этого обойтись.


Главная сцена [Кадр 1: Создаем таблицу] [Кадр 2: Задаем свойства ячейкам]

|
V

Таблица [Кадр 1: Генерируем ячейки]

|
V

Ячейка


В Таблице в первом кадре расположен код генерации ячеек. Таким образом, создать в Главной сцене Таблицу, и сразу задать состояния ячеек - не получается. Это из-за того, что сразу после создания Таблицы, Таблица еще не наполнена Ячейками. А чтобы она наполнилась, нужно прощелкнуть кадр. В момент прощелкивания выполнится код из первого кадра Таблицы, следовательно появятся Ячейки. И вот после этого можно задавать свойства этим Ячейкам.


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

Не, это будет шаткий код. Так нельзя. Думаю, что-то надо менять в мой моделе "Таблица-Ячейки", тока не могу понять как, чтобы и код лежал в нужных местах (первый кадр таблицы - самое правильное место для генерации массива ячеек), и управление таким объектом шло без извращений в стиле разбивки кода по кадрам.

iNils
31.07.2006, 15:19
В Таблице в первом кадре расположен код генерации ячеек. Таким образом, создать в Главной сцене Таблицу, и сразу задать состояния ячеек - не получается. Почему?

xintrea
31.07.2006, 16:45
Потому что -

Новый объект таблицы я создаю путем копирования существующего скрытого объекта таблицы, через функцию duplicateMovieClip(). И тут возникает ПРОБЛЕМА. После создания (по сути - копирования) таблицы, я могу изменить свойства представляющего ее мувика. Например, могу установить, свойство _x или _y или прозрачность.

Но я не могу установить свойства для под-объектов, то есть не могу установить нужные мне свойства для ячеек. Это происходит по той причине, что для того, чтобы ячейки создались, нужно "прощелкивание" кадра, так как они создаются программно в коде клипа таблицы (в первом кадре таблицы).

Таким образом, я не могу написать одним куском код.

Либо так флеш устроен, либо я что-то не так делаю. Если это я не так делаю, хочу узнать как правильно. Если это флеш так устроен, хочу узнать как правильно делать "генерацию объектов с инитом генерирующихся под-объектов" в рамках флеш MX 2004.

iNils
31.07.2006, 18:08
Я так и не понял весь ваш текст. Вот вам пример, может то что вы хотите.

wvxvw
31.07.2006, 21:42
2 Xintrea:
Самое простое и напрашивающееся решение - создать (програмно\в библиотеке) 1 экземпляр ячейки таблицы, обозвать его каким-нибудь классом (надавать всех нужных свойств и ф-ций) и потом загружать\дублировать его куда угодно, когда угодно и в произвольных колличествах.
Привязывать к анимации есть смысл только если нужно ждать, что юзер просмотрит какой-то клип, после чего и должны создаться\заполнится ячейки.

ЗЫ. для задания значения свойства вовсе не нужно использовать сетПроперти, достаточно "=" МойОъект.МоеСвойство = значение/ в некоторых случаях МойОъект["МоеСвойство"] = значение.
ЗЫЫ. Что такое "лоджикТаб"? компонент/кастомный класс какой-нибудь?
ЗЫЫЫ. дупликейтМуви не рекомендовано к использованию в принципе =)

xintrea
31.07.2006, 22:25
2 iNils

Сорри, не могу открыть этот table.fla. Судя по сигнатуре в table.swf, вы делали пример в 8-м флеше, а у миня старый добрый MX2004.

iNils
31.07.2006, 22:29
Старый? добрый это flash mx, а не mx2004.

xintrea
02.08.2006, 02:38
2 iNils

Спасибо за пример, я с ним поковырялся - у вас все работает как надо. Например, в первом кадре основной сцены, сразу после строки var mc = this._parent.attachMovie ("libTable", "mcTable" + this.tableCount, this.tableCount, o); я добавил такой код


for (var j = 0; j < o.r; j++)
for (var i = 0; i < o.c; i++)
{
id = o.c * j + i;
set("mcTable"+this.tableCount+".mcCell"+id+"._xscale",random(100)+100);
set("mcTable"+this.tableCount+".mcCell"+id+"._yscale",random(100)+100);
}


И все работает - изменение свойств мгновенно сказывается на созданой выше по коду таблице.


В моем случае я сделал так же как у вас, но почему-то всеравно изменение свойств происходит только после перещелкивания кадра. Вот и не могу понять почему.


Чтобы не быть голословным, прикладываю архив.


Откройте *.fla файл и запустите его (Ctrl+Enter). Вы увидите, что ячейки таблички ровные (одинаковые). Это несмотря на то, что в коде присутствуют команды рандомного изменения масштаба ячеек.

Откройте символ LBEditor, встаньте на слой ActionScript, кадр 1. Найдите поиском следующие строки


// Проверка установки случайных размеров ячеек
lbe_set_logictab_scale(lbe_curr_ftb);


и закомментируйте вызов функции lbe_set_logictab_scale(). А в кадре 2 раскомментируйте вызов этой функции. Запустите. Вы увидите, что ячейки стали разного размера.

Вопрос - почему так происходит?

xintrea
02.08.2006, 16:37
Мда, видимо никто не знает. Ладно, примем это за очередной глюк флеша.

iNils
02.08.2006, 16:55
Мда, видимо никто не знает. Ладно, примем это за очередной глюк флеша.Это не глюк флеша. Вы так запутали свой код, да плюс используете синтаксис 4-го флеша (давно устаревший), что мало кому хочется разбираться в том что вы написали.

xintrea
02.08.2006, 17:09
Ок, ща я обрежу пример по самое не балуйся, чтоб оставить тока интересующую функциональность.

xintrea
02.08.2006, 17:50
Во, сделал по минимому.

Инструкции.

1. Открываем *.fla, запускаем его (Ctrl+Enter).
2. Видим, что все ячейки одинакового размера, закрываем swf-ник.
3. Заходим в клип LBEditor, выбираем слой ActionScript, кадр 1.
4. Комментируем все, что находится ниже строки "// Задаются рандомные размеры ячеек".
5. Переходим в кадр 2 и РАСкомментируем все, что находится ниже строки "// Задаются рандомные размеры ячеек".
6. Запускаем (Ctrl+Enter).
7. Видим, что ячейки стали разного размера.


Таким образом имеем
- кода код изменения свойства находится в кадре 1, мы не видим результат (ячейки остаются одинакового размера)
- когда тот же код находится в кадре 2, мы видим, что свойство изменилось (ячейки становятся разного размера)


Вопрос - почему так происходит?

iNils
02.08.2006, 18:11
Ну, так. В LBEditor в первом кадре напишите trace ("size") перед запуском изменения размера, а в LogicTab trace ("cell") после создания все ячеек. Теперь запустите и посмотрите на порядок полученных трейсов.
Вы получите
random
cell
Теперь понятно? Сначала выполняется весь код который аттачит таблицу, а уже потом код внутри приаттаченной таблицы.
Уберите весь код который отвечает за размеры, а внутри LogicTab код замените на
// Создаются ячейки таблицы
for (j = 0; j < lbe_cell_on_y; j++) {
for (i = 0; i < lbe_cell_on_x; i++) {
this.attachMovie ("libcell", "cell" + i + j, i + j * lbe_cell_on_x, {_xscale:random (100) + 100, _yscale:random (100) + 100, _x:i * lbe_step_cell_on_x, _y:j * lbe_step_cell_on_y});
}
}

xintrea
02.08.2006, 19:15
Хм, почему тогда в примере, который вы давали, если сразу после attachMovie ("libTable"... добавить код


for (var j = 0; j < o.r; j++)
for (var i = 0; i < o.c; i++)
{
id = o.c * j + i;
set("mcTable"+this.tableCount+".mcCell"+id+"._xscale",random(100)+100);
set("mcTable"+this.tableCount+".mcCell"+id+"._yscale",random(100)+100);
}


то ячейки изменяют размер?

Ведь у вас приаттачиваемый объект - libTable - создаёт таблицу динамически (как и у меня) с помощью кода внутри символа таблицы.

iNils
02.08.2006, 22:09
Потому что я создал класс Table. И когда я аттачу на сцену из библиотеки символом, он становится экземпляром этого класса. А описание класса между директивами #initclip и #endinitclip позволяет инициализировать экземпляр до его появления на сцене.

xintrea
03.08.2006, 01:14
Ага, теперь понял. :yahoo:
Конструкцию ячейки вы делаете так же как написано в этой статье http://www.vmstudio.com/materials.php?component. Единственное чему не внял, так это почему в помощи FlashMX2004 нет описания директив #initclip #endinitclip. Во всяком случае, поиск не находит.