Неслучайный случайный вывод или Smart Random
Автор: Nikitar
Сайт: Rusforumz.com
В flash-технологиях и в других программных языках широко применяется случайный вывод данных. В флэше это также может быть случайный вывод объектов. В этом нет ничего сложного и даже новички знают функцию random(). Но если выводить мувиклипы, например, в случайном порядке, то велика вероятность, что один может залезть на другого, а перекрывающиеся ролики - это не то, что нам надо. Сегодня мы попробуем (и наша попытка завершится успехом) сделать неслучайный случайный вывод мувиклипов. Я сделал несколько модификаций данной функции, однако тут мы рассмотрим только одну из них. Исходник этого урока и остальные варианты данного урока, вы, как всегда, сможете скачать в Школе Флэша. Приступим!
В этом уроке мы создадим вручную только один клип, который в последствии будем изменять и клонировать. Значит, задача такова. Поместить из библиотеки на сцену 50 мувиклипов со случайными координатами, изменив цвет и размеры мувиклипа, таким образом, чтобы они не соприкасались друг с другом. В качестве объектов возьмём шарики. В результате, у нас получится то, что вы видите внизу страницы. Очень похожая заставка была у рекламного тарифа Джинс (МТС).
Предлагаю ещё раз проанализировать вышепоставленную задачу и выяснить, какие функции нам понадобятся. Поместить из библиотеки на сцену 50 мувиклипов со случайными координатами, изменив цвет и размеры мувиклипа, таким образом, чтобы они не соприкасались друг с другом. В первую очередь, нужно поместить в библиотеку мувиклип, значит надо его создать и присвоить ему определённый Linkage, чтобы потом беспрепятственно вызывать на сцену с помощью кода. Следующее, вызывать из библиотеки нужно с помощью attachMovie. Чтобы задать случайные координаты используем вышеупомянутую функцию random(). Изменять цвет мувиклипа с помощью объекта Color (c ним тоже познакомимся) и размеры мувиклипа с помощью опять же функции random() и _xscale и _yscale. Ну, а самое важное - несоприкосновение - мы организуем при помощи команды hitTest(). Теперь всё ясно, что мы будем использовать, поэтому можно приступать к работе.
1. Открываем Macromedia (Adobe) Flash. У нового документа оставляем стандартную ширину и высоту (550x400), а fps сделаем 25. В принципе, он нам сегодня не понадобится, но просто хорошая привычка :)
2. Собственно, переходим к выполнению шарика. Просто напросто рисуем шарик любого размера, удаляем контур и выделяем оставшуюся заливку. Нажимаем F8. В открывшемся окне выделяем пункт Export for action script и в форму Identifier вводим коротенькое имя td. В маленьких скриптах можно использовать короткие имена для упрощения написания кода. В больших скриптах лучше использовать понятные названия. Таким образом, мы прописали у нашего шарика Linkage, то есть наш мувиклип получил в библиотеке свой собственный идентификатор (td), по которому мы его теперь с лёгкостью можем вызвать на сцену. Удалите со сцены сделанный мувиклип (он остался в библиотеке).
3. Теперь собственно начинаем писать код. Код мы будем писать в кадре (первый кадр главной сцены), пусть вас не пугает, что больше ничего на сцене нет, мы всё, что нужно вызовем из библиотеки правильно расположим программно. Код будем писать по кускам, которые я сразу же буду объяснять.
maxis=50 // сколько будет шариков всего
// Массив возможных цветов
color_array=new Array();
color_array[0]="0xE98727"
color_array[1]="0xF31D1D"
color_array[2]="0x11B8FF"
color_array[3]="0x6045CB"
color_array[4]="0x4AEF21"
color_array[5]="0xFF11E8"
color_array[6]="0xE8FF11"
Первой строчкой мы создаём переменную maxis, которая у нас равна 50. Это общее количество шариков, которые будут на сцене. После введения переменной maxis, мы создаём массив color_array, в котором, как вы наверно уже догадались из названия, содержатся коды цветов. Они нужны для пункта нашего тз: "Покрасить в разные цвета". Мы потом будем в случайном порядке вызывать различные цвета из этого массива.
4. Ниже, в том же кадре, продолжаем наш код.
function x_check(ss){
aa=0
for(i=1; i<ss; i++){
if(this["tt"+ss].hitTest(this["tt"+i])){
aa++
}
}
if(aa>0){
this["tt"+ss]._xscale=random(200)+20;
this["tt"+ss]._yscale=this["tt"+ss]._xscale
this["tt"+ss]._x=random(Stage.width-this["tt"+ss]._width);
this["tt"+ss]._y=random(Stage.height-this["tt"+ss]._height);
x_check(ss)
}
}
Мы создаём фунцию x_check(). В круглых скобках пишем имя переменной, которая будет передана, с любого другого участка кода. Эта переменная у нас означает текущее имя мувиклипа. Далее делаем цикл, в котором проверяем сталкивается ли данный мувиклип с какими-нибудь другими мувиклипами, если сталкивается, то мы ему задаём новые случайные параметры и повторяем функцию. А вот саму функцию мы будем вызывать позже.
6. Добавьте после вышенаписанных строчек кода:
for(i=1; i<=maxis; i++){
this.attachMovie("td","tt"+i,i);
ball_color=new Color(_root["tt"+i]);
ball_color.setRGB(color_array[random(color_array.length)]);
this["tt"+i]._xscale=random(200)+20;
this["tt"+i]._yscale=this["tt"+i]._xscale
this["tt"+i]._x=random(Stage.width-this["tt"+i]._width);
this["tt"+i]._y=random(Stage.height-this["tt"+i]._height);
x_check(i);
}
C помощью цикла мы получаем возможность вызвать из библиотеки столько мувиклипов, сколько у нас записано в переменной maxis (в данном случае 50). Вызываем мувиклип, присваиваем ему имя вида "tt"+i, создаём объект Color и перекрашиваем вытащенный на сцену мувиклип любым цветом из массива, который мы заполнили в самом начале кода. Затем мы меняем у мувиклипа параметр _xscale и делаем другой параметр - _yscale равным первому (для того, чтобы пропорции мувиклипа сохранились, сплющенные шары нам не нужны :)). Также задаём случайные координаты по оси X и Y. Заметьте, задаём мы их очень хитро, чтобы не оказалось так, что половина шарика за сценой. Мы делаем всё, чтобы весь шарик был на сцене. И, после всего этого, мы вызываем функцию, которую расписали выше - x_check(), задавая в качестве передаваемого параметра, текущий id мувиклипа.
7. Можно нажимать ctrl+Enter и проверять работу. Должно получиться тоже самое, что и ниже. Должен предостеречь, что чем больше число maxis на определённую площадь ролика, тем больше вероятности, что один мувиклип столкнётся с другим и функции x_check() придётся заново проверять, не возникло ли наложение одного мувиклипа на другой. Таких повторных проверок может быть не более 216 на один мувиклип, после 216 возникает ошибка и ролик может зависнуть. Поэтому вызывать в случайном порядке 100 роликов, ограничивая их размером площади 200x200 пикселей, не стоит.
ВНИМАНИЕ: Вы можете скачать исходник к данному уроку и самостоятельно разобраться что, куда и сколько раз. Исходники всех уроков выложены в Школе Флэша, которая располагается на портале RusForumz.com. Условия доступа в Школу Флэша