DroidScript
DroidScript
скрипим понемногу

Односпрайтовый проект с разными клонами

27.04.2024

Опять что-то непонятное. То списки вместо переменных, то проекты без скриптов на сцене, то какой-то односпрайтовый проект. А нельзя что-то более привычное? Можно, но мы договорились смотреть на Scratch 3 глазами программиста.

Зачем что-то выдумывать, если всё уже придумали разработчики? Вот сцена, вот спрайты, вот переменные. Берите и пользуйтесь. Отвечаю: потому что сделано неудобно по сравнению с тем, как сделано у других.

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

Представьте такую ситуацию. Есть системный блок, на корпусе которого находится только кнопка включения, а крышка закрыта на замок. Это удобно? Да, для тех, кто видит компьютер в первый раз и кому не требуется улучшать в нем. Этот пользователь нажимает на кнопку и системный блок включается.

Как такой системный блок воспримут опытные пользователи? Да проще вообще на него не обращать внимания и посмотреть те корпуса, которые удобны для использования, у которых есть необходимые разъемы на передней и задней панели и свободный доступ внутрь корпуса.

После некоторой работы в Scratch 3 я заметил один раздражающий момент - постоянное выполнение ненужного мне действия. Предположим, идёт работа с блоками в спрайте кота и нужно подвинуть бабочку на сцене. Подвинул бабочку, а после этого открылся экран редактора блоков для бабочки. Приходится переключаться обратно на экран кота. А разработчики Scratch считают, что так понятнее и удобнее. Как быть? Здесь может быть несколько решений:

  1. Вздохнуть и смириться с тем, как это работает
  2. Попробовать найти нестандартное решение для более удобной работы
  3. Перейти на другую среду разработки, в которой сделано привычнее и удобнее
  4. Создать свою среду разработки, в которой сделать так, как считаешь для себя удобным

Выбираем второй вариант и смотрим, что из этого получится.

На одном из занятий мы создали блоки для работы с данными в формате 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.

О, забыл после удаления клона удалять его имя из списка клонов. Думаю, вам не сложно будет добавить блоки для этого.

© 2016-2024 
actech