PDA

Просмотр полной версии : применение одного и того же кода к разным мувикам


kassini
25.10.2009, 03:36
Подозреваю, что вопрос не очень сложный, но не смог нормально сформулировать для поиска. Поэтому попытаюсь объяснить здесь, что я хочу:
Есть меню из надписей (кнопок-мувиков). Нужно, чтобы однажды написанный код анимации (например, изменение размера мувика при наведении) автоматически применялся для всех кнопок в списке. Захотел изменить анимацию всех кнопок - поменял этот "исходный код" и каждая кнопочка, соответственно, поменяла свое поведение.
Как я понимаю, тут нужна динамическая подмена имени в этом "исходном коде" на имя (instance name) кнопки, на которую в данный момент наведен курсор, но не знаю, как этого добиться. Помогите, плз! :wacko:

Добавлено через 1 час 37 минут
спасибо, кажется, уже разобрался )

fessor
25.10.2009, 15:45
могу предложить свой вариант
function animateButton (someButt:MovieClip){
}
и юзать эту функцию к разным кнопкам по их нажатию, вотъ

Dumpil
26.12.2009, 17:41
у меня похожая проблема
у меня есть 20 кнопок
я хочу что бы при наведении на любую из них она увеличивалась на 10% к примеру

function ab (bot:MovieClip){
bot._xscale+=10;
bot._yscale+=10;
}
как теперь вызвать функцию именно в момент наведения на кнопку ?

mooncar
26.12.2009, 18:09
Немного по-другому:

for (i = 1; i <= 20; i++) {
_root['bot' + i].onRollOver = ab;
}

function ab (){
this._xscale += 10;
this._yscale + =10;
}
Если кнопки не на _root, то замените путь.
Оформите в посте код тегами AS и не склеивайте операторы, выражения и прочие элементы - код делается неудобочитаемым - и для вас , и для остальных.
К тому же быстрее он работать от этого не станет. :)

VVall
26.12.2009, 18:35
не склеивайте операторы, выражения и прочие элементы - код делается неудобочитаемым - и для вас , и для остальных.
Мне, наоборот, сильно мешают все эти лишние пробелы где попало. Что делать?

Dumpil
26.12.2009, 18:44
спасибо, я пока что начинающий и мое представление о ас составляют крупицы познаний с прошлого + то в чем ща разобрался ) поэтому правильность написания кода это воще космос )
я так понял что в вашем коде для кнопок от 1й до 20й (bot1, bot2 ... bot20) будет выполянтья функция аб
а если все кнопки лежат в мувиклипе main где поменятьеться путь ?

mooncar
26.12.2009, 18:46
Как что делать? Если на люди код не выносите, пишите весь код в одну строчку, где это возможно, как некоторые HTML-параноики :)
Если код на публику выносится, лучше, чтобы он был читаемым.
Так больше вероятность получения помощи по вопросу.
Тэги, кстати, тоже не для модераторов введены, а для пользователей форума.
Например, когда вижу нечто вроде for(i=1;i<10;i++){, и так много строк, сразу разбираться желание пропадает.

Добавлено через 46 секунд

а если все кнопки лежат в мувиклипе main где поменятьеться путь ?

for (i = 1; i <= 20; i++) {
main['bot' + i].onRollOver = ab;
}

udaaff
26.12.2009, 18:51
Мне, наоборот, сильно мешают все эти лишние пробелы где попало. Что делать?
А где попало и не надо ставить. Есть четкие конвенции по оформлению кода. Довольно логичные причем =)

Пробел не ставится между унарным оператором и операндом. Бинарные и тернарные операторы нужно отделять пробелами, иначе читается это все просто отвратительно.

VVall
26.12.2009, 19:01
Есть четкие конвенции по оформлению кода. Довольно логичные причем =)
Ссылку, если можно. Пока я таких не встречал, в каждой конторе были свои многостраничные соглашения по оформлению кода. На мой взгляд, ручное их соблюдение - это огромная трата времени впустую, форматирование кода должно быть автоматизировано.

Dumpil
26.12.2009, 19:04
for (i = 1; i <= 20; i++) {
main['bot' + i].onRollOver = ab;
main['bot' + i].onRollOut = ab2;
}

function ab (){
this._xscale = + 110;
this._yscale = + 110;
}

