Опять что-то непонятное. То списки вместо переменных, то проекты без скриптов на сцене, то какой-то односпрайтовый проект. А нельзя что-то более привычное? Можно, но мы договорились смотреть на Scratch 3 глазами программиста.
Зачем что-то выдумывать, если всё уже придумали разработчики? Вот сцена, вот спрайты, вот переменные. Берите и пользуйтесь. Отвечаю: потому что сделано неудобно по сравнению с тем, как сделано у других.
Пользователи пользуется тем, что им предлагают, а программисты - тем, что удобно и целесообразно использовать для выполнения той или иной задачи.
Представьте такую ситуацию. Есть системный блок, на корпусе которого находится только кнопка включения, а крышка закрыта на замок. Это удобно? Да, для тех, кто видит компьютер в первый раз и кому не требуется улучшать в нем. Этот пользователь нажимает на кнопку и системный блок включается.
Как такой системный блок воспримут опытные пользователи? Да проще вообще на него не обращать внимания и посмотреть те корпуса, которые удобны для использования, у которых есть необходимые разъемы на передней и задней панели и свободный доступ внутрь корпуса.
После некоторой работы в Scratch 3 я заметил один раздражающий момент - постоянное выполнение ненужного мне действия. Предположим, идёт работа с блоками в спрайте кота и нужно подвинуть бабочку на сцене. Подвинул бабочку, а после этого открылся экран редактора блоков для бабочки. Приходится переключаться обратно на экран кота. А разработчики Scratch считают, что так понятнее и удобнее. Как быть? Здесь может быть несколько решений:
Выбираем второй вариант и смотрим, что из этого получится.
На одном из занятий мы создали блоки для работы с данными в формате CSV. Это нам очень пригодится.
Выберем такой формат данных:
Cat.x -180 Cat.y 0 Cat.S 100 Cat.V 1; Fox.x 120 Fox.y 120 Fox.S 80 Fox.V 1; Panthera.x -180 Panthera.y 100 Panthera.S 75 Panthera.V 1; Button.x 0 Button.y -50 Button.S 100 Button.V 1; ,где S - size (размер), V - visible (видимость, 1 - виден, в остальных случаях скрыт)
Английский язык для названия клонов используется для исключения необходимости постоянно менять язык ввода. Если назвать клоны Кот, Лиса и Пантера, то для их ввода нужно будет использовать русский язык, а для ввода той же точки - английский. Такое постоянное переключения приводит к появлению большого количества ошибок.
Можно вместо точки использовать символ подчеркивания и всё вводить в русской раскладке. Но это непривычно, так как в текстовом программировании свойства разделяются точкой. Scrtach - эта не та платформа, из-за которой стоит изменять общепринятые моменты.
Данные выше мы скопировали в комментарий переменной _data. После вставки этих данных в блок _data они вытянутся в одну строку, которую нужно разбить на элементы списка _dataList по разделителю строк ;
После этого можно будет получить список имен клонов. Для этого в цикле по списку _dataList получаем каждый элемент, а затем по ещё одному внутреннему циклу собираем по буквам строку с именем клона, пока не встретится символ точки. После этого записывам строку в список _cloneList:
Cat Fox Panthera Button
Для выполнения действий над клонами можно использовать обмен сообщениями или использовать "слушателя" изменений в строке данных. Первый способ всем известен. Рассмотрим второй.
Суть его состоит в том, что в бесконечном цикле постоянно считываются свойства клонов из переменной _data, полученные значения которых затем используем в блоках движения и вида. Например, после обращения к свойству Имя клона.x получаем координату X и перемещаем клон в неё.
В проекте также реализована дополнительная функциональность - удаление клона после нажатия на кнопку Удалить и ответа на запрос имени и запрос на изменение значений свойств спрайтов при нажатии на пробел.
С удалением клонов всё просто - нужно проверить введенную строку и удалить клон, если строка совпадает с именем одного из клонов.
Изменение параметров происходит сложнее. Они вводятся в таком формате:
Имя клона.параметр=значение Cat.x=100 Fox.S=50
Знак равенства (=) выступает в качестве разделителя полей и алгоритм понятен. Нужно полученную строку разбить на два элемента списка, первый из которых будет именем свойства, которое нужно изменить, а второе - его новое значение.
И здесь возникает очередная запинка от Scratch из-за отсутствия настоящих локальных переменных, существующих только в пределах функции (подпрограммы). Это приводит к тому, что один и тот же блок локальной переменной будет перезаписываться, если он используется в нескольких одновременно работающих подпрограммах. Например, было бы удобно для счетчика цикла использовать только блок _i. Но это невозможно, так как у нас постоянно работает слушатель, где изменяется значение этого блока. Значит, нужно создавать новые блоки и думать, какие блоки можно использовать повторно, а какие нельзя.
"Так не надо было так нестандартно решать задачу", - скажет кто-то. Локальные переменные в Scratch локальны в пределах класса объектов, а для обмена пользуйтесь сообщениями. Хорошо, но тогда возникает вопрос, а задачи нужно решать так, как предлагают это делать разработчики или программист сам решает как по его мнению её нужно решать? Scratch 3 - это учебная платформа. Да, но, как мы уже убедились, с очень большими ограничениями, что вы и сами прекрасно знаете.
Если списки загружать из файлов, то в этом случае проект упрощается в 2 раза
Рис. 1. Упрощенный проект с импортированными списками
Неплохо? Не совсем. Если бы в нашем распоряжении были все необходимые блоки, количество блоков в этом упрощенном варианте уменьшилось ещё раза в 3-4.
О, забыл после удаления клона удалять его имя из списка клонов. Думаю, вам не сложно будет добавить блоки для этого.