Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > ActionScript

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 04.02.2004, 18:54
menik вне форума Посмотреть профиль Отправить личное сообщение для menik Посетить домашнюю страницу menik Найти все сообщения от menik
  № 1  
menik

Регистрация: Feb 2004
Сообщений: 7
По умолчанию Работа с цветом

Вопрос - Каким образом можно решить такую проблему.
Есть цвет, заданный в 16-ричной форме (вынимается их XML, неважно откуда он взялся).
Нужно средствами AS нарисовать парралелипипед, чтобы одна видимая сторона была заполнена заданным цветом, а две другие - тем же цветом, но с другой яркостью - немного темнее. (Другими словами - нужен эффект тени, как можно задать 2 новых цвета, - чуть темнее основного).

Старый 04.02.2004, 22:17
opex вне форума Посмотреть профиль Отправить личное сообщение для opex Найти все сообщения от opex
  № 2  
opex
[+1.3 05.04.09]
 
Аватар для opex

Регистрация: Sep 2003
Адрес: Где-то рядом.
Сообщений: 686
Отправить сообщение для opex с помощью ICQ Отправить сообщение для opex с помощью Skype™
Код:
/* НА ОСНОВЕ исходника 3D CUBE ((C) 2002 Grigory A. Ryabov | http://www.flash.plux.ru) */
/* ULTRAFLASHER */
// -------------------------------------------------------------------------
// 
//
// ## ## ## ########## ###### ###### TM 
// ## ## ## ## ## ## ## ##
// ## ## ## ## ## ## ## ##
// ## ## ## ## ####### ########
// ###### ###### ## ## ## ## ##
//
// В этом примере куб рисуется на самом деле всего из трёх граней.
// Задние грани просто не рисуются, потому что они не видны.
// А можно рисовать все 6 граней и сортировать их по средней Z координате
// каждой грани. Но это уже другая история. Сначала пойми этот код.
//
_root.onLoad = function() {
	// координаты центра клипа
	cnx = 250;
	cny = 250;
	// дистанция от точки просмотра до центра мировых координат (0, 0, 0)
	dist = 200;
	// размеры куба
	var sx = 30;
	var sy = 30;
	var sz = 30;
	// коэффициент перевода радиан в градусы и обратно
	rad = Math.PI/180;
	// объявляем массив вершин
	v = new Array();
	// инициализируем вершины
	v[0] = {x:sx, y:-sy, z:sz};
	v[1] = {x:sx, y:sy, z:sz};
	v[2] = {x:sx, y:sy, z:-sz};
	v[3] = {x:sx, y:-sy, z:-sz};
	v[4] = {x:-sx, y:-sy, z:-sz};
	v[5] = {x:-sx, y:sy, z:-sz};
	v[6] = {x:-sx, y:sy, z:sz};
	v[7] = {x:-sx, y:-sy, z:sz};
	// задаём количество вершин
	amount = v.length-1;
};
_root.onEnterFrame = function() {
	// вычисляем углы поворота
	var xa = (cnx-_ymouse)*0.0005;
	var ya = (cny-_xmouse)*0.0005;
	// вычисляем косинусы и синусы углов, что бы не делать одно и тоже в цикле
	var sinY = Math.sin(xa);
	var cosY = Math.cos(xa);
	var sinX = Math.sin(ya);
	var cosX = Math.cos(ya);
	// цикл перебора всех вершин и вращения их вокруг осей x и y
	for (var i = 0; i<=amount; i++) {
		// вращение
		yp = v[i].y*cosY-v[i].z*sinY;
		zp = v[i].y*sinY+v[i].z*cosY;
		xp = v[i].x*cosX+zp*sinX;
		zp = -v[i].x*sinX+zp*cosX;
		// запоминаем получившиеся координаты
		v[i].x = xp;
		v[i].y = yp;
		v[i].z = zp;
		// преобразование перспективы
		perRatio = 1/(v[i].z/dist+1);
		v[i].rx = cnx+v[i].x*perRatio;
		v[i].ry = cny-v[i].y*perRatio;
	}
	// удаляем ранее нарисованные объекты
	_root.clear();
	// -------------------------------------------------------------------------
	// -- заливка грани #00
	// -------------------------------------------------------------------------
	// массив очередной грани
	a = [3, 2, 1, 0];
	// размерность массива
	d = a.length-1;
	// если грань видна, то..
	if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
		// обнуляем теневую переменную
		shadow = 0;
		// цикл вычисления цвета тени
		for (var i = 0; i<=d; i++) {
			shadow += (v[a[i]].rx-v[a[i]].ry);
		}
		// делим на колличество точек в грани
		shadow = 140+shadow/(d+2);
		// стиль линии
		_root.lineStyle(0, 0x000000, 100);
		// стиль заливки
		_root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
		// начальная точка
		_root.moveTo(v[a[0]].rx, v[a[0]].ry);
		// перебор всех точек грани
		for (var i = 1; i<=d; i++) {
			_root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
		}
		// конец заливки
		_root.endFill();
	}
	// -------------------------------------------------------------------------
	// -- заливка грани #01
	// -------------------------------------------------------------------------
	// массив очередной грани
	a = [2, 3, 4, 5];
	// размерность массива
	d = a.length-1;
	// если грань видна, то..
	if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
		// обнуляем теневую переменную
		shadow = 0;
		// цикл вычисления цвета тени
		for (var i = 0; i<=d; i++) {
			shadow += (v[a[i]].rx-v[a[i]].ry);
		}
		// делим на колличество точек в грани
		shadow = 140+shadow/(d+2);
		// стиль линии
		_root.lineStyle(0, 0x000000, 100);
		// стиль заливки
		_root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
		// начальная точка
		_root.moveTo(v[a[0]].rx, v[a[0]].ry);
		// перебор всех точек грани
		for (var i = 1; i<=d; i++) {
			_root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
		}
		// конец заливки
		_root.endFill();
	}
	// -------------------------------------------------------------------------
	// -- заливка грани #02
	// -------------------------------------------------------------------------
	// массив очередной грани
	a = [7, 6, 5, 4];
	// размерность массива
	d = a.length-1;
	// если грань видна, то..
	if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
		// обнуляем теневую переменную
		shadow = 0;
		// цикл вычисления цвета тени
		for (var i = 0; i<=d; i++) {
			shadow += (v[a[i]].rx-v[a[i]].ry);
		}
		// делим на колличество точек в грани
		shadow = 140+shadow/(d+2);
		// стиль линии
		_root.lineStyle(0, 0x000000, 100);
		// стиль заливки
		_root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
		// начальная точка
		_root.moveTo(v[a[0]].rx, v[a[0]].ry);
		// перебор всех точек грани
		for (var i = 1; i<=d; i++) {
			_root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
		}
		// конец заливки
		_root.endFill();
	}
	// -------------------------------------------------------------------------
	// -- заливка грани #03
	// -------------------------------------------------------------------------
	// массив очередной грани
	a = [0, 1, 6, 7];
	// размерность массива
	d = a.length-1;
	// если грань видна, то..
	if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
		// обнуляем теневую переменную
		shadow = 0;
		// цикл вычисления цвета тени
		for (var i = 0; i<=d; i++) {
			shadow += (v[a[i]].rx-v[a[i]].ry);
		}
		// делим на колличество точек в грани
		shadow = 140+shadow/(d+2);
		// стиль линии
		_root.lineStyle(0, 0x000000, 100);
		// стиль заливки
		_root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
		// начальная точка
		_root.moveTo(v[a[0]].rx, v[a[0]].ry);
		// перебор всех точек грани
		for (var i = 1; i<=d; i++) {
			_root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
		}
		// конец заливки
		_root.endFill();
	}
	// -------------------------------------------------------------------------
	// -- заливка грани #04
	// -------------------------------------------------------------------------
	// массив очередной грани
	a = [7, 4, 3, 0];
	// размерность массива
	d = a.length-1;
	// если грань видна, то..
	if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
		// обнуляем теневую переменную
		shadow = 0;
		// цикл вычисления цвета тени
		for (var i = 0; i<=d; i++) {
			shadow += (v[a[i]].rx-v[a[i]].ry);
		}
		// делим на колличество точек в грани
		shadow = 140+shadow/(d+2);
		// стиль линии
		_root.lineStyle(0, 0x000000, 100);
		// стиль заливки
		_root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
		// начальная точка
		_root.moveTo(v[a[0]].rx, v[a[0]].ry);
		// перебор всех точек грани
		for (var i = 1; i<=d; i++) {
			_root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
		}
		// конец заливки
		_root.endFill();
	}
	// -------------------------------------------------------------------------
	// -- заливка грани #05
	// -------------------------------------------------------------------------
	// массив очередной грани
	a = [1, 2, 5, 6];
	// размерность массива
	d = a.length-1;
	// если грань видна, то..
	if (((v[a[1]].rx-v[a[0]].rx)*(v[a[2]].ry-v[a[0]].ry)-(v[a[1]].ry-v[a[0]].ry)*(v[a[2]].rx-v[a[0]].rx))>=0) {
		// обнуляем теневую переменную
		shadow = 0;
		// цикл вычисления цвета тени
		for (var i = 0; i<=d; i++) {
			shadow += (v[a[i]].rx-v[a[i]].ry);
		}
		// делим на колличество точек в грани
		shadow = 140+shadow/(d+2);
		// стиль линии
		_root.lineStyle(0, 0x000000, 100);
		// стиль заливки
		_root.beginFill(shadow << 16 | shadow << 8 | shadow << 0, 100);
		// начальная точка
		_root.moveTo(v[a[0]].rx, v[a[0]].ry);
		// перебор всех точек грани
		for (var i = 1; i<=d; i++) {
			_root.lineTo(v[a[i]].rx, v[a[i]].ry, v[a[i+1]].rx, v[a[i+1]].ry);
		}
		// конец заливки
		_root.endFill();
	}
};
stop();
__________________
Бойтесь китайцев, компы приносящих!

