Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как избежать разбивки кода по кадрам? (http://www.flasher.ru/forum/showthread.php?t=83225)

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

Цитата:

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

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

Код:

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

  |
  V

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

      |
      V

      Ячейка

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


Цитата:

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

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

iNils 31.07.2006 15:19

Цитата:

Сообщение от xintrea
В Таблице в первом кадре расположен код генерации ячеек. Таким образом, создать в Главной сцене Таблицу, и сразу задать состояния ячеек - не получается.

Почему?

xintrea 31.07.2006 16:45

Потому что -

Цитата:

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

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

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

iNils 31.07.2006 18:08

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

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

Вложений: 1
Старый? добрый это flash mx, а не mx2004.

xintrea 02.08.2006 02:38

Вложений: 1
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 раскомментируйте вызов этой функции. Запустите. Вы увидите, что ячейки стали разного размера.

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


Часовой пояс GMT +4, время: 15:55.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.