Данный урок, посвящен рисованию деревьев. Вся прелесть урока заключается в том, что рисовать мы будем деревья словами в панели 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 мы изобразили вполне правдоподобное деревце.