Материал из Скретч Вики

Отрисовка текста отображает текст на сцене в Скретче с большей гибкостью чем у блока сказать [], но требует больше работы. Есть два основных подхода:

  1. Быстрое повторное использование блока сказать [], который создает стиль телетайпа в речевом пузыре.
  2. Использование набора костюмов в спрайте для отображения изображений букв.

Отрисовка текста с помощью блока «Сказать»

Отрисовка текста с помощью блока «Сказать».

Это простой процесс, требующий две переменные: (номер символа) и (текст). Пользователю также нужно будет создать пользовательский блок:

определить отрисовать текст (строка)

отрисовать текст []

Определение пользовательского блока

Ниже показан скрипт определения для пользовательского блока:

определить отрисовать текст (строка)
задать [номер символа v] значение [1]
задать [текст v] значение [] // Пока нет текста
повторить (длина (строка)) раз // Говорим столько раз, сколько букв в строке
  задать [текст v] значение (объединить (текст) (буква (номер символа) в (строка)))
  сказать (текст) //Говорит то, что было сказано ранее, и новый символ
  изменить [номер символа v] на (1) // Переходим к следующему символу
end 

Не забудьте снять галочку «Запустить без обновления экрана», иначе текст не будет отображаться. Также если проект воспроизведён в турбо-режиме, эффект телетайпа не будет отображаться, если нет ждать () секунд или любой другой задержки в цикле.

Отрисовка текста с помощью спрайта

Примеры в данном разделе используют печать. Вполне возможно получить такой же визуальный эффект созданием клонов: просто замените каждый блок для печати блоком создать клон [самого себя v]. Однако, использование клонов имеет два недостатка:

  1. Проект будет более склонён к лагу.
  2. Максимальный лимит Скретча — 300 клонов.

Попытки рендеринга текста с помощью спрайтов могут привести к нежелательным результатам, если строка ввода содержит непредусмотренные символы.

Без чувствительности к регистру

Для начала получите или создайте 33 костюма для каждой буквы от А до Я. Убедитесь в том, что у каждого костюма название представляет собой соответствующую букву в нижнем регистре. Обычно является хорошей идеей иметь костюм для символа пробела. При загрузке файла для пробела в Ваш Скретч-проект не забудьте поменять название костюма на один пробел. Если необходимо использовать другие символы (например, знаки препинания и цифры), для каждого из них потребуется костюм, название которого совпадает с названием символа.

Пользовательский блок (см. ниже) обрабатывает данный текст, отрисовывая одну букву одновременно. Он берёт три параметра: (текст::custom-arg) для рендеринга и (x текста::custom-arg) и (y текста::custom-arg) для определения позиции текста. Вполне безопасно и обычно желательно установить этот пользовательский блок на запуск без обновления экрана.

определить отрисовать текст (текст) в x: (x текста) y: (y текста)
задать [прошлый x v] значение (положение x) // запомнить исходное положение спрайта
задать [прошлый y v] значение (положение y)
перейти в x: (x текста) y: (y текста) //переходим в позицию начала текста
задать [буква v] значение [1]
повторить (длина (текст)) раз 
  изменить костюм на (буква (буква) в (текст))
  печать // оставляем изображение этой буквы
  изменить x на (ширина буквы) //переходим в позицию следующей буквы
  изменить [буква v] на (1)
end
перейти в x: (прошлый x) y: (прошлый y) //возвращаемся в изначальное положение

Значение переменной (ширина буквы) должно быть примерной шириной букв в пикселях (например, 15).

С чувствительностью к регистру

Для чувствительности к регистру см. Определение регистра перед этим руководством. Вам понадобятся костюмы из того руководства. Если понадобится использовать любые буквы/символы кроме от А до Я, им понадобится свои костюмы. Некоторые символы, которые было бы полезно добавить, включают: знаки препинания, цифры и другие.

Первый шаг — создать пользовательский блок и пройти сквозь каждую букву сообщения для рендеринга. Данный пользовательский блок будет принимать три параметра: (текст::custom-arg) для рендеринга и (x текста::custom-arg) и (y текста::custom-arg) для определения позиции текста. Он также должен запускаться без обновления экрана.

