Главная > Анимация, Графика > Растрирование текста или “Per aspera — ad astra”

Растрирование текста или “Per aspera — ad astra”

Под впечатлением анонса нового Flash Player-а под кодовым именем "Astra" я вспомнил свою старую публикацию, в которой я демонстрировал эффект появления текста из звездочек. Но там это было реализовано под ActionScript 2. И вот решил я сделать что-то подобное под ActionScript 3.

Давайте смотреть что получилось.

Сначала создаем класс, реализующий эффект собирания текстовой строки из точек:

  1. package
  2. {
  3. import flash.display.BitmapData;
  4. import flash.display.Sprite;
  5. import flash.geom.Point;
  6. import flash.text.TextField;
  7. import flash.text.TextFormat;
  8.  
  9. public class StarText extends Sprite
  10. {
  11. public function StarText(text:String)
  12. { // передаем в виде параметра текстовую строку
  13. var textWidth:int
  14. var textHeight:int
  15. var tf:TextField = new TextField();
  16. var bmp:BitmapData;
  17. var tformat:TextFormat = new TextFormat("_sans", 12); // задаем формат текста
  18. tf.autoSize="left"; // текстовое поле будет автоматически расширяетmcz
  19. tf.text=text; // заполняем текстовое поле текстом
  20. tf.setTextFormat(tformat); // присваеваем формат текста
  21.  
  22. bmp = new BitmapData(tf.width, tf.height, false); // создаем растр с размерами текста
  23. bmp.draw(tf); // растрируем текст
  24. textWidth = bmp.width; // ширина растровой картинки
  25. textHeight = bmp.height; // высота растровой картинки
  26. for (var x:int=0; x<textWidth; x++){ // прямым перебором
  27. for (var y:int=0; y<textHeight; y++){ // вылавливаем все точки
  28. var volume:uint= bmp.getPixel(x,y); // цвет которых равен 0
  29. if (volume==0){ // то есть 0x000000 ...
  30.  
  31. addChild(new Star(new Point(x,y))) // ... и добавляем "звездочку"
  32. } // смотри в следующем листинге.
  33. }
  34. }
  35.  
  36. }
  37. }
  38. }

Теперь собственно "Звездочка", которая летит-летит и прилетает куда нужно.

  1. package {
  2. import flash.display.Bitmap;
  3. import flash.display.BitmapData;
  4. import flash.display.Sprite;
  5. import flash.events.Event;
  6. import flash.geom.Point;
  7.  
  8. public class Star extends Sprite {
  9. private var starCoord:Point;
  10. public function Star(coord:Point):void { // в параметрах передаем координаты
  11. starCoord=coord; // в которые наша точка дожна прилететь
  12. var bmpStarSrc:BitmapData = new BitmapData(1,1,false,0x00ff00); // рисуем точку зеленую
  13. var bmpStar:Bitmap = new Bitmap (bmpStarSrc);
  14. bmpStar.x = Math.random()*300-Math.random()*150; // помещаем в случайные координаты
  15. bmpStar.y = Math.random()*300-Math.random()*150;
  16. bmpStar.addEventListener(Event.ENTER_FRAME, fly); // добавляем вызов периодической функции
  17. addChild(bmpStar); // возвращаем созданый объект
  18. }
  19. private function fly(e:Event):void { // эта функция будет двигать точку в нужные координаты
  20. var trgt = e.target;
  21. var tox:Number = (trgt.x - starCoord.x)/16; // вычисляем смещение
  22. var toy:Number = (trgt.y - starCoord.y)/16;
  23. if (Math.abs(tox)>0.5 || Math.abs(toy)>0.5) { // если смещение не очень маленькое
  24. trgt.x-=tox; // смещаем точку
  25. trgt.y-=toy;
  26. }
  27. else // иначе
  28. {
  29. trgt.removeEventListener(Event.ENTER_FRAME, fly); // убираем повторение
  30.  
  31. trgt.x=starCoord.x; // выставляем точку в конечные координаты
  32. trgt.y=starCoord.y;
  33.  
  34. }
  35. }
  36. }
  37. }

теперь базовый класс:

  1. package {
  2. import flash.display.Sprite;
  3. public class Main extends Sprite
  4. {
  5. public function Main()
  6. {
  7. var st:StarText = new StarText("БОЛЬШАЯ ИСТОРИЯ СОЗДАНИЯ МАЛЕНЬКОГО ПРИЛОЖЕНИЯ")
  8. st.x=100
  9. st.y=170
  10. addChild(st)
  11. }
  12. }
  13. }