function ab2 (){
this._xscale = + 100;
this._yscale = + 100;
}
чуть добавил кода и получился нужный эфект ) теперь кнопки перебираються как на пианино ) спасибо что не прошли мимо )

udaaff
26.12.2009, 19:31
Ссылку, если можно. На мой взгляд, ручное их соблюдение - это огромная трата времени впустую, форматирование кода должно быть автоматизировано.

http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions Конвенции по AS3, но для AS2 тоже сгодятся.

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

Автоформатирование нужно лишь в том случае, если к вам в руки попадает чужой, плохо оформленный код.

VVall
26.12.2009, 19:42
А вы читали, что написано по вашей ссылке? Эти "чёткие конвенции" - точно такой-же местный стандарт, какие я видел раньше, в данном случае для компонентов отдельно взятого фреймворка. И там во введении сказано, что часть стандартов взята с потолка.

Никакой траты времени? Говоря только о пробелах: сравните размер файла с пробелами и без. Исходя из этого и из максимальной скорости нажатия на пробел (самую неудобную клавишу, между прочим) можно посчитать, сколько именно занимает эта "никакая трата" на то, что можно сделать нажатием одной клавиши.

udaaff
26.12.2009, 19:59
А вы читали, что написано по вашей ссылке? Эти "чёткие конвенции" - точно такой-же местный стандарт, какие я видел раньше, в данном случае для компонентов отдельно взятого фреймворка. И там во введении сказано, что часть стандартов взята с потолка.
А где по вашему должны быть прописаны конвенции, чтобы быть неместным стандартом? В конституции российской федерации?

Никакой траты времени? Говоря только о пробелах: сравните размер файла с пробелами и без. Исходя из этого и из максимальной скорости нажатия на пробел (самую неудобную клавишу, между прочим) можно посчитать, сколько именно занимает эта "никакая трата" на то, что можно сделать нажатием одной клавиши.
Если у вас это отнимает время, могу лишь посоветовать научиться хорошо печать. А время в основном будет уходить на разбор этого кода, а не на набор. Вы все-таки не машинисткой работаете, объемы тут поменьше.
И вот, к примеру, вы же расставили в своем посте пробелы после знаков препинания =). Много времени у вас на это ушло? А читается все нормально и не режет глаз =)

Hauts
26.12.2009, 20:05
причем =)
На мой взгляд, ручное их соблюдение - это огромная трата времени впустую, форматирование кода должно быть автоматизировано.[/QUOTE]

Нажмите Ctrl + Shift + F в окне действий, отформатирует.

mooncar
26.12.2009, 20:05
Пожалуйста.
Я не про += говорил. :) А про приклейку цифр главным образом.

Добавлено через 1 минуту

Нажмите Ctrl + Shift + F в окне действий, отформатирует.
У меня часто бывает по 1000 - 2000 строк. Никогда автоформат не смог их съесть. :)

На все 100 согласен с udaaff - аккуратное написание кода должно получаться само собой, при написании кода.
Экономит кучу времени по зрительной навигации в больших массивах строк, полезность этого несоизмерима с затратами на нажатие пробела.
К тому же, когда нет пробелов, элементарные конструкции кода превращаются порою в таких монстров, что страшно смотреть.
Тогда самому же будет удобнее, например, покопаться в своем же коде годичной давности.
С ужасом смотрю сейчас свои строки 2-х летней давности (мои первые работы).

Hauts
26.12.2009, 20:22
У меня нормально форматирует, без проблем. Flash CS3.

Два года назад - первые работы? Отличный результат изучения флэша за два года.

udaaff
26.12.2009, 20:26
В 9, кажется, изначально баг был с автоформатом. Сейчас, вроде, все нормально.

mooncar
26.12.2009, 20:33
В 9, кажется, изначально баг был с автоформатом. Сейчас, вроде, все нормально.
У меня CS3 (9-ка). Видимо, этот баг и проявляется.

Hauts
26.12.2009, 20:35
У меня баг тоже есть. Причем я заметил некоторые закономерности. В большинстве случаев помагает ставить ";" в конце строк.

