Уроки Flash: Рисуем деревья средствами ActionScript 2.0

Данный урок, посвящен рисованию деревьев. Вся прелесть урока заключается в том, что рисовать мы будем деревья словами в панели ActionScript.
Чтобы наше дерево получилось правдоподобным нам следует представить его строение. Ключевые составляющие любого дерева - ствол и ветки. Ветка, как мы знаем - не бесконечна (также, как и ствол) она растет до определенной длины, после чего сама развивается на несколько веток. Толщина родительской ветки связана с толщиной веток, растущих из нее. А общая толщина ствола примерно равна толщине всех ветвей растущих из него. Мы знаем и о подобии между веткой и деревом - посадим в землю веточку - вырастет дерево.
Учитывая все вышесказанное, приступим к написанию "генератора деревьев".

CODE
//Создаем счетчик максимального количества ростков. Оно у нас ограничено - 3000 //тысячи.
function counter():Number {
if (branchCounter == undefined) { // Если переменная branchCounter не имеет значения, //задем ранвой нулю
branchCounter =0;
}
return (branchCounter++); // Или же функция производит пост-инкремент
}

//Функция, которая выращивает наши веточки
        function grow() {
this.lineStyle(trunkThickness, 0x000000, 100); //рисуем линию
this.moveTo(0, 0);// Устанавливаем начальные кординаты
this.lineTo(0, trunkLength);
// Если это не ствол, изменить угол и размер ветви
if (this._name != "trunk") {
this._rotation = (Math.random()*angle) - angle/2;
this._xscale *=branchSize;
this._yscale *= branchSize;
}
// Сгенерировать ростки...
var seed = Math.ceil(Math.random()*branch);
for (var i = 0; i < seed; i++) {
if (counter()< 3000) {
var segment = this.createEmptyMovieClip("segment" + i, i)
segment.onEnterFrame = grow;
segment._y += trunkLength; }
}
delete (this.onEnterFrame);
  }
// Определить позицию ствола и назначить обработчиком
// события onEnterFrame функцию growO
this.createEmptyMovieClip("trunk", 0);
trunk._x = 200;
trunk._y = 400;
trunk.onEnterFrame = grow;
// Параметры дерева
var angle = 100;
var branch = 5;
var trunkThickness = 8;
var trunkLength = -100;
var branchSize =0.7;

Базовая форма дерева определяется параметрами, значения которых задаются
в завершающих строках листинга:
• angle - максимальный угол ветви по отношению к родителю;
• branch - максимальное количество ростков (дочерних ветвей) для любой
ветви;
• trunkThickness - толщина ствола дерева;
• trunkLength - длина ствола дерева;
• branchSize - отношение размеров дочерней и родительской ветвей (ветви
уменьшаются по мере удаления от ствола).
Сначала мы создаем ствол и задаем его позицию, после чего назначаем функцию
grow() обработчиком события onEnterFrame. Как подсказывает само название,
функция grow() "выращивает" пустое дерево в нашем клипе, для чего она
выполняет две операции. Сначала функция создает исходную ветвь, рисуя
вертикальную линию высотой trunkLength и толщиной trunkThickness. Если в на-
стоящее время рисуется ствол, он оставляется в первоначальном виде
Если же рисуется ветвь, она поворачивается на угол +/- angle) и мас-
штабируется с коэффициентом branchSize .

Вот так средствами AS 2.0 мы изобразили вполне правдоподобное деревце.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=17919