ну с ним, наверное, все понятно?... если нет, милости просим в комментарии 😉

  1. 6 октября 2007 в 03:53 | #1

    Слушай, а можно поинтересоваться насчет твоего программистского бэкграунда. Я бы подумал, что C#. Угадал?

  2. 6 октября 2007 в 12:40 | #2

    Могу сказать что с C# дела не имел.
    Свое обучение начинал с Turbo C, Turbo Pascal,
    ну и конечно Ассемблер процессора 6502

    а почему такой вопрос возник?

  3. 7 октября 2007 в 20:35 | #3

    Да просто не понимаю зачем начинающих программеров учить программировать в совершенно преступных соглашениях по кодированию? Соглашения по кодированию из примеров как раз C#-овские. Но к ActionScript они отношения не имеют. Соглашения по кодированию для ActionScript произошли из соглашений языка Java.

    Я, конечно, понимаю, что можно сказать, что, якобы, это не имеет значения. Но стандарты, вопреки заблуждениям многих российских программеров, имеют важное значение. Они позволяют программисту при устройстве на другую работу не переучиваться заново. И нет для многих ничего более невозможного, чем переучиваться с по тем или иным причинам используемым неправильным соглашениям по кодированию на правильные. Особенно если паренек, читатель твоего блога, — молодой самоучка и не придает внимания таким «мелочам», а считает, что старшие программисты к нему придираются.

    Я к тому, что может так оказаться, что для кого-то азы программирования на AS начнутся с твоего блога и постановка у них может быть испорченой надолго. Не лучше ли сразу и их, и себя приучить к правильным практикам?

    Ну и можно даже в каждом уроке рассказывать про одно из соглашений по кодированию, сопровождая это иллюстрацией из кода. Тогда и не сильно занудно будет, и полезно :))

    Хотя мне показалось, что в этом уроке именование методов ты стал писать со строчной буквы в отличие от предыдущего.

  4. 7 октября 2007 в 21:25 | #4

    Да просто не понимаю зачем начинающих программеров учить программировать в совершенно преступных соглашениях по кодированию? Соглашения по кодированию из примеров как раз C#-овские. Но к ActionScript они отношения не имеют. Соглашения по кодированию для ActionScript произошли из соглашений языка Java.

    Костя, я не собираюсь никого учить. Моя цель — заинтересовать. Но критику я воспринял, и попытаюсь в дальнейшем придерживаться «соглашений».

    Я к тому, что может так оказаться, что для кого-то азы программирования на AS начнутся с твоего блога и постановка у них может быть испорченой надолго. Не лучше ли сразу и их, и себя приучить к правильным практикам?

    Я буду рад, если хоть один посетитель блога действительно хотя бы заинтересуется вообще настоящим программированием 🙂

  5. 7 октября 2007 в 21:36 | #5

    Constantiner, радость наша, проведи, пожалуйста, ликбез для молодых и зеленых! (и белых)

  6. 9 октября 2007 в 01:25 | #6

    Ну лучший ликбез — это код от Adobe. Там все соглашения четко соблюдены и код аккуратненький.

    А тут ( http://blog.dclick.com.br/2007/02/13/adobe_flex_coding_guidelines_english/ ) естькак раз отличный документ, который хоть и не является официальным, но довольно хорошо это все описывает.

    А вот откуда у всего этого ноги растут: http://java.sun.com/docs/codeconv/

  7. 9 октября 2007 в 03:02 | #7

    Ну лучший ликбез — это код от Adobe. Там все соглашения четко соблюдены и код аккуратненький.

    А вот за ссылку — сердечное спасибо…. Жаль только битая она как оказалось…

    Будет материал для публикаций. А то вчера хотел на Flexipedia посмотреть, а там шиш…

  8. 10 октября 2007 в 19:29 | #8

    Из двух ссылок, что я привел, обе прямо сейчас у меня прекрасно открылись. Попробуй еще и если что пни своего провайдера.

  9. 10 октября 2007 в 19:48 | #9

    Из двух ссылок, что я привел, обе прямо сейчас у меня прекрасно открылись. Попробуй еще и если что пни своего провайдера.

    Да, я на утро уже открыл. Уже скачал PDF, хочу сделать перевод, адаптировать и выложить на сайте.

  10. 14 октября 2007 в 15:30 | #10

    Это только у меня в StarText буквы обгрызанные или нет?

  1. Пока что нет уведомлений.