Как сделать программно создаваемый текст маской

В этой статье описан мой метод, как сделать программно создаваемый текст маской на ActionScript 2.0

Недавно столкнулся с задачей: нужно было сделать текст маской. Проблема была в том, что текст создавался программно, и маска не работала =(

Перерыв огромное количество мануалов и сайтов и не найдя ничего подходящего, я пришел к выводу, что надо самому придумывать, как выкрутиться. Первое, что мне пришло в голову, - это использовать BitmapData, а именно создать прозрачную битмапу, отрисовать текст с помощью метода draw(), аттачить её к мувиклипу и затем сделать его маской.

Сначала создадим текст:

var txt:TextField = this.createTextField("text_txt", this.getNextHighestDepth(), 0,0,100,100);
txt.text = "hello";
txt.setTextFormat(new TextFormat("Verdana", 24));

Затем нам нужно создать экземпляр класса BitmapData (не забывайте импортировать его в начале), размеры задаем такие же, как и у текста:

import flash.display.BitmapData;

var bitmap:BitmapData = new BitmapData(100,100,true,0x00cc00ff);
bitmap.draw(txt);
 

Итак, у нас имеется битмапа. Теперь можно создать мувиклип и аттачить к нему битмапу, сделав его впоследствии маской.*fon_mc - это любой имеющийся на сцене мувиклип, для которого будет служить маской наш текст*

this.createEmptyMovieClip("mc_mc", this.getNextHighestDepth());
mc_mc.attachBitmap(bitmap, this.getNextHighestDepth());
fon_mc.setMask(mc_mc);

Поступив таким образом, я понял, что сделал ерунду, так как маска получилась прямоугольная (по размерам битмапы). По крайней мере битмапу мы создали не зря. Она у нас поддерживает альфа-канал, значит мы можем выяснить положение непрозрачных пикселей. Что же мы делаем дальше? Создадим мувиклип, чёрный квадрат размером 1х1 пиксель и назовём его "dot", соответственно в библиотеке в linkage properties экспортируем его для action script также с именем "dot". Теперь мы создаём новый мувиклип (назовём его "dotHolder", так как он будет содержать мувики "dot").

this.createEmptyMovieClip("dotHolder_mc", this.getNextHighestDepth());
dotHolder_mc._x = mc_mc._x;
dotHolder_mc._y = mc_mc._y;

С помощью цикла for (а точнее двух циклов) пробегаем по всем пикселям битмапы и методом getPixel() проверяем их на прозрачность. В случае, если пиксель непрозрачный, аттачим на его место наш мувик "dot". Переменные i и j обозначают x и y положения пикселя. Значит, как только мы прикрепляем новый "dot", мы сразу же задаём ему _x и _y свойства равными i и j.

for (var i=0; i<100; i++) {
    for (var j=0;j<100;j++) {
        if (bitmap.getPixel32(i,j)!=0) {
            dotHolder_mc.attachMovie("dot", "dot"+i+j, dotHolder_mc.getNextHighestDepth());
            dotHolder_mc["dot"+i+j]._x = i;
            dotHolder_mc["dot"+i+j]._y = j;
        }
    }
}

В итоге, наш dotHolder становится полноценным мувиклипом и может служить маской =) Нам остаётся только назначить его таковым. Ну и заодно сделать клип с текстом невидимым (или удалить его совсем).

fon_mc.setMask(dotHolder_mc);
mc_mc._visible = false;

Недостатком этого метода является то, что по сравнению с текстом, мувик получается не таким гладким. Вот, пожалуй,и всё. Если у вас есть свои соображения, как сделать программно создаваемый текст маской, комментируйте, буду рад услышать ваше мнение =) Полный код ниже:

import flash.display.BitmapData;
var txt:TextField = this.createTextField("text_txt", this.getNextHighestDepth(), 0,0,100,100);
txt.text = "hello";
txt.setTextFormat(new TextFormat("Verdana", 24));
var bitmap:BitmapData = new BitmapData(100,100,true,0x00cc00ff);
bitmap.draw(txt);
this.createEmptyMovieClip("mc_mc", this.getNextHighestDepth());
mc_mc.attachBitmap(bitmap, this.getNextHighestDepth());
this.createEmptyMovieClip("dotHolder_mc", this.getNextHighestDepth());
dotHolder_mc._x = mc_mc._x;
dotHolder_mc._y = mc_mc._y;
for (var i=0; i<100; i++) {
    for (var j=0;j<100;j++) {
        if (bitmap.getPixel32(i,j)!=0) {
            dotHolder_mc.attachMovie("dot", "dot"+i+j, dotHolder_mc.getNextHighestDepth());
            dotHolder_mc["dot"+i+j]._x = i;
            dotHolder_mc["dot"+i+j]._y = j;
        }
    }
}
fon_mc.setMask(dotHolder_mc);
mc_mc._visible = false;

 Жду с нетерпением
ваших комментариев!
 

Подписаться на RSS

Вы можете нажать "подписаться", чтобы следить за моими новостями!
Так вы всегда будете в курсе появления новостей на сайте =)
О том, что такое RSS можно прочитать здесь.

Подписаться

Подписаться на Twitter

Я специально зарегистрировался в Твиттере, чтобы вы могли следить за обновлениями на сайте =)

Подписаться

Envato marketplace А эти люди занимаются прокатом карнавальных костюмов и масок в Минске. К слову, я им делал сайт.