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

serdeles 02.07.2010 18:01

Хаотичное распределение объектов (резина)
 
Подскажите, есть ли способ программно хаотично расположить объекты по всей ширине резинового флеша? При этом объекты не должны выходить за пределы видимой области.

Наподобие того, как реализовано тут http://www.norwegianoil40years.no/, только без анимации.

mooncar 02.07.2010 18:40

А с упорядоченным, нехаотичным расположением по всей ширине "резинового" флеша получается? В чем загвоздка-то?

Берите ширину Stage.width и раскидывайте рандомно по ней ваши объекты.

serdeles 02.07.2010 19:01

С объектами всё в порядке. Дело в том, что задача не раскидать объекты по сцене, а поместить на сцену 1 мувик (кроме него на сцене есть другие мувики), в котором много объектов. Вот именно их надо разбросать по всей ширине. То, что имеется на сцене, нормально «прорезинено».

mooncar 02.07.2010 19:18

Добавляете на сцену ваш мувик, в котором много объектов и распределяете в нем их рандомно, с учетом Stage.width.
Задаете максимальное значение x и минимальное значение. Если ваш мувик-контейнер приаатачивается в начало координат (по умолчанию так), то минимальное будет 0. Ну и скооректировать их тоже нужно, учитывая размеры объектов, чтобы они вблизи границ не залезали на них.
Трудность-то или непонимание на каком этапе?

serdeles 05.07.2010 11:20

То есть, выходит, что для отдельного мувика тоже можно задавать значения Stage.width? Попробую...

mooncar 05.07.2010 11:24

Да нет же. Stage.width (и Stage.height) используете при расчете рандомного разброса.
PS. Если мувиков будет много и их анимация не предполагается, во избежание тормозов также рекомендую отрисовать контейнер с ними в битмапу.
PPS. Еще нюанс - вам надо определиться с одним моментом: либо разброс делать всякий раз заново при растяжении окна браузера (по вашей ссылке разброс идет вообще непрерывно), либо разброс сразу сделать достаточно большим по ширине и высоте, чтобы при растяжении окна браузера площадь гарантированно была покрыта объектами. Правда как быть при этом быть с "не должны выходить за пределы видимой области", я не знаю.
Вам должно быть виднее, как это противоречие разрешить - ведь с одной стороны вы не хотите, чтобы объекты вылезали или находились на границе окна, с другой стороны, "резиновость" предполагает то, что пользователь в любой момент может растянуть / сжать окно, то есть изменить расположение его границ.

serdeles 05.07.2010 12:04

Сейчас сценарий несколько изменился: объекты могут выйти за пределы сцены. Объекты предполагаются анимированными (шарики будут дрожать мелкой дрожью). Придумали примерно так: есть несколько кнопок, при нажатии на одну из кнопок из центра сцены выскакивают шарики (что-то типа взрыва, как по ссылке), но останавливаются и просто висят, дрожжа.

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

Другой вариант — поместить шарики в отдельный мувик, который потом и бросить на сцену. Вот тут-то и проблема: как распределить эти шарики по всей ширине сцены.

mooncar 05.07.2010 12:39

Пример накидаю, обождите.

mooncar 05.07.2010 13:08

Вот посмотрите. По нажатию на кнопку тут нет, зато все перестраивается по мере изменения размера окна.
По нажатию думаю, не очень сложно сделать будет.
http://21multihinge.ru/test/rubber/rubber.html
Код AS1/AS2:

Stage.scaleMode = 'noscale';
Stage.addListener(this);
 
var sWidth:Number = Stage.width ;
var sHeight:Number = Stage.height ;
this.onResize = stOnRezize;
this.createEmptyMovieClip('balls', 0);
setBalls();
 
function stOnRezize ()
{
        sWidth = Stage.width;
        sHeight = Stage.height;
        setBalls();       
}
 
function setBallsProp(obj) {
        obj._x = Math.random() * sWidth;
        obj._y = Math.random() * sHeight;
        obj._xscale = obj._yscale = Math.random() * 90 + 10;
        obj._rotation = Math.random() * 360;
        obj._alpha = Math.random() * 100;
}
 
 
function setBalls()
{
        for (z = 1; z < 200; z++) {
                var tmp = balls.attachMovie('ball_id', 'ball' + z, z);
                setBallsProp(tmp);
                var fr:Number = Math.round(Math.random() * 14) + 1;
                tmp.gotoAndPlay(fr);
        }       
}

Есть тут немного лишнего, например, рандомные задания альфы, угла поворота и масштабирования, но это для наглядности.
Процессор грузится, конечно, прилично, но можно попробовать оптимизировать - например, отрисовать в битмапу кадры анимированного мувика.
Главное тут, это:
Код AS1/AS2:

        obj._x = Math.random() * sWidth;
        obj._y = Math.random() * sHeight;


serdeles 05.07.2010 13:48

Спасибо за пример! Сейчас попробую наколдовать что-нибудь :-)


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

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