PDA

Просмотр полной версии : По поводу маски


Guelder
14.11.2006, 17:24
Я хочу из прямоугольника вырезать центр, чтобы получилась рамка. Мне интересно, как это можно сделать? Логично было бы предположить, что можно в прямоугольник вписать еще один прямоугольник, поменьше, назначить его маской и.. как бы инвертировать, чтоли, если это возможно. Мне думается, что возможно, только я не знаю как...

BJV
14.11.2006, 18:09
очень просто. если правильно написан ответ.?
никакой маски делать не надо!
выделяете одним кликом само боди прямоугольника (если изначально фома была создана с рамкой) выделенную область удаляете кнопкой delete/ и все., а рамка остается (главное не выделять!)
если же изначально было без рамки, то сверху на том же слое наклыдываете другой прямоугольник, меньшей формы, пока новый ещё!выделенный формы отцентрируйте. после - выделение убираете, формы сливаете (главное чтоб эти формы были разных цветов) потом выделяете внутрений и просто удаляете. все рамка готова, а потом делайте с ней что хотите.

Guelder
14.11.2006, 18:13
Мне программно все это сделать надо. Прямоугольник нарисовать ручками проблемы не вызывает :)

DarkLight
14.11.2006, 19:00
Проще программно нарисовать рамку

Guelder
14.11.2006, 19:03
Удивительно, как до 8-й версии не реализовали такую простую вещь, как инвертирование маски - она везде есть. Чтобы заданная область не показывалась, а скрывалась. По-моему это очевидно нужная возможность

Wolsh
14.11.2006, 23:29
Ну уж если ты в восьмерке делаешь, так и используй blend'ы.
А ругать гениальных разработчиков всяк горазд, кто хоть десять строк кода написал в своей жизни :) Просто инструменты гораздо более общее применение имеют, а на каждую конкретную задачу свой метод создавать - шибко жирно компиллятор будет весить :)
// создаем контейнер
_root.createEmptyMovieClip("obadva_mc",1);
obadva_mc.createEmptyMovieClip("ramka_mc",1);
// рисуем внешний прямоугольник
with(obadva_mc.ramka_mc){
beginFill(0xFF0000); moveTo(10, 10);
lineTo(400, 10); lineTo(400, 300);
lineTo(10, 300); lineTo(10, 10);
endFill();
}
obadva_mc.createEmptyMovieClip("mask_mc",5);
// рисуем внутренний прямоугольник
with(obadva_mc.mask_mc){
beginFill(0xFFFF00); moveTo(30, 30);
lineTo(380, 30); lineTo(380, 280);
lineTo(30, 280); lineTo(30, 30);
endFill();
}
// назначаем режим наложения
obadva_mc.blendMode = 2
obadva_mc.mask_mc.blendMode = 11
// регулируем прозрачность дырки
obadva_mc.mask_mc._alpha = 50
Одна проблема - альфа дырки не может быть 0, должна быть хотябы 1%.
Но это незаметно.

DarkLight
14.11.2006, 23:55
function drawRect(mc:MovieClip, a:Number, b:Number):Void {
mc.moveTo(a, a);
mc.lineTo(b, a);
mc.lineTo(b, b);
mc.lineTo(a, b);
mc.lineTo(a, a);
}
function drawBorder(mc:MovieClip):Void {
mc.beginFill(0);
mc.lineStyle(1, 0);
drawRect(mc, 0, 100);
drawRect(mc, 10, 90);
mc.endFill();
}
_root.createEmptyMovieClip("brd", 1);
brd._x = 100;
brd._y = 100;
drawBorder(brd);

DarkLight
14.11.2006, 23:59
Или вообще так

function drawRect(mc:MovieClip, a:Number, b:Number):Void {
//Изменение последнего параметра lineStyle
//позволит срезать или скруглить углы рамки
mc.lineStyle(10, 0, 100, false, "normal", "square", "miter");
mc.moveTo(a, a);
mc.lineTo(b, a);
mc.lineTo(b, b);
mc.lineTo(a, b);
mc.lineTo(a, a);
}
_root.createEmptyMovieClip("a", 1);
drawRect(a, 0, 100);