Форум 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=182170)

MINASTIS 14.07.2012 04:07

Как сделать частицы летящими словно их колышет ветер?
 
Я сделал движущиеся частицы, чтобы этот код работал, достаточно в библиотеке создать клип с именем flake

Как вы видите, у меня с моими частицами несколько проблем.
Во первых, я хотел их сделать как-бы вылетающими справа, из-за экрана, и летящими влево. Со временем с помощью рандома и числа я сделаю еще и их исчезновение.
Тут проблема в том, что я не знаю, как определить ширину экрана пользователя, или ширину экрана swf в данный момент. А если это все будет бэкграундом сайта - там тоже - как определить правый край?
Поэтому на данный момент в плане координат появления частиц все криво. Прямые грубые числа которые никуда не подходят кроме как для теста.

Я хотел сделать движение как-бы каждой частицы в разную точку на оси _y.
Получился бы эффект словно их колыхает ветер (хотя на самом деле просто разные точки в немножечко разные _y летят). Я пробовал просто изменить скорость плюса к this._y, но получалась свистопляска вместо красивого полета :D
Я буду рад любым идеям или даже намекам.

Тут можно посмотреть swf как он есть по коду ниже: http://www.swfcabin.com/open/1342215422

Код AS1/AS2:

this.onEnterFrame = function()
{
        var mspeed:Number = new Number();
        var ran:Number = new Number();
        var toy:Number = new Number();
        //tox = random(500);
        mspeed = random(6);
        ran = random(20);
        if (mspeed==0) {
                mspeed=1;
        }
        if (ran==1) {
                mspeed=20;
        }
        toy = -200+random(800);
        n = this.getNextHighestDepth();
        flak = attachMovie("flake", "flake" + n, n);
        flak._x = 700;
        flak._y = random(1700);
        flak._alpha = random(100);
        flak._xscale = random(60);
        flak._yscale = flak._xscale;
        //tox:Number = new Number();
 
        //flak.filters = [blur];
        flak.onEnterFrame = function()
        {
                this._x-=mspeed;
 
                this._y+=(mspeed/1.2);
 
        };
};


Tails 14.07.2012 13:26

Получить ширину текущего размера окна флешки можно так:
Код AS1/AS2:

Stage.width

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

С ветром посложнее, для настоящего труЪ ветра нужно через некоторые интервалы времени генерировать рандомные направление и скорость, Это может быть тупо 2 числа: скорость и угол. Далее все снежинки двигать по этим показателям, добавляя для каждой отдельно - своё небольшое смещение, для реалистичности.

Может быть вам пригодиться этот код:
Код AS1/AS2:

_root.myClip._x += speed*Math.cos(_root.myClip._rotation*(Math.PI/180));
_root.myClip._y += speed*Math.sin(_root.myClip._rotation*(Math.PI/180));

Этот код двигает _root.myClip в направлений его ротации, со скоростью speed

MINASTIS 14.07.2012 20:02

Насчет массива не совсем понял. В цикле ведь тогда придется каждый раз перебирать клипы и каждый раз делать + к движению?
onEnterFrame вроде бы задает каждому клипу свой код, который они бесконечно выполняют (до условия и т.д.). А с массивом придется создавать кучу переменных для каждого мувика, чтобы в цикле соблюдать отдельное движение для каждого клипа-элемента массива.
Я могу все не так понимать, кстати.

Для тру ветра согласен, попробую сделать с этим что-то.
Кстати, у меня во флешке клипы иногда просто исчезают. С чем это может быть связано? Возможно, глубина другого клипа используется...

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

dark256 14.07.2012 21:27

Получение незанятой глубины клипа:

Код AS1/AS2:

там_где_оно_все_лежит.getNextHighestDepth();


MINASTIS 14.07.2012 21:36

Ага, с глубиной уже есть эта строчка.

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

myregmail 14.07.2012 21:41

Вложений: 1
Есть исходник с www.freeactionscript.com. Только там код откомментирован на английском, но, в принципе, все понятно (и про добавление снежинок в массив, и про перебор массива, и про ветер).

MINASTIS 14.07.2012 21:58

Вложений: 1
Сделал максимум частиц - 140, чтобы сохранять производительность.
Вот исходник, теперь все выглядит намного живее.

Исходник с массивом посмотрю, спасибо!


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

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