Переменная (буква) будет использоваться чтобы запомнить, на какую букву сейчас смотрят.

определить отрисовать текст (текст) в x: (x текста) y: (y текста)
перейти в x: (x текста) y: (y текста)
задать [буква v] значение [1]
повторить (длина (текст)) раз 
  изменить [буква v] на (1)

Затем переключитесь на соответствующий костюм с учётом регистра. О том, как это делается, читайте в руководстве про чувствительность к регистру. После обработки одной буквы переходите к следующей, увеличивая позицию x.

определить отрисовать текст (текст) в x: (x текста) y: (y текста)
перейти в x: (x текста) y: (y текста)
задать [буква v] значение [1]
повторить (длина (текст)) раз 
  изменить костюм на [нуль v]
  изменить костюм на (буква (буква) в (текст)) //если символ в нижнем регистре, то костюм останется на «нуль»
  если <(костюм #) = (1)> , то //если спрайт не сменил костюм из-за того, что символ в нижнем регистре
    изменить костюм на (объединить (буква (буква) в (текст)) [т]) // все костюмы в нижнем регистре заканчиваются на «т»
  end
  если <(костюм #) = (1)> , то // если спрайт до сих пор не сменил костюм
    . . . // есть пробел, символ без костюма или костюм с неправильным именем
    . . . // предположим, что это пробел
  иначе 
    печать
  end 
  изменить x на (10) // измените это число для увеличения пространства между буквами
  изменить [буква v] на (1)

Изменение ширины букв

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

Для осуществления этого создайте список (ширины букв::list). Для каждого костюма введите его ширину (плюс один или два пикселя) в список. Убедитесь в том, что номер костюма соответствует с номером в списке!

Если есть костюм для пробела, то он тоже требует номер в списке. Добавьте в список ширину для пробела.

В скрипте для рендеринга текста замените:

изменить x на (10)

На:

изменить x на (элемент (костюм [номер v]) в [ширины букв v])

Для проверки правильности ширины всех букв полезно отрисовать все поддерживаемые буквы и символы.

Создание консоли

Иногда требуется преобразование списка в экранную консоль. Это полезно для игр в виде текстовых приключений или RPG, а также симуляций операционных систем. Для начала создайте список для скрипта рендеринга ((консоль::list)). Скрипт выше должен быть слегка модифицирован, чтобы он корректно работал:

перезагрузить экран

определить перезагрузить экран
повторять пока не <(длина списка [консоль v]) < [21]> 
  удалить (1) из [консоль v]
end
задать [элемент списка v] значение [0]
повторить (длина списка [консоль v]) раз 
  изменить [элемент списка v] на (1)
  отрисовать текст (элемент (элемент списка) в [console v]) в y: (((0) - ((элемент списка) * (15))) + (175))
end

определить отрисовать текст (текст) в y: (y текста)
перейти в x: (-230) y: (y текста)
задать [буква v] значение [1]
повторить (длина (текст)) раз 
  изменить костюм на [нуль v]
  изменить костюм на (буква (буква) в (текст)) //если символ в нижнем регистре, то костюм останется на «нуль»
  если <(костюм #) = (1)> , то //если спрайт не сменил костюм из-за того, что символ в нижнем регистре
    изменить костюм на (объединить (буква (буква) в (текст)) [т]) // все костюмы в нижнем регистре заканчиваются на «т»
  end
  если <(костюм #) = (1)> , то // если спрайт до сих пор не сменил костюм
    . . . // есть пробел, символ без костюма или костюм с неправильным именем
    . . . // предположим, что это пробел
  иначе 
    печать
  end 
  изменить x на (элемент (костюм [номер v]) в [ширины букв v])
  изменить [буква v] на (1)

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

Для добавления элемента в консоли просто используйте блок добавить [] к [консоль v] и блок перезагрузить экран::custom для обновления консоли.

Информация.png Приведенный выше скрипт нуждается в постоянном обновлении. Можно также сделать скрипт, который обнаруживает изменения в списке «консоль», а затем обновляет экран.

См. также

Cookie-файлы помогают нам предоставлять наши услуги. Используя наши сервисы, вы соглашаетесь с использованием cookie-файлов.