Dumpil
27.12.2009, 13:37
есть надоработочка
при увеличении кнопки она теряеться за другими
попробывал использовать getNextHighestDepth() - не получаеться (
function ab (){
this.getNextHighestDepth();
this._xscale = + 110;
this._yscale = + 110;
}

mooncar
27.12.2009, 13:51
Это от непонимания того, что делает getNextHighestDepth(). А этот метод просто-напросто выдает инфу о том, какой следующий уровень свободен.
А ставит на нужный уровень уже метод swapDepths()
Поэтому сделайте так:

//найдем свободный уровень внутри main - он будет выше всех занятых
var topLevel:Number = main.getNextHighestDepth();

function ab (){
this._xscale = 110; //плюсы тут ни к чему
this._yscale = 110;
this.swapDepths(topLevel); //очередная кнопка встает на найденный уровень, который заведомо выше всех
}

udaaff
27.12.2009, 13:56
Лучше менять местами текущий мувик с наивысшим. А то так глубины могут закончится, если долго и упорно кликать.

mooncar
27.12.2009, 14:01
udaaff, в моем примере не закончатся :)
Просто поочередно занимается один и тот же найденный свободный обособленный уровень, изначально не занятый.

Dumpil
27.12.2009, 14:18
не работает (
нужно ли в клипе main добавить еще один слой ?
все кнопки в клипе main лежат в одном фрейме на одном слое.

Добавлено через 1 минуту
Лучше менять местами текущий мувик с наивысшим. А то так глубины могут закончится, если долго и упорно кликать.
где должен находиться наивыший ? в руте ?

mooncar
27.12.2009, 14:23
Должно работать. Никаких слоев не нужно добавлять. То, что происходит на _root, никакого отношения не имеет ни к чему, у вас же все в main - и кнопки, и уровень свободный находится и занимается.
Вероятно, что-то делаете не так. См. рабочий пример.

PS. Не путайте слои в среде разработки флеша и глубины объектов в готовом swf.

Dumpil
27.12.2009, 14:57
Должно работать. Никаких слоев не нужно добавлять. То, что происходит на _root, никакого отношения не имеет ни к чему, у вас же все в main - и кнопки, и уровень свободный находится и занимается.
Вероятно, что-то делаете не так. См. рабочий пример.

PS. Не путайте слои в среде разработки флеша и глубины объектов в готовом swf.

http://filestore.com.ua/?d=D3C87EB49
не могу понять что не так
возможно потому что в кнопках битмап и есть анимация

mooncar
27.12.2009, 15:05
Не забывайте, что не у всех CS4 стоит.

Dumpil
27.12.2009, 22:26
Какая версия у вас ? Если сохранять через сайв эз то можно только CS3 (
MovieClip.swapDepths

Синтаксис

anyMovieClip.swapDepths(depth);
anyMovieClip.swapDepths(target);

Аргументы

target Мувиклип, который должен обменять уровень своего местонахождения с уровнем клипа, заданным в anyMovieClip. Оба мувиклипа должны принадлежать одному и тому же родительскому клипу (находиться на одной линейке Прим. редактора)

depth Номер уровня, на который будет перемещен anyMovieClip.

Описание

Метод; обменивает порядок расположения, или Z-порядок (уровень глубины) данного мувиклипа с клипом, указанным в аргументе target или с клипом, который в данный момент занимает уровень depth, заданный в аргументе. Оба мувиклипа должны принадлежать к одному и тому же родительскому клипу. Обмен уровнями создает эффект перемещения одного клипа за или под другой. Если в момент вызова этого метода мувиклип находится в состоянии анимации "tweening", последняя останавливается.
скорее всего проблема вот здесь.

Добавлено через 25 минут
вродь разобрался проблема в том что к типу "button" это свойство не работает (

mooncar
28.12.2009, 00:21
Кнопки (Класс Button) не используйте - от них одна головная боль.

Dumpil
28.12.2009, 00:26
ну я уже это понял ) просто теперь прийдеться все кнопки переделать в мувиклип а потом их сделать с помощью - ас кнопками )
нашел тут пример как по мне не оч понятный )
http://demiart.ru/forum/index.php?showtopic=54011
кстати я так понял там где наш счечик отсчитывает кнопки можно вставить скрипт для того что бы каждый мувиклип превращался в кнопку (соответсвенно подготовив его - вставив 3 кадра), верно ?