Book2v1
.pdfРис. 98: Подготовка файла шрифта к использованию в Processing.
191
11.1Работа со шрифтом, PFont
Рассмотрим базовую работу с текстом на примере кода Листинга 83. В нем мы определенным шрифтом отрисуем слово в окне нашего приложения.
Во второй строке кода Листинга 83 мы объявили свойство font класса PFont. С этим свойством мы свяжем объект класса PFont в 9-й строке, который, в свою очередь, возвращается методом loadFont(). Пока нам не требуется анимация, так что мы вызвали метод noLoop(), и значит, метод draw() сработает только один раз.
Далее, в 10-й строке мы устанавливаем текущий размер шрифта (вызываем метод textFont()), так же как и текущий цвет заливки в строке 11. Заливка будет действовать в том числе и на буквы.
Листинг 83: Рисуем предложение
1
2PFont font ;
3
4void setup () {
5 |
size (600 , 180) ; |
6smooth () ;
7background (0) ;
8noLoop () ;
9 |
font = loadFont (" Bauhaus93 -48. vlw "); |
|
10 |
textFont ( font , 48) ; |
|
11 |
fill (178 , |
7, 157) ; |
12 |
|
|
13 |
} |
|
14 |
|
|
15 |
void draw () { |
|
16 |
text (" The |
world is here " , 120 , 100) ; |
17 |
} |
|
Отрисовка непосредственно текста происходит с помощью вызова метода text() в 16-й строке. Метод принимает строку для отрисовки и положение, где именно она будет отрисована. Таким образом мы отрисовали строку текста. Если нам требуется нарисовать две строки, то необходимо или еще раз вызвать метод text() с другими значениями аргументов, или использовать символ перевода строки: \n.
Результат работы кода Листинга 83 показан на Рисунке 99. Модифицируем код Листинга 83. Мы будем отрисовывать два сло-
ва, причем разными цветами и в разных местах приложения. Работая на контрастах, мы «закрутим» нашу композицию так, чтобы слова перекрывали друг друга, как бы боролись и в то же время сливались в одном ритме.
192
Рис. 99: Результат выполнения Листинга 83. Предложение.
Листинг 84: Крутим слова
1
2PFont font ;
3 |
float rotateCounter = 0; |
4 |
|
5void setup () {
6 |
size (600 , 600) ; |
7smooth () ;
8background (0) ;
9
10font = loadFont (" Bauhaus93 -48. vlw ");
11textFont ( font , 48) ;
12}
13
14 |
void draw () { |
15 |
translate ( width /2 , height /2) ; |
16 |
|
17pushMatrix () ;
18rotate ( rotateCounter );
19fill (255) ;
20 |
text (" Black " , mouseX - width /2 , mouseY - height /2) ; |
21 |
popMatrix () ; |
22 |
|
23pushMatrix () ;
24rotate (- rotateCounter *1.5) ;
25fill (0) ;
26 |
text (" White " , width /2 - mouseX , height /2 - mouseY ); |
27 |
popMatrix () ; |
28 |
|
29rotateCounter +=0.05;
30}
Результат работы кода Листинга 84 показан на Рисунках 100 и 101. В виду того что класс PFont работает с растровым форматом (.vlw)
193
Рис. 100: Результат выполнения Листинга 84. Вращение двух слов Black и White. Фаза 1.
194
Рис. 101: Результат выполнения Листинга 84. Вращение двух слов Black и White. Фаза 2.
195
шрифта, то у нас нет возможности дать букве например, обводку. Возможна работа и с кириллическим текстом (так же, как и работа со всеми шрифтами кодировки utf8): для этого вам потребуется при создании шрифта зайти в подменю Characters... и выбрать All Characters. Тогда в файле .vlw будут сформированы кирилические символы (конечно, выбранный вами шрифт должен содержать кириллические глифы). Кстати, сам редактор Processing (версия 2) не поддерживает кириллические символы и по умолчанию они отображаются прямоугольными значками. Пример использования кириллицы можно увидеть на Рисунке 102.
В Processing существует ряд методов для работы с объектами класса PFont. Методы призваны решать такие задачи типографики, как выравнивание текста – метод textAlign(), управление межстрочным интервалом
– метод textLeading(), управление размером шрифта – метод textSize(), получение ширины символа – метод textWidth().
Задание 1. На базе Листинга 84 создайте приложение, в котором используйте два разных шрифта. К изображению примените фильтры, тонирование или режимы смешивания.
Метод textMode() с аргументом SHAPE используется для формирования векторных глифов взамен растровых изображений. Этот режим работы со шрифтом применяется для сохранения исходного результата в форматы pdf и dxf. В Processing версии 2 невозможно использовать этот режим для отрисовки на экране, тем не менее рассмотрим работу с тестом из формата SVG, где мы можем получить доступ до векторного формата глифа.
11.2Работа с буквами из формата SVG
Если вам требуется более изящная работа с линиями начертания буквы, то есть векторное представление глифов, то класс PFont вам не подойдет. Тогда удобнее работать с глифами напрямую, например, преобразовав текст в кривые в любом векторном редакторе. Дальнейший процесс аналогичен процессу работы с форматом SVG.
Начнем с подготовки нашего SVG изображения. Этот пример мы будем рассматривать также с помощью редактора Inkscape. В нем мы создали SVG документ размерами 600х300 пикселей и набрали слово «Visual» определенным шрифтом. К сожалению, импортирование SVG файлов, содержащих тексты и шрифты, в Processing невозможно, поэтому мы перевели слово в кривые и в каждой букве увеличили количество
196
Рис. 102: Результат выполнения Листинга 84. Вращение двух слов Белый и Черный.
197
Рис. 103: Снимок экрана с процессом редактирования в Inkscape.
точек на кривой. Снимок экрана с процессом редактирования в Inkscape показан на Рисунках 103 и 104.
Рис. 104: Размещение точки между двумя соседними в редакторе
Inkscape.
198
На Рисунке 103 можно видеть примерное количество точек, которое должно быть на кривой. Дело в том, что далее мы будем отрисовывать в этих точках те или иные фигуры, поэтому плотность точек должна быть сравнительно большой. Разместить точку между двумя соседними точками в редакторе Inkscape можно с помощью команды Insert new nodes into selected segments (см. Рисунок 104).
Так как каждая буква переведена в кривые, то она имеет свой уникальный идентификатор – id. Посмотрите на Рисунок 103: в его правой части открыто окно XML Editor, в котором можно видеть 6 тегов XML SVG. Каждый тег соответствует соответствующей букве и имеет атрибут id с уникальным значением. Например, сейчас выделена буква «V» и ей соответствует тег с id = path4166. По этому id мы будем обращаться к букве из Processing приложения. Далее мы должны сохранить наше SVG изображение и добавить его в проект Processing.
Рассмотрим пример кода Листинга 85, который будет обрабатывать наш подготовленный SVG файл.
Листинг 85: Рисуем переливающиеся буквы
1 |
|
2 |
PShape [] borders ; |
3int vertexCount ;
4 |
float |
sinCounter = 0; |
5 |
float |
eSize = 15; |
6 |
|
|
7void setup () {
8 |
size (600 , 300) ; |
9smooth () ;
10background (0) ;
11noStroke () ;
12PShape drawingSVG = loadShape (" m1 . svg ");
13 |
borders = |
new |
PShape [6]; |
14 |
borders [0] |
= |
drawingSVG . getChild (" path4166 "); |
15 |
borders [1] |
= |
drawingSVG . getChild (" path4168 "); |
16 |
borders [2] |
= |
drawingSVG . getChild (" path4170 "); |
17 |
borders [3] |
= |
drawingSVG . getChild (" path4172 "); |
18 |
borders [4] |
= |
drawingSVG . getChild (" path4174 "); |
19 |
borders [5] |
= |
drawingSVG . getChild (" path4176 "); |
20 |
} |
|
|
21 |
|
|
|
22void draw () {
23background (0) ;
24 |
for ( int j = 0; |
j |
< 6; j ++) { |
|
25 |
vertexCount |
= |
borders [j ]. getVertexCount () ; |
|
26 |
for ( int |
i = |
0; |
i < vertexCount ; i +=1) { |
27 |
float |
vx = |
borders [j ]. getVertexX (i) + 50; |
199
28
29
float vy = borders [j ]. getVertexY (i) - 750;
float ellipseColor = map ( sin ( sinCounter ) , -1 ,1 ,0 ,255) ;
30fill ( ellipseColor );
31float ellipseSize = map (i ,0 , vertexCount , eSize , eSize
|
+40) ; |
|
32 |
ellipse (vx , |
vy , ellipseSize , ellipseSize ); |
33 |
|
|
34 |
if ( sinCounter < TWO_PI ){ |
|
35 |
float cv = |
map ( mouseX ,0 , width ,0 ,1) ; |
36 |
sinCounter += cv ; |
37} else {
38sinCounter = 0;
39}
40}
41}
42// filter ( BLUR , 1) ;
43}
Этот пример был написан под влиянием работы Ekstasy Type Club проекта http://paperdove.com/ от Dae In Chung. Исходные коды работы не опубликованы, поэтому представляю вам свой вариант. Результат работы кода показан на Рисунках 105 и 106.
Рис. 105: Результат выполнения Листинга 85. Переливающиеся буквы. Фаза 1.
Общий принцы работы кода Листинга 85 состоит в том, что мы «обходим» букву за буквой и в каждой букве «обходим» вершины (точки). Для каждой вершины мы отрисовываем свой эллипс, причем цвет эллипса изменяется по синусоидальному закону от черного к белому. Размер эллипса уменьшается от первой вершины буквы к последней.
200