Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Програмная анимация. (http://www.flasher.ru/forum/showthread.php?t=73326)

Vier 19.12.2005 06:25

Програмная анимация.
 
такая штука:

нарисовано 3 квадратика и раскидано по сцене.

после события, рэндомом выбираю один из квадратиков и уменьшаю ему прозрачность.
Как только прозрачность этого квадратика меньше 50, рэндомом выбираю 1 из оставшихся 2-ух и уменьшаю прозрачность ему. Как только у второго меньше 50, случайно выбираю 3ий итд.

Вот код:
Код:

count=3;//количество квадратов
//контейнер
eff = this.createEmptyMovieClip("effect", 8);
this.effect._x = 469;
this.effect._y = 10;
//рисую квадратики
for (var i = 0; i<count; i++) {
        effect.createEmptyMovieClip("picEff"+i, 10+i);
        wayEff = eval("effect.picEff"+i);
        wayEff._x = places_x[i];
        wayEff._y = places_y[i];
        with (this.wayEff) {
                lineStyle(1, 0xffffff, 0);
                beginFill(0x2F84BC, 80);
                moveTo(0, 0);
                lineTo(42, 0);
                lineTo(42, 42);
                lineTo(0, 42);
                lineTo(0, 0);
                this.endFill();
        }
}
//Массив с неповторяющимся рэндомом
myRandom = new Array(count);
for (i=0; i<count; i++) {
        k = 0;
        while (k == 0) {
                k = 1;
                m = random(count);
                for (i1=0; i1<i; i1++) {
                        if (myRandom[i1] == m) {
                                k = 0;
                        }
                }
        }
        myRandom[i] = m;
}
//пути к квадратикам
myEffects = new Array(count);
for (i=0; i<count; i++) {
        myEffects[i] = eval("effect.picEff"+myRandom[i]);
}

eff.onEnterFrame = function() {
        i=0;
        myEffects[i]._alpha -= 5;
        if (myEffects[i]._alpha<50) {
                myEffects[i+1]._alpha -= 5;
        }
        if (myEffects[i+1]._alpha<50) {
                myEffects[i+2]._alpha -= 5;
        }
        //стираю эффект
        if (myEffects[i+2]._alpha<=0) {
                this.removeMovieClip();
        }

};

Собственно, все работает. Но никак не могу сообразить как мне оформить функцию
Код:

eff.onEnterFrame = function() {
        i=0;
        myEffects[i]._alpha -= 5;
        if (myEffects[i]._alpha<50) {
                myEffects[i+1]._alpha -= 5;
        }
        if (myEffects[i+1]._alpha<50) {
                myEffects[i+2]._alpha -= 5;
        }
        //стираю эффект
        if (myEffects[i+2]._alpha<=0) {
                this.removeMovieClip();
        }
};

Чтобы не зависеть от числа квадратов.

Спасибо.

Double 19.12.2005 11:24

при чтении очень многих вопросов вспоминается анекдот про петуха, который гонится за курицей, знает что не догонит, но всё равно бежит из соображений "не догоню, так хоть согреюсь". если хочется просто согреться, то дальше не читай. ну а если курицу охота догнать, то
а. сделай мувик с квадратиком и твинингом альфы от 100 до 50 со стопами в начале и в конце. (если квадратик до 0 должен дойти, стало быть твининг делай до 0, а в середине твининга сделай ключевой кадр)
б. в основной сцене возьми любое значение count (хоть рэндомное) и циклом размести на сцене count штук квадратиков любых размеров, цветов, координат и т.д. последовательно нумеруя инстансы
в. сделай массив длинной count, куда будешь сохранять уже проигранные/непроигранные квадратики единственным флагом
д. напиши функцию рэндомного выбора из числа непроигранных пока квадратиков и запуска их твининга с внесением изменения флага в массиве
г. один раз запусти функцию из основной сцены и в коде квадратика запускай её из кадра, соответствующего альфе = 50.
всё. зачем программно альфу-то менять? ну надо программно, напиши функцию в коде мувика с квадратиком. станешь запускать её для каждого инстанса (так ты от числа квадратиков на сцене отвяжешься). Зачем квадратик программно рисовать? Ну если так хочется, рисуй его в первом кадре мувика будующего квадратика. Основная твоя ошибка в том, что ты свойства и функции объекта в главной сцене пишешь. Пиши их в каком-то мувике, а потом его аттачь в сцену любое число раз и каждый приаттаченый будет уже в себе иметь все необходимые прибамбасы :) нет, ну можно пойти дальше, и написать класс. тогда всё вообще будет красиво, правильно и объектно-ориентировано. но проще всего не заморачиваться и сделать по пунктам а-г (если рассматривать конкретную прикладную задачу в которой нужны только квадратики с однотипными свойствами. вот если бы там ещё были кружочки и треугольнички, причём кружочки при достижении альфы=50 меняли бы цвет, треугольнички масштабировались в 0, а квадратики продолжали становиться более прозрачными до полного исчезновения, тогда наследование свойств и пр фигня)

Vier 19.12.2005 12:22

Cпасибо за ответ.
Я не хочу рисовать альфу руками, т.к. хочу иметь возможность корректировать скорость исчезновения квадратов, возможно тоже рэндомом, итд.
Более того, если нужно рисовать какой-то сложные многоугольники, с координатами углов, берущимися, например из xml?
Менять цвет, форму, место положение итд - этож не проблема даже в моем случае.
Удобство нарисовать руками вижу только, чтобы в тело мувика сунуть функцию запускающую сл. квадрат.
Все остальное не сущуственно.

Собственно, вопрос свелся, как представить это:
Код:

eff.onEnterFrame = function() {
        i=0;
        myEffects[i]._alpha -= 5;
        if (myEffects[i]._alpha<50) {
                myEffects[i+1]._alpha -= 5;
        }
        if (myEffects[i+1]._alpha<50) {
                myEffects[i+2]._alpha -= 5;
        }
        //стираю эффект
        if (myEffects[i+2]._alpha<=0) {
                this.removeMovieClip();
        }
};

если мувиков не 3, а 30.

Double 19.12.2005 15:11

блин, ну так я ж уже сказал! сделай пустой мувик, в нём пропиши все свои эфекты, в основную сцену аттачь любое колличество этих мувиков, внутри которых хоть картины рисуй! единожды прописаный код будет работать на любом экземпляре твоего мувика. почитай ещё раз часть моего поста, которая сразу за п. "г" идёт.

если не хочешь делать пустой мувик-прототип (по сути-то), тогда делай объекты/классы с наследованием свойств и пр.


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

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