Старый 04.02.2004, 22:52
opex вне форума Посмотреть профиль Отправить личное сообщение для opex Найти все сообщения от opex
  № 3  
opex
[+1.3 05.04.09]
 
Аватар для opex

Регистрация: Sep 2003
Адрес: Где-то рядом.
Сообщений: 686
Отправить сообщение для opex с помощью ICQ Отправить сообщение для opex с помощью Skype™
а если по легче то так но работает только для таких цветов как 0x000000,0xcccccc,0x333333 ну и для простых тоже будет рабоать только shadow не должна быть больше меньшего из
r g b
да и цвет придется передовать в трех переменных но это тое можно решить
Код:
r = 0xFF;
g = 0xFF;
b = 0xFF;
_root.createEmptyMovieClip("muv1", 1);
with (_root.muv1) {
	lineStyle(0, 0x000000, 100);
	beginFill(r << 16 | g << 8 | b << 0, 100);
	moveTo(0, 0);
	lineTo(100, 0);
	lineTo(100, 100);
	lineTo(0, 100);
	lineTo(0, 0);
	endFill();
}
// shadow  насколько зделать темнее
shadow = 0x12;
r1 = r-shadow;
g1 = g-shadow;
b1 = b-shadow;
_root.createEmptyMovieClip("muv2", 2);
with (_root.muv2) {
	lineStyle(0, 0x000000, 100);
	beginFill(r1 << 16 | g1 << 8 | b1 << 0, 100);
	moveTo(100, 0);
	lineTo(200, 0);
	lineTo(200, 100);
	lineTo(100, 100);
	lineTo(100, 0);
	endFill();
}
__________________
Бойтесь китайцев, компы приносящих!

Старый 05.02.2004, 13:25
menik вне форума Посмотреть профиль Отправить личное сообщение для menik Посетить домашнюю страницу menik Найти все сообщения от menik
  № 4  
menik

Регистрация: Feb 2004
Сообщений: 7
2 орех: Отлично, получил. что хотел. Большое спасибо.

Создать новую тему   Часовой пояс GMT +4, время: 20:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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