Расширение мира в Scratch

В среде программирования Scratch область действий ограничена сценой. Сцена дает возможность смотреть на мир в рамках по х от -240 до 240. А по у от -180 до 180. Но что делать, когда этого пространства недостаточно? Как снять это ограничение?  


a9a0d4e8206549ffa6464bd9f5f44812.png

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

Давайте изучим возможности нашего языка программирования. Для постановки нашего спрайта в точку 1000;1000 нам необходимо использовать команду »перейти в х: 1000 у: 1000». давайте попробуем. Запускаем команду (нажав один раз на нее) и получаем следующий результат. 


590c1ce9e9304e6ea4dd970f51a0f243.png

Котик может встать в точку х=271 и у=215. Куда бы мы не ставили наш спрайт, он не может убежать дальше сцены. Ничего себе ограничение! Что делать?  

Сейчас мы воспользуемся интересным приемом. Мир, который попадает в область сцены мы назовем физическим миром. Он реален, и мы его полностью видим. Все, что должно происходить в игре происходит в поле зрения и за краем сцены больше ничего нет. Все спрайты здесь и сейчас. За границами ничего не существует. 


Физический мир - мир ограниченный сценой Scratch


Физический мир - все объекты на сцене Scratch

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

Как нам представить этот мир? Виртуальный мир представляется как большой лист бумаги. А сцена — это окно в виртуальный мир. 


Расширенный мир в Scratch

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

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


Создаем приватные переменные и используем их для позиционирования нашего объекта

Теперь нам необходимо понять, как наш герой будет перемещаться по виртуальному миру. Мы не можем двигать сцену, значит должен двигаться весь виртуальный мир.


В виртуальном мире двигается мир, а не объект

Если вы понаблюдаете, то увидите, когда герой движется влево, виртуальный мир двигается вправо. Другими словами, при нажатии стрелки влево, мир двигается ему навстречу, вправо. Спрайт движется в одну сторону, мир — в обратную. И таким образом, получается такое движение, при котором спрайт вообще не движется, и все управление с клавиатуры находится во вспомогательных объектах. 


Движение виртуального мира вокруг героя

Внимание: во всех деревьях одинаковый код.

Заметьте, при каждом запуске игры все деревья будут менять свое месторасположение на поле по х (-450;450) и у (-450;450). Получается карта мира — квадрат. По идее, герой должен перемещаться внутри данного мира.

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


Отслеживание виртуального местоположения главного героя

Заметьте оператор «и». Это интересная логическая операция. Если вы прочтете фразу «если клавиша стрелка вверх нажата и у героя меньше 450, то мы изменяем переменную у героя на 10». Изменение переменной героя произойдет лишь в том случае, когда оба условия выполняться, другими словами это произойдет, когда стрелка вверх нажата и координата у героя меньше 450. Выполниться и то, и то. 

Осталось доработать код для виртуального мира. Используем оператор «и» и сравнение. Будьте внимательны, когда будете работать над этим скриптом, ведь мир движется влево, пока герой движется вправо. 

Кстати, пока писал код, нашел ошибку в Scratch, чтобы она у вас не повторилась, пожалуйста, вытаскивайте новые операторы из области команд, не меняйте операторы сравнения при помощи правой кнопкой мыши.

Скрипт для объектов.


Код для ограничения движения виртуального мира в зависимости от положения героя

Вот и все. Все остальное придумайте сами. Например, сделайте игру «дед мороз в поисках елочки». Деду морозу нужно быстро собрать все елочки, чтобы у каждого ребенка дома стояло новогоднее дерево. 

→ Ссылка на проект.

Информация для родителей. В этом месяце наш клуб открывает новые курсы по компьютерной грамотности и программированию для детей 7–8 и 9–12 лет. На них мы будет изучать не только программирование, но и то, как правильно использовать компьютер. Вместе с детьми мы создадим множество проектов, которые затрагивают не только программирование, но и физику, математику, астрономию. Уникальная программа, насыщенная увлекательными проектами, ждет вашего ребенка на занятиях. Наш клуб и занятия.

Кстати, в нашем клубе ребенок может погрузиться в мир робототехники и изобретательства. Кстати, для 5–6 лет у нас тоже есть кружки. До встречи на занятиях.

© Geektimes