ЦВЕТ И РАБОТА С НИМ

 

Это еще один урок по просьбе читателя. Не стесняйтесь, спрашивайте, буду писать..

 

Начнем с простейшего примера. Новый файл, делаем кнопку в руте и пишем:

on (release) {new Color(this).setRGB(random(255*255*255));}

тестим, кликаем. Кнопка меняет цвет.

Рисуем квадратик где-нибудь в руте, опять тестим, кликаем по кнопке.

new Color(this) - создаем новый безымянный объект Color и помещаем его в this, чем в данном случае является _root

random(255*255*255) - получаем случайное число, которое будет определять цвет.

setRGB - присваиваем безымянному объекту Color новое значение цвета.

 

Вообще-то команда setRGB использует шестнадцатиричное число вида 0x000000, но и обычное число подходит.

 

Прежде чем продолжить, настоятельно рекомендую изучить прекрасную статью управление цветом импотрированного битмапа. Хотя эта статья не ставит себе целью программное управление цветом, но для понимания соответствия программного и ручного управления будет очень полезна.

 

Практически все возможности редактирования экземпляров мувиклипов во flash через панели свойств также доступны и программно (исключение - skew, но я это исправил :)) Возможность управления цветом экземпляра мувиклипа - не исключение, им можно управлять программно.

 

Откройте панель Effect и выберите в раскрывающемся списке advanced. Все остальные пункты раскрывающегося списка - лишь частный случай, который можно создать в advanced.

 

Итак, видим две колонки:

в левой - процентное поканальное значение цвета.

в правой - плюс абсолютное поканальное значение.

 

Один важный момент для понимания: red, green, blue, alpha каналы имеют абсолютную шкалу 256 градаций (включая ноль). Т.е. 100% красный это 255 красного цвета. Впрочем вы к этому привыкли, устанавливая цвета в миксере цветов.

 

Если мувиклипу установить alpha 50% и +128 абсолютной величины, то это будет то-же самое что 100% alpha. Т.е. сначала задавая 50% убираем 128 (256*0,5=128) а затем прибавляем 128, в результате получаем 256. То-же самое относится и к цветам.

 

Соответствие панели Effect advanced скрипту легко увидеть в объекте colorTransformObject команды Color.setTransform() - наступило время посетить хелп.

 

потыкайтесь мышкой:

 

в именах параметров объекта есть логика, как это ни странно :)). r, g, b, a - первая часть имени, соответствует red, green, blue, alpha. Вторая часть имени: a - процентное, b - абсолютное. Вот и встало всё по местам.

 

Теперь пора поприменять полученные знания на примере. скачать исходник

  кликаем на мувик внизу, затем кликаем мышкой нужный цвет.

 

Открыли исходничек и смотрим:

в первом кадре в руте две функции:

fnchitTest()

fncDropper (mc)

 

других функций в мувике не используем, да и fnchitTest() только для облегчения написания скрипта - частный случай стандартной функции hitTest(.....). Вначале рассмотрим взаимодействие объектов. Объекты общаются только через переменную _root.targetColorMC, это наш интерфейс общения между объектами. _root.targetColorMC принимает значения ссылок на мувиклипы при клике на них, а при клике на цветовой панели удаляется.

 

Итак, в мувиках у нас:

 

onClipEvent (load) {

this.fnchitTest = _root.fnchitTest; // помещаем ссылку на функцию в мувиклип

}

onClipEvent (mouseUp) { // на клик

if (this.fnchitTest()) { // если мышка при этом на мувике

_root.targetColorMC = this; // передаем в интерфейс ссылку на кликнутый мувик

}

}

 

А в цветовой панели:

 

onClipEvent (load) {

this.fncDropper = _root.fncDropper;

this.fnchitTest = _root.fnchitTest; // помещаем ссылки на функции в мувиклип

}

onClipEvent (mouseMove) { // когда двигаем мышку

if (_root.targetColorMC) { // если выбран мувик

fncDropper(_root.targetColorMC); // исполнЯем рассчет и присвоение цвета

}

}

onClipEvent (mouseUp) { // если кникнули

if (this.fnchitTest()) { // на цветовой панели

delete _root.targetColorMC; // удалЯем ссылку на мувик и теперь при проверке будем получать null

}

}

 

Пришла пора разобрать по косточкам функцию рассчета и присвоения цвета:

Цветовую панель можно условно разделить на 6 частей по горизонтали и на 2 части по вертикали. Обратите внимание на то, где находится центр мувиклипа, а точнее, где находится картинка относительно центра мувиклипа :). Внизу я нарисовал график изменения составляющих цвета цветовой панели без учета осветления и затемнения. По этому графику видно, что при горизонтальном перемещении мыши в каждый момент изменяется всегда только одна составляющая, в то время, как две остальные составляющие цвета остаются константами. Есть 3 основных цвета - 0(6), 2, 4, и еще три цвета 1, 3, 5 получаются смешением двух из трех основных цветов.

 

Всего есть 6 зон изменения цвета.

В зонах 0-1, 2-3, 4-5 происходит увеличение значения изменяемой компоненты. В зонах 1-2, 3-4, 5-6 происходит уменьшение изменяемой компоненты.

 

Цвета мувиков в исходнике выставлены в панели в точности, как если бы были заданы программно.

 

function fncDropper (mc) { //на входе функции ссылка на мувиклип (mc), который будет менЯть цвет

if (this.fnchitTest()) { // если мышь на цветовой панели

 

var clr = new Object(); // создаем локальный (действующий в пределах функции) объект

 

var x = this._xmouse/this._width*6; // рассчитываем долю х позиции мыши относительно ширины цветовой панели ( долЯ варьируетсЯ от 0 до 1), затем умножаем на 6 - это довольно тонкий момент. Нужно это длЯ длЯ упрощениЯ дальнейшего вычислениЯ в каком сегменте находитсЯ мышь и длЯ приведениЯ к пределам от 0 до 1 дробной составлЯющей позиции мыши в сегменте.

var x_up = x-Math.floor(x); // вычислЯем приведенную к сегменту дробную составлЯющую позиции мыши в сегменте длЯ прЯмо пропорционального изменениЯ составлЯющей цвета

var x_dw = 1-x_up; // то же самое длЯ обратно пропорционального изменениЯ составлЯющей цвета

 

if (x<1) { // если мышь в сегменте 0-1

// ( сверЯемсЯ с графиком, что у нас там)

clr.rb = 255; // красный =255

clr.gb = 255*x_up; // зеленый увеличиваетсЯ с увеличением значениЯ x позиции мыши

clr.bb = 0; // синий =0

} else if (x<2) { // если мышь в сегменте 1-2

clr.rb = 255*x_dw; // красный уменьшаетсЯ с увеличением значениЯ х позиции мыши

clr.gb = 255; // зеленый =255

clr.bb = 0; // синий = 0

//дальше длЯ остальных сегментов то-же самое - сверЯемсЯ с графиком и задаем нужную комбинацию

} else if (x<3) {

clr.rb = 0; clr.gb = 255; clr.bb = 255*x_up;

} else if (x<4) {

clr.rb = 0; clr.gb = 255*x_dw; clr.bb = 255;

} else if (x<5) {

clr.rb = 255*x_up; clr.gb = 0; clr.bb = 255;

} else if (x<6) {

clr.rb = 255; clr.gb = 0; clr.bb = 255*x_dw;

}

// а теперь рассчитываем изменениЯ в зависимости от y позиции мыши - затемнение/ осветление

var y = -this._ymouse/this._height*2; // поскольку система координат во флеше перевернута относительно оси х, то вертим ее обратно менЯЯ знак, и рассчитываем y составлЯющую, также как и в 6ти сегментной системе, только имеЯ 2 сегмента умножаем на 2 длЯ приведениЯ к 2х сегментной системе.

if (y>0) { // и если мышь находитсЯ выше середины пропорционально осветлЯем (поскольку y находитсЯ в пределах от 0 до 1, то умножаЯ например на 0.5 (при соответствующем положении мыши) мы уменьшаем значениЯ цветовых составлЯющих)

clr.rb += (255-clr.rb)*y; clr.gb += (255-clr.gb)*y; clr.bb += (255-clr.bb)*y;

} else if (y<0) { // иначе пропорционально затемнЯем

clr.rb += clr.rb*y; clr.gb += clr.gb*y; clr.bb += clr.bb*y;

}

new Color(mc).setTransform(clr); // создаем новый безымЯнный объект Color, прикрепленный к мувиклипу mc и тут же применЯем к нему трансформацию цвета используЯ вычисленный объект clr

}

}

 

Да, наверняка вопросов будет много по уроку, пишите, отвечу..

 

И еще: когда будете тестить исходник, загляните в листинг переменных. Там кроме двух функций и ссылок на них ничего нет. Это так случайно у меня получилось :)), но это пример правильной организации объектов, функций, и использования переменных.

 

Стремитесь к тому, чтобы без нужды не захламлять скрипт массой переменных. Ведь в дальнейшем, при написании прототипных функций (мы к этому как-нибудь доберемся) этот вопрос станет критичным.

 

Hosted by uCoz