Algodoo скрипты: Список всех команд/переменных — Скриптинг — Algodoo — Каталог статей — Algodoo || Крупнейший и мертвейший фан

Уроки Phun (Algodoo). Создание скриптов в Phun и Algodoo

Все скрипты записываются в скриптовом меню объекта. Оно находится в контекстном меню объекта «Script Menu».

В поле OnCollide уже находится запись (e)=>{}. Эта запись, по моему мнению, означает, что при столкновении (переменная E) выполнится (=> этот знак) то, что находится в фигурных скобках. В эти скобки-то мы и записываем наш скрипт.

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

Тогда нам нужно 2 объекта, которые будут взаимодействовать. Один из них мы и «заскриптуем».

Наш скрипт выглядит так:

OnCollide = (e)=>{scene.addcircle{pos := e.pos; radius := 0.25; color := [1,1,1,1]; collideset := 1}}

Теперь давайте разберёмся подробно: Scene – означает место, в котором что — либо создастся. Точка после отделяет команду Add, которая значит «добавить». Добавляем мы круг –

Circle. Дальше открываем ещё одни фигурные скобочки, в которые мы запишем параметры добавляемого объекта. А именно Pos – это позиция (она имеет вид, например [1,1], тоесть 1 по оси X и 1 по Y), в нашем случае Epos означает «позиция столкновения». Далее идёт знак «точка с запятой», он необходим, чтобы программа поняла, что дальше идёт другой параметр. Параметр Radius – это расстояние от центра круга до его края в метрах. Параметр Color – это цвет. Параметр CollideSet это набор столкновений, в нашем случае равный «А».

Внимательно следите за ошибками, любая лишняя, или недостающая буква, отсутствующие знаки приводят к ошибке скрипта вцелом!

Теперь давайте разберёмся с формулами.

Всем известно, что компьютер это – ЭВМ. Это значит, что он может вести расчёты. Вы можете не вычислять самостоятельно значения для параметров.

Самым простым примером будет сложение, вычитание, умножение или деление.

Итак, скрипт:

OnCollide (e)=>{e.other.density := e.other.density + e.other.density}

Означает, что при каждом столкновении заскриптованого объекта с простым у простого будет добавляться его собственное значение плотности. Допустим, это значение было равно 2, после 1 столкновения оно будет равно 2+2=4. После 2 столкновений – 4 + 4= 8. После 3 столкновений – 8+8 = 16. Этот принцип применим и к намного более сложным вычислениям.

Теперь давайте разберёмся ещё более подробно к ключевым словам, которые Phun и Algodoo понимают.

Other – Буквально означает: «Не этот, а другой». Заскриптованый объект влияет на другой объект, с которым столкнулся.

This — Буквально означает: «этот, а не другой». Заскриптованый объект влияет на себя и не влияет на объект, с которым столкнулся.

Geom – Применимо к лазерам, означает, что лазер влияет на объект, и не влияет на себя.

Laser – Применимо к лазерам, означает, что лазер влияет на себя, и не влияет на объект.

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

Объясняю: такой случай, например, когда нам надо вывести информацию о далёком объекте на Прямоугольник с текстом. Например, количество патронов, скорость, или любую другую.

Для этого нам потребуется ввести свою переменную, которая будет нести нужную информацию.

Нажимаем клавишу «тильда» (Буква «Ё» на русской раскладке, под эскейпом). Вылезло меню, это командная строка. Там вписываем нашу переменную –

Scene.my.X := 350. Где X – любой знак, цифра, или набор знаков; А число 350 – будет количеством патронов.

Итак, наша система будет получать данные о количестве патронов. Пусть 1 выстрел тратит 2 патрона. Выглядит так –
…Scene.my.Patron := Scene. my.Patron – 2…

Теперь нам надо вывести информацию, об оставшихся патронах. Обычно используют лазеры, но разница только в скорости обновления информации.

Создаём прямоугольник, делаем его чёрным, вписываем любой текст. Подгоняем текст по размеру, для удобства. К прямоугольнику, вернее рядом с ним, привинчиваем осью с мотором, какой-нибудь объект, так чтобы он бесконечно ударял в прямоугольник (желательно с большой скоростью).

В объект садим скрипт:

OnCollide = (e)=>{e.other.text := {“” + scene.my.Patron} }

Получаем в прямоугольнике в скриптовом меню, в окне

Text следующее

-{“” + scene.my.Patron}

Означает к пустому тексту добавить значение нашей переменной. И вот наш прямоугольник показывает текущее значение этой переменной.

ВАЖНОЕ ПРИМЕЧАНИЕ! Если вы сохраните не всю сцену, а только те объекты, которые у вас получились, то переменная потеряется! Её необходимо снова вписать в консоль, и только потом добавлять ваши обьекты.

Algodoo — бесплатная виртуальная лаборатория!

Algodoo — бесплатная виртуальная лаборатория!
mntc wrote in wikischool_ru
May 12th, 2013

Оригинал взят у mntc в Algodoo — бесплатная виртуальная лаборатория!

На одном из сайтов написано так: скачайте эту полезную и развивающую программу для детей. Но предупреждаем — она затягивает и вы сами будете в нее долго играть. Так и вышло.

Речь идет о Algodoo — бесплатной программе, где можно нарисовать всякие механизмы и системы, а потом включить моделирование — и они придут во взаимодействие в соответствии с законами физики в реальном времени. Программа двухмерная (но со многими слоями), зато весьма быстрая и имеет интерфейс типа Paint, позволяющий рисовать и перемещать фигуры без особых затруднений.

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

Нажимаем кнопочку «Start simulation», и…. все приходит в движение!

Вода течет, проволока слева сминается под собственным весом, гири и пружины ведут себя как гири и пружины, луч искривляется, кукла падает. Вот снимок еще через несколько секунд:

В движении все это выглядит куда более динамично и интересно. Я бы снял видео, но при этом программа на моем несовременном компьютере притормаживает, и получается не красиво, лучше все это вы увидите сами установив Algodoo.

При всей видимой простоте, физика моделируется на очень хорошем уровне. Возьмем, например деревянный и стальной шары (можно присваивать объектам материалы) и уроним их в емкости с водой (о да, там довольно реалистично моделируется вода в больших количествах!).

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

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

Все это позволяет быстро создавать и моделировать различные механизмы, например работающие часы:

На объект можно добавить трассер — элемент, оставляющий за собой след для отслеживания траектории, а также выводить графики, цифровые значения, векторные стрелки и т.п. Это позволяет проверять многие изобретательские идеи «на лету».  Я, например, сразу же воспользовался трассером для проверки своей идеи про фрактальные опоры качения — способ соединения многих подшипников, позволяющий сгладить неровности направляющей самодельного станка с ЧПУ. Трассер показал, что башня, установленная на каретке движется по гораздо более плавной кривой, чем та, что описывает форму местности:

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

Вот ссылка на файл сцены этого планетохода, расположенный в Algobox — огромном онлайн-хранилище десятков тысяч созданных пользователями сцен и конструкций. Чего там только не напридумывали! Вот, например, трехногий и четырехногий шагающие роботы, преодолевающие разные препятствия.

А вот пневматическая винтовка, способная стрелять как в одиночном, так и автоматическом режиме в зависимости от положения переключателя (файл):

А вот футуристическая чудо-пушка, которая не только автоматически выбрасывает гильзы и подает патроны, но и сама меняет обоймы по мере необходимости (файл):

Много там моделей разных двигателей, насосов, механизмов, передач, автоматических линий и т.

п.:

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

Давайте удалим овальную линзу посередине — тут же получим результат:

А что если изменить цвет лазерного луча? Часть спектра исчезнет:

Теперь увеличим показатель преломления материала призмы — получим интересный эффект многократного внутреннего отражения (можно двигать курсором регулятор показателя преломления и наблюдать как меняется картина):

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

А еще лазеры могут резать объекты. Жили-были шестеренки:

После лазерной резки нижние половинки отпали, а верхние провернулись в положение с наименьшей потенциальной энергией:

Кто-то моделирует там походку животных, кто-то — полеты самолетов, а кто-то нарисовал детали конструктора Лего:

В программе есть простой скриптовый язык программирования Thyme, позволяющим создавать разные хитрые объекты, явления и физические эффекты, а потом пользоваться ими в моделях (cм. русскоязычное введение в Thyme). Например, на следующей картинке слева представлен набор созданных кем-то при помощи скриптов футуристических видов оружия, выстрелом одного из которых , обозначенного автором как «Тяжелая протонная пушка» разрушается башня справа. Быстро летящий светлый комочек перед одним из блоков башни и есть, по-видимому сгусток протонов.

Скрипты помогают добавить разные функции — логику, плавление объектов лазером, или например… химию:

Данная сцена позволяет работать с 11 веществами состоящими из разноцветных крупинок. При соприкосновении крупинки определенного цвета соединяются в крупинки другого цвета, в общем, реагируют. Может выделиться газ — крупинки легче воздуха, которые всплывают вверх.

Есть в Algodoo и совсем уже волшебные функции. Например, перетащим в рабочее поле программы из броузера картинку… ну например, рыбы. Появится объект с формой и текстурой рыбы (фон рисунка удалился автоматически):

Мы может теперь работать с ее физическими свойствами. Сделаем ее потяжелее, помягче, и включим симуляцию. Рыба не просто упала, но обмякла, как и подобает рыбе:

Ее можно в реальном времени поднять за хвост, подбросить и т.п. Обратите внимание при этом на деформацию:

В общем, рыба теперь стала частью сцены, и взаимодействует со всеми ее объектами:

Так можно с очень малыми трудозатратами создавать игры, мультфильмы, учебные пособия и многое другое. Особенно хороша по-моему, эта программа для практических заданий по ТРИЗ, например приемам устранения технических противоречий.

Представьте себе, что есть луна на высоте нескольких километров, и надо с нее забрать образец грунта и доставить на космодром. Мне лично удалось решить эту задачу далеко не сразу:

Пружинные подвески кабины и ее мягкая обивка, а также пружинные лапки ракеты появились в результате крайне негативного воздействия неаккуратных посадок и перегрузок на космонавта. Четыре двигателя обеспечили с трудом стабилизацию ракеты в пространстве. Система забора грунта тоже причинила немало хлопот — в общем инженерный процесс налицо. На следующей картинке ракета все-таки берет образец грунта, но с кабиной и космонавтом после соударения об Луну явно не все в порядке:

На официальном сайте можно бесплатно скачать программу для Windows, Mac и iPad.

Версия для Linux называется Phun и может быть скачана например тут.

Кстати, Algodoo стала бесплатной всего пару недель назад, а до этого стоила, говорят, недешево.

В общем, полагаю, много-много-много потраченных за компьютером часов вам гарантированы 🙂

Ссылки на ресурсы:


  • Официальный сайт: http://algodoo.com

  • Русскоязычный любительский сайт: http://algophun.3dn.ru/

  • Сообщество в ЖЖ: algodoo

  • Группа в контакте: http://vk.com/algodoo

Tags: it, ТРИЗ, анимированные модели, домашнее обучение, занимательная наука, компьютер, науч-поп, образование, обучалки, опыты, перепост, развлечения, симуляторы, физика, эксперимент

Тимьян | Алгоду Вики | Fandom

Thyme — собственный язык программирования, используемый в Algodoo. Доступ к нему можно получить с помощью консоли, нажав клавишу тильды (~) в Windows или Mac. К нему также можно получить доступ в меню «Сценарий» объекта, чтобы изменить код объекта.

Содержание

  • 1 Работа с тимьяном
    • 1.1 Использовать пользовательские переменные
    • 1.2 Типы переменных
    • 1.3 Онколлайд
    • 1.4 Изменение свойств других объектов
    • 1.5 Если-блоки
      • 1.5.1 Создание пользовательских событий
    • 1.6 Меняем мир с тимьяном
    • 1.7 Список полезных переменных и выражений Thyme
    • 1,8 Конденсаторы
    • 1.9 Скрипты для начинающих
    • 1.10 Внешние ссылки:

Thyme — собственный язык программирования в Algodoo. Он может изменять значения объектов при наступлении определенных событий. Поддерживаемые события:

  • onClick — срабатывает при нажатии на объект.
  • onCollide — срабатывает, когда этот объект сталкивается с другим.
  • onDie — срабатывает при удалении объекта.
  • onHitByLaser — срабатывает, если в объект попадает лазерный луч.
  • onLaserHit — срабатывает, когда луч лазера попадает на объект.
  • onSpawn — срабатывает каждый раз, когда объект загружается в Algodoo.
  • onKey — срабатывает каждый раз, когда используется клавиша. Без дальнейших сценариев это сработает независимо от того, какая это была клавиша.
  • postStep — срабатывает во время выполнения имитации в соответствии с уровнем HZ имитации.
  • Обновление
  • — аналогично postStep, но срабатывает каждый раз, даже когда симуляция не запущена.

Использование Thyme для каких-либо осмысленных действий требует простого синтаксиса, основанного на манипулировании переменными:

 переменная = значение
 

Переменная может быть либо глобальной переменной, которая имеет свойства для всей сцены (записывается как scene.my.nameHere), либо переменной локального объекта, хранящейся внутри объекта (записывается как _nameHere).

Примечание: Неправильная запись переменных приведет к тому, что переменная будет временной, а не постоянной. Правильное написание переменных гарантирует, что ваши сцены Algodoo с использованием Thyme будут работать.

Любая назначенная переменная scene.my (пример: scene.my.theNumber) будет сохранена в сцене. Загрузка сцены загрузит любую назначенную глобальную переменную с ее последним значением.

Использование переменной свойств текущей сцены требует, чтобы пользователь знал имя переменной. Например, scene.camera.pan — это имя переменной, в которой хранится положение камеры. Полный список переменных свойств можно найти здесь.

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

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

 e.this.pos = e.pos;
 

эл. — Ссылаясь на данные, которые были собраны в начале события

это. — ссылка на этот объект

pos — с помощью переменной pos, отвечающей за положение объекта

= e.pos; — присвоение переменной позиции, в которой произошло событие, и завершение команды символом ;

Примечание: После каждой командной строки необходимо добавить двоеточие, чтобы отметить конец командной строки, если нет закрывающей скобки. Для визуального форсирования новой строки в окне скрипта необходимо нажать Shift+Return или Control+Return. Только return заставляет применить текущие изменения, в конечном итоге сбрасывая их при наличии ошибок.

Использовать пользовательские переменные

Пользователь может использовать пользовательские переменные, которые могут быть постоянными или временными.

 _foo = 45;
 

Создает новую переменную с именем «_foo», если она еще не создана, и присваивает ей номер 45.

Все постоянные пользовательские переменные нуждаются в подчеркивании (или символе «_») в начале имени переменной, чтобы указать, что она должна быть сохранена как часть объекта.

 бар = e.other.geomid;
 

Создает переменную с именем «bar», которая существует до тех пор, пока не закончится текущая область, и присваивает ей идентификатор геометрии «другого» объекта (доступного в onCollide).

Временные переменные создаются без какой-либо спецификации объекта и только в пределах текущей области . Область видимости — это код внутри скобок, в котором находится переменная. Все, что находится за пределами скобок, содержащих переменную, недоступно.

Примечание. Запись := вместо = гарантирует, что переменная создается вместо записи в переменную в большей области. Это обычно используется при использовании команд addObject, чтобы предотвратить редактирование как атрибутов вновь созданной формы, так и объекта, выполняющего объект (т. е. также случайную установку позиции исполняемого объекта).

Типы переменных

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

Целое число — Число без десятичных цифр:

 _hs = 64;
 

Плавающая — число, содержащее десятичные цифры:

 мат.пи = 3,14;
 

Строка — Цепочка символов, обычно в виде текста. Назначается с помощью «»:

 scene.my.wikia = "Algodoo Wiki";
 

Boolean — переменная, которая может принимать только состояния True и False:

 _visible = истина;
 


Существуют более сложные переменные, часто содержащие взамен базовые переменные:

Массив — переменная, содержащая несколько значений любого типа в виде списка. Назначается с помощью квадратных скобок, каждое значение отделяется запятой. Значения, содержащиеся внутри массива, не обязательно должны относиться к одному и тому же типу переменных:

 _data = [1, 3.3, "Ошибок не зафиксировано", [5.5, 2]];
 

Code — хранит исполняемый код тимьяна. Код выполняется путем помещения переменной в код. Он также может возвращать значений :

 _code = {e.this.text = "Привет, мир"};
 

Функция — аналогична Code, за исключением того, что код Thyme является исполняемым. Он также может принимать и возвращать переменные. Функция сохраняется в виде:

(пар1, пар2,…)=>{код здесь}

 _function = (f, g)=>{f + g};
 

Код называется:

переменная(пар1, пар2,…):

 e.other.pos = [0, _function(2, 3)];
 

Функции и обычные коды возвращают значение, которое использовалось в последней строке. В этом примере результатом f + g будет последнее используемое значение.

Это также показывает, что перечисленные выше события являются просто особым типом функции, использующей параметр e, который содержит всю информацию о событии в форме класса.

Классы — единственный тип переменных, который не может быть создан пользователем. Они действуют как массивы, с той разницей, что их содержимое также является именованными переменными. Доступ к их содержимому можно получить с помощью синтаксиса: var.content. Хотя невозможно создать классы переменных, так как Thyme не выполняет автоматическое приведение к этому типу, он можно редактировать и даже создавать новые переменные в существующем классе. Единственные переменные типа класса, доступные пользователю, — это значение данных события «e». Большая часть глобальной организации переменных Algodoo (scene.my, app.camera и т. д.) и переменных, относящихся к объектам. Например: при копировании объекта в текстовое поле или использовании entityByGeomId().

Отображение электронного значения события onClick в виде текста:

 ClassObject с детьми:
количество кликов = 1;
обработано = ложь;
поз = [-1,6925424, 0,32110548];
это -> {
    множитель инерции = 1,0;
    ресурсы = [];
    времяжизни = ∞;
    textureClamped = [ложь, ложь];
    ...
 

Это также показывает, почему мы используем e.this…, e.other…, e.pos и т. д. При использовании переменной события. «Эта», «Другая» и часто другие переменные на самом деле являются переменными, хранящимися в переменной типа класса e, и мы получаем к ним доступ таким образом.

OnCollide

Изменение свойств других объектов

Определение свойств объекта, который подвергается удару, часто не подходит для текущей работы. Во-первых, вы должны знать, что плотность = 10 также может быть записана как: e.this.density = 10, так как это более точное название для этого свойства, но если вы хотите изменить плотность объекта, который попадает под этот объект вы можете использовать этот фрагмент кода:

  (е)=>{е.другая.плотность = 10} 
 

Это изменит плотность объекта, в который попали, до 10.

Блоки if

Оператор if — это задача, которую можно использовать для выбора между двумя разными значениями в зависимости от логического значения. Чаще всего используется для переключения между процедурами кода. Синтаксис:

 логическое значение ? значение1 : значение2;
 

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

При выполнении оператора If определяется значение логического значения и, в зависимости от результата, компилируется либо первое значение, либо второе. Обычно указанные значения являются кодовыми значениями (записанными в {}), но возможны и другие значения, если они могут быть скомпилированы в текущем выражении. Логическое значение обычно создается с помощью логических операторов и сравнений, которые создают логическое значение путем сравнения нескольких значений друг с другом и последующего объединения результатов. Существующие операторы сравнения:

  • == — Сравнивает оба значения, чтобы увидеть, равно ли первое значение второму значению. Это не ограничивается целыми числами или числами с плавающей запятой. Примечание: Это отличается от =, который присваивает значение вместо сравнения значений.
  • >= — сравнивает оба значения, чтобы определить, больше ли первое значение или равно второму значению.
  • <= — сравнивает оба значения, чтобы определить, меньше или равно ли первое значение второму значению.
  • != — сравнивает оба значения, чтобы определить, не равно ли первое значение второму значению. Это не ограничивается целыми числами или числами с плавающей запятой.
  • > — сравнивает оба значения, чтобы определить, больше ли первое значение, чем второе значение.
  • < — сравнивает оба значения, чтобы определить, меньше ли первое значение, чем второе.

Кроме того, логические значения можно комбинировать с помощью логических операторов аналогично операторам вычисления.

Существующие операторы:

valueA && valueB && valueC… — истинно, если оба значения истинны, и ложно, если нет, также известное как оператор AND

значениеА || значениеB || valueC… — Истинно, если истинно хотя бы одно значение, также известное как оператор ИЛИ

! valueA — инвертирует значение, также известное как NOT-оператор

Примеры IF-блоков:

 sim. running && e.this.vel(0) < 4 ? {код1} : {}
 

Этот скрипт проверяет sim.running, переменную, созданную в Algodoo, которая хранится как логическое значение. sim.running объединяется с помощью И (&&), что заставляет скрипт также сравнивать x-скорость объекта и спрашивает, движется ли объект по оси x на 4 метра в секунду или медленнее. Если оба верны, , то код 1 выполняется, иначе ничего не происходит.

 _hp <= 0 || _умереть ? {код1} : {код2}
 

сначала скрипт проверяет, равно ли _hp 0 или меньше, а затем проверяет, истинно ли _die. Если любой из них верен, он выполнит code1, иначе code2

 позиция = позиция (0) > 0 ? [-2, 0] : [2, 0]
 

Присваивает pos [-2,0] или [2,0] в зависимости от того, больше или меньше значение x 0.

Создание пользовательских событий

Поскольку события Algodoo являются базовыми функциями, встроенными в исходный код программы, можно создавать свои собственные события, встроенные в уже существующие события, предоставляемые Algodoo. Обычно это используется для запуска кода при соблюдении определенных условий при сохранении организованной структуры всего алгоритма. Следующие строки демонстрируют использование пользовательского события onDamage, которое можно использовать для геометрии, выступающей в роли игровых объектов:

 _onDamage = (е)=>{
    _hp = _hp - e.dmg;
    e.other._score = e.other._score + e.dmg;
    _hp <= 0 ? {
        время жизни = 0
    } : {}
}
 
 (е) => {
    e.other.materialname == "bullet" ? {
        // Обратите внимание на :=, чтобы принудительно создать новое значение "dmg" в e
        e.dmg := e.other._dmg;
        _onDamage (е)
    } : {}
}
 

Как видно, событие _onDamage используется для расширения onCollide без необходимости помещения кода в то же событие. Это помогает поддерживать порядок в коде и в некоторых случаях может облегчить доступ к таким функциям. Не обязательно использовать события для каждого действия, на самом деле часто проще просто использовать корневое событие вместо того, чтобы создавать новые для каждой задачи. Однако основные процессы в коде должны быть разделены, чтобы их можно было легко найти и получить к ним доступ.

Изменение мира с помощью тимьяна

Вы можете изменить всю сцену с помощью тимьяна.

Например, вы можете сделать так, чтобы сцена работала постоянно, поместив это в update:

 (е) => {sim.running = true}
 

Это приводит к тому, что сцена никогда не останавливается. Вы можете использовать это для различных приложений. Вы также можете заставить сцену удалить себя, если указанный объект будет удален, поместив в OnDie следующее:

 (е) => {scene.new}
 

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

Список полезных переменных и выражений Thyme

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

  • app.camera.* - Здесь перечислены все переменные, влияющие на камеру
  • sim. gravity* — все переменные, влияющие на гравитацию, перечислены в разделе sim с префиксом гравитации
  • .
  • вращение = math.atan2(e.other.pos(1)-pos(1),e.other.pos(0)-pos(0)) - Определяет угол между двумя объектами в системе координат и поворачивает первый объект соответственно.
  • vel = vel + [0,sim.gravityforce]/sim.frequency + [math.sin(*Угол здесь),-math.cos(*Угол здесь)]*sim.gravityforce/sim.частота - Нейтрализует эффект стандартной гравитации сцены с первой частью и применяет новую гравитацию в указанном вами угле к объекту, используя вторую часть. Опустите 2-ю часть, чтобы достичь невесомости.
  • rand.uniform01 — Создать случайное целое число с плавающей запятой от 0 до 1 со случайной длиной
  • rand.normal — то же, что и rand.uniform01, но с вероятностью 50% инвертирует вывод, что удваивает количество возможных результатов при использовании отрицательных целых чисел.

Конденсаторы

Конденсатор — это устройство, которое удерживает небольшой заряд и быстро его отдает. Их можно использовать в реальном мире для преобразования переменного тока в постоянный, повышения напряжения путем преобразования постоянного тока в переменный и т. д.

Они еще более полезны в Algodoo, так как конденсаторы могут питать лампочки, батареи, схемы защиты и многое другое. Их довольно легко сделать. Поместите это в свой код, чтобы создать базовый конденсатор. Установите _charge на 0 и установите _action1 и _action2 на нужный код.

постШаг:

 (д)=>{_заряд = _заряд = 1;
заряд > 0 ? {_action1(e)} : {_action2(e)}}
 

onHitByLaser:

 (е) => {_charge = 3}
 

Скриптовое меню светящейся части светодиода понемногу.

Скрипты для начинающих

Создатель кругов

 (д)=>{
    Сцена.addCircle{
        onclick = (e)=>{};
        oncollide = (e)=>{};
        ondie = (е) => {};
        onhitbylaser = (e)=>{};
        ключ = ключ;
        onspawn = (e)=>{};
        множитель инерции = множитель инерции;
        ресурсы = ресурсы;
        срок жизни = срок жизни;
        зажатая текстура = зажатая текстура;
        адгезия = адгезия;
        тип аттракциона = тип аттракциона;
        притяжение = притяжение;
        текстура = текстура;
        обновление = обновление;
        вель = вель;
        реституция = реституция;
        скорость материала = скорость материала;
        showforcearrows = показатьфорсстрелры;
        показатель преломления = показатель преломления;
        матрица текстуры = матрица текстуры;
        транспортир = транспортир;
        столкновение = столкновение;
        ничья = ничья;
        отражательная способность = отражательная способность;
        трение = трение;
        имя материала = имя материала;
        позиция = позиция;
        плотность = плотность;
        цветшва = цветшва;
        угол = 0;
        постшаг = постшаг;
        размытие края = размытие края;
        угол = угол
    }
}
 


Спаунер ящиков

  (e)=>{scene. addBox({size := [0,83575642, 0,27858579]; плотность := 2,00; pos := e.pos; восстановление := 0,5; трение = 0,5; угол := 0}) } 
 

Самостолкновение

  (д) => {heteroCollide = ложь} 
 

Сталкивающаяся вода

  (е) => {collideWater = true} 
 

Изменение Столкновение с другими объектами или самим собой

  (e)=>{e.this.collideSet = 1} или (e)=>{e.other.collideSet = 1} 
 

Изменить цвет фигуры [R, G, B, A]: R = красный, G = зеленый, B = синий, A = атрибут видимости: диапазон значений = от 0,0 до 1,0

  (д) => {цвет = [1,0, 0,0, 0,0, 1,0]} 
 

Цвет текста [R,G,B,A]

  (е) => {textColor = [1.0, 0.0, 0.0, 1.0]} 
 

Размер текста

  (е) => {textScale = 3} 
 

Плотность

  (д) => {плотность = 10,02} 
 

Аттракцион

  (д) => {притяжение = 50} 
 

Для отталкивания используйте отрицательное число со скобками.

  (е) => {притяжение = (-20)} 
 

Убийца

  (д) => {убийца = правда} 
 

Установить ключ уничтожения (с порожденными объектами)

  (e)=>{buttonDestroy := "e"} 
 

Установить столкновение (с порожденными объектами)

  (e)=>{collideSet := n} // n равно любому целому числу от 0 до 1023 
 

Добавить текст (с порожденными объектами)

  (д)=>{текст := "Привет, мир!"} 
 

Телепортировать объект

  (e)=>{e.other.pos[x,y]} //x,y - координаты, куда будет телепортирован объект 
 

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

Антигравитация

  (е) => {Sim.gravityAngleOffset = 3,1415927} 
 

Пауза моделирования

  (е) => {sim. running = false} 
 

Изменить уровень масштабирования

  (д) => {scene.camera.zoom = 17,700001} 
 

Изменить панорамирование камеры

  (д) => {scene.camera.pan = [-446, 14,6]} 
 

Изменить угол имитации ветра 92

Внешние ссылки:

Другую версию языка программирования Algodoo Thyme, созданную Doc671, Woodsie и Prototype, можно найти здесь:

https://docs.google.com/document/d/17_CPg-QtU3qWp4Q7eD2csOWNFZ4QiGXfBZmCOxFmy4M/edit#heading=h.bumqyppteed0

Дополнительную информацию о чабреце Algodoo можно найти здесь:

https://wiki.zum.de/wiki/GadApedia/Thyme_algodoo_english

Вот видео на YouTube от seth3rock, которое поможет вам с простым кодированием

Вот известный синтаксис Thyme.

Тимьян Синтаксис

Тимьян | Алгоду Вики | Fandom

Thyme — собственный язык программирования, используемый в Algodoo. Доступ к нему можно получить с помощью консоли, нажав клавишу тильды (~) в Windows или Mac. К нему также можно получить доступ в меню «Сценарий» объекта, чтобы изменить код объекта.

Содержание

  • 1 Работа с тимьяном
    • 1.1 Использовать пользовательские переменные
    • 1.2 Типы переменных
    • 1.3 Онколлайд
    • 1.4 Изменение свойств других объектов
    • 1.5 Если-блоки
      • 1.5.1 Создание пользовательских событий
    • 1.6 Меняем мир с тимьяном
    • 1.7 Список полезных переменных и выражений Thyme
    • 1,8 Конденсаторы
    • 1.9 Скрипты для начинающих
    • 1.10 Внешние ссылки:

Thyme — собственный язык программирования в Algodoo. Он может изменять значения объектов при наступлении определенных событий. Поддерживаемые события:

  • onClick — срабатывает при щелчке объекта.
  • onCollide — срабатывает, когда этот объект сталкивается с другим.
  • onDie — срабатывает при удалении объекта.
  • onHitByLaser — срабатывает, если в объект попадает лазерный луч.
  • onLaserHit — срабатывает, когда луч лазера попадает на объект.
  • onSpawn — срабатывает каждый раз, когда объект загружается в Algodoo.
  • onKey — срабатывает каждый раз, когда используется клавиша. Без дальнейших сценариев это сработает независимо от того, какая это была клавиша.
  • postStep — срабатывает во время выполнения имитации в соответствии с уровнем HZ имитации.
  • Обновление
  • — аналогично postStep, но срабатывает каждый раз, даже когда симуляция не запущена.

Использование Thyme для каких-либо осмысленных действий требует простого синтаксиса, основанного на манипулировании переменными:

 переменная = значение
 

Переменная может быть либо глобальной переменной, которая имеет свойства для всей сцены (записывается как scene.my.nameHere), либо переменной локального объекта, хранящейся внутри объекта (записывается как _nameHere).

Примечание: Неправильная запись переменных приведет к тому, что переменная будет временной, а не постоянной. Правильное написание переменных гарантирует, что ваши сцены Algodoo с использованием Thyme будут работать.

Любая назначенная переменная scene.my (пример: scene.my.theNumber) будет сохранена в сцене. Загрузка сцены загрузит любую назначенную глобальную переменную с ее последним значением.

Использование переменной свойств текущей сцены требует, чтобы пользователь знал имя переменной. Например, scene.camera.pan — это имя переменной, в которой хранится положение камеры. Полный список переменных свойств можно найти здесь.

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

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

 e.this.pos = e.pos;
 

эл. - Ссылаясь на данные, которые были собраны в начале события

это. - ссылка на этот объект

pos — с помощью переменной pos, отвечающей за положение объекта

= e.pos; - присвоение переменной позиции, в которой произошло событие, и завершение команды символом ;

Примечание: После каждой командной строки необходимо добавить двоеточие, чтобы отметить конец командной строки, если нет закрывающей скобки. Для визуального форсирования новой строки в окне скрипта необходимо нажать Shift+Return или Control+Return. Только return заставляет применить текущие изменения, в конечном итоге сбрасывая их при наличии ошибок.

Использовать пользовательские переменные

Пользователь может использовать пользовательские переменные, которые могут быть постоянными или временными.

 _foo = 45;
 

Создает новую переменную с именем "_foo", если она еще не создана, и присваивает ей номер 45.

Все постоянные пользовательские переменные нуждаются в подчеркивании (или символе "_") в начале имени переменной, чтобы указать, что она должна быть сохранена как часть объекта.

 бар = e.other.geomid;
 

Создает переменную с именем «bar», которая существует до тех пор, пока не закончится текущая область, и присваивает ей идентификатор геометрии «другого» объекта (доступного в onCollide).

Временные переменные создаются без какой-либо спецификации объекта и только в пределах текущей области . Область видимости — это код внутри скобок, в котором находится переменная. Все, что находится за пределами скобок, содержащих переменную, недоступно.

Примечание. Запись := вместо = гарантирует, что переменная создается вместо записи в переменную в большей области. Это обычно используется при использовании команд addObject, чтобы предотвратить редактирование как атрибутов вновь созданной формы, так и объекта, выполняющего объект (т. е. также случайную установку позиции исполняемого объекта).

Типы переменных

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

Целое число - Число без десятичных цифр:

 _hs = 64;
 

Плавающая — число, содержащее десятичные цифры:

 мат.пи = 3,14;
 

Строка — Цепочка символов, обычно в виде текста. Назначается с помощью "":

 scene.my.wikia = "Algodoo Wiki";
 

Boolean — переменная, которая может принимать только состояния True и False:

 _visible = истина;
 


Существуют более сложные переменные, часто содержащие взамен базовые переменные:

Массив — переменная, содержащая несколько значений любого типа в виде списка. Назначается с помощью квадратных скобок, каждое значение отделяется запятой. Значения, содержащиеся внутри массива, не обязательно должны относиться к одному и тому же типу переменных:

 _data = [1, 3.3, "Ошибок не зафиксировано", [5.5, 2]];
 

Code — хранит исполняемый код тимьяна. Код выполняется путем помещения переменной в код. Он также может возвращать значений :

 _code = {e.this.text = "Привет, мир"};
 

Функция — аналогична Code, за исключением того, что код Thyme является исполняемым. Он также может принимать и возвращать переменные. Функция сохраняется в виде:

(пар1, пар2,...)=>{код здесь}

 _function = (f, g)=>{f + g};
 

Код называется:

переменная(пар1, пар2,...):

 e.other.pos = [0, _function(2, 3)];
 

Функции и обычные коды возвращают значение, которое использовалось в последней строке. В этом примере результатом f + g будет последнее используемое значение.

Это также показывает, что перечисленные выше события являются просто особым типом функции, использующей параметр e, который содержит всю информацию о событии в форме класса.

Классы — единственный тип переменных, который не может быть создан пользователем. Они действуют как массивы, с той разницей, что их содержимое также является именованными переменными. Доступ к их содержимому можно получить с помощью синтаксиса: var.content. Хотя невозможно создать классы переменных, так как Thyme не выполняет автоматическое приведение к этому типу, он можно редактировать и даже создавать новые переменные в существующем классе. Единственные переменные типа класса, доступные пользователю, — это значение данных события «e». Большая часть глобальной организации переменных Algodoo (scene.my, app.camera и т. д.) и переменных, относящихся к объектам. Например: при копировании объекта в текстовое поле или использовании entityByGeomId().

Отображение электронного значения события onClick в виде текста:

 ClassObject с детьми:
количество кликов = 1;
обработано = ложь;
поз = [-1,6925424, 0,32110548];
это -> {
    множитель инерции = 1,0;
    ресурсы = [];
    времяжизни = ∞;
    textureClamped = [ложь, ложь];
    ...
 

Это также показывает, почему мы используем e.this..., e.other..., e.pos и т. д. При использовании переменной события. «Эта», «Другая» и часто другие переменные на самом деле являются переменными, хранящимися в переменной типа класса e, и мы получаем к ним доступ таким образом.

OnCollide

Изменение свойств других объектов

Определение свойств объекта, который подвергается удару, часто не подходит для текущей работы. Во-первых, вы должны знать, что плотность = 10 также может быть записана как: e.this.density = 10, так как это более точное название для этого свойства, но если вы хотите изменить плотность объекта, который попадает под этот объект вы можете использовать этот фрагмент кода:

  (е)=>{е.другая.плотность = 10} 
 

Это изменит плотность объекта, в который попали, до 10.

Блоки if

Оператор if — это задача, которую можно использовать для выбора между двумя разными значениями в зависимости от логического значения. Чаще всего используется для переключения между процедурами кода. Синтаксис:

 логическое значение ? значение1 : значение2;
 

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

При выполнении оператора If определяется значение логического значения и, в зависимости от результата, компилируется либо первое значение, либо второе. Обычно указанные значения являются кодовыми значениями (записанными в {}), но возможны и другие значения, если они могут быть скомпилированы в текущем выражении. Логическое значение обычно создается с помощью логических операторов и сравнений, которые создают логическое значение путем сравнения нескольких значений друг с другом и последующего объединения результатов. Существующие операторы сравнения:

  • == - Сравнивает оба значения, чтобы увидеть, равно ли первое значение второму значению. Это не ограничивается целыми числами или числами с плавающей запятой. Примечание: Это отличается от =, который присваивает значение вместо сравнения значений.
  • >= — сравнивает оба значения, чтобы определить, больше ли первое значение или равно второму значению.
  • <= — сравнивает оба значения, чтобы определить, меньше или равно ли первое значение второму значению.
  • != — сравнивает оба значения, чтобы определить, не равно ли первое значение второму значению. Это не ограничивается целыми числами или числами с плавающей запятой.
  • > — сравнивает оба значения, чтобы определить, больше ли первое значение, чем второе значение.
  • < — сравнивает оба значения, чтобы определить, меньше ли первое значение, чем второе.

Кроме того, логические значения можно комбинировать с помощью логических операторов аналогично операторам вычисления.

Существующие операторы:

valueA && valueB && valueC... — истинно, если оба значения истинны, и ложно, если нет, также известное как оператор AND

значениеА || значениеB || valueC... - Истинно, если истинно хотя бы одно значение, также известное как оператор ИЛИ

! valueA - инвертирует значение, также известное как NOT-оператор

Примеры IF-блоков:

 sim. running && e.this.vel(0) < 4 ? {код1} : {}
 

Этот скрипт проверяет sim.running, переменную, созданную в Algodoo, которая хранится как логическое значение. sim.running объединяется с помощью И (&&), что заставляет скрипт также сравнивать x-скорость объекта и спрашивает, движется ли объект по оси x на 4 метра в секунду или медленнее. Если оба верны, , то код 1 выполняется, иначе ничего не происходит.

 _hp <= 0 || _умереть ? {код1} : {код2}
 

сначала скрипт проверяет, равно ли _hp 0 или меньше, а затем проверяет, истинно ли _die. Если любой из них верен, он выполнит code1, иначе code2

 позиция = позиция (0) > 0 ? [-2, 0] : [2, 0]
 

Присваивает pos [-2,0] или [2,0] в зависимости от того, больше или меньше значение x 0.

Создание пользовательских событий

Поскольку события Algodoo являются базовыми функциями, встроенными в исходный код программы, можно создавать свои собственные события, встроенные в уже существующие события, предоставляемые Algodoo. Обычно это используется для запуска кода при соблюдении определенных условий при сохранении организованной структуры всего алгоритма. Следующие строки демонстрируют использование пользовательского события onDamage, которое можно использовать для геометрии, выступающей в роли игровых объектов:

 _onDamage = (е)=>{
    _hp = _hp - e.dmg;
    e.other._score = e.other._score + e.dmg;
    _hp <= 0 ? {
        время жизни = 0
    } : {}
}
 
 (е) => {
    e.other.materialname == "bullet" ? {
        // Обратите внимание на :=, чтобы принудительно создать новое значение "dmg" в e
        e.dmg := e.other._dmg;
        _onDamage (е)
    } : {}
}
 

Как видно, событие _onDamage используется для расширения onCollide без необходимости помещения кода в то же событие. Это помогает поддерживать порядок в коде и в некоторых случаях может облегчить доступ к таким функциям. Не обязательно использовать события для каждого действия, на самом деле часто проще просто использовать корневое событие вместо того, чтобы создавать новые для каждой задачи. Однако основные процессы в коде должны быть разделены, чтобы их можно было легко найти и получить к ним доступ.

Изменение мира с помощью тимьяна

Вы можете изменить всю сцену с помощью тимьяна.

Например, вы можете сделать так, чтобы сцена работала постоянно, поместив это в update:

 (е) => {sim.running = true}
 

Это приводит к тому, что сцена никогда не останавливается. Вы можете использовать это для различных приложений. Вы также можете заставить сцену удалить себя, если указанный объект будет удален, поместив в OnDie следующее:

 (е) => {scene.new}
 

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

Список полезных переменных и выражений Thyme

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

  • app.camera.* - Здесь перечислены все переменные, влияющие на камеру
  • sim. gravity* — все переменные, влияющие на гравитацию, перечислены в разделе sim с префиксом гравитации
  • .
  • вращение = math.atan2(e.other.pos(1)-pos(1),e.other.pos(0)-pos(0)) - Определяет угол между двумя объектами в системе координат и поворачивает первый объект соответственно.
  • vel = vel + [0,sim.gravityforce]/sim.frequency + [math.sin(*Угол здесь),-math.cos(*Угол здесь)]*sim.gravityforce/sim.частота - Нейтрализует эффект стандартной гравитации сцены с первой частью и применяет новую гравитацию в указанном вами угле к объекту, используя вторую часть. Опустите 2-ю часть, чтобы достичь невесомости.
  • rand.uniform01 — Создать случайное целое число с плавающей запятой от 0 до 1 со случайной длиной
  • rand.normal — то же, что и rand.uniform01, но с вероятностью 50% инвертирует вывод, что удваивает количество возможных результатов при использовании отрицательных целых чисел.

Конденсаторы

Конденсатор — это устройство, которое удерживает небольшой заряд и быстро его отдает. Их можно использовать в реальном мире для преобразования переменного тока в постоянный, повышения напряжения путем преобразования постоянного тока в переменный и т. д.

Они еще более полезны в Algodoo, так как конденсаторы могут питать лампочки, батареи, схемы защиты и многое другое. Их довольно легко сделать. Поместите это в свой код, чтобы создать базовый конденсатор. Установите _charge на 0 и установите _action1 и _action2 на нужный код.

постШаг:

 (д)=>{_заряд = _заряд = 1;
заряд > 0 ? {_action1(e)} : {_action2(e)}}
 

onHitByLaser:

 (е) => {_charge = 3}
 

Скриптовое меню светящейся части светодиода понемногу.

Скрипты для начинающих

Создатель кругов

 (д)=>{
    Сцена.addCircle{
        onclick = (e)=>{};
        oncollide = (e)=>{};
        ondie = (е) => {};
        onhitbylaser = (e)=>{};
        ключ = ключ;
        onspawn = (e)=>{};
        множитель инерции = множитель инерции;
        ресурсы = ресурсы;
        срок жизни = срок жизни;
        зажатая текстура = зажатая текстура;
        адгезия = адгезия;
        тип аттракциона = тип аттракциона;
        притяжение = притяжение;
        текстура = текстура;
        обновление = обновление;
        вель = вель;
        реституция = реституция;
        скорость материала = скорость материала;
        showforcearrows = показатьфорсстрелры;
        показатель преломления = показатель преломления;
        матрица текстуры = матрица текстуры;
        транспортир = транспортир;
        столкновение = столкновение;
        ничья = ничья;
        отражательная способность = отражательная способность;
        трение = трение;
        имя материала = имя материала;
        позиция = позиция;
        плотность = плотность;
        цветшва = цветшва;
        угол = 0;
        постшаг = постшаг;
        размытие края = размытие края;
        угол = угол
    }
}
 


Спаунер ящиков

  (e)=>{scene. addBox({size := [0,83575642, 0,27858579]; плотность := 2,00; pos := e.pos; восстановление := 0,5; трение = 0,5; угол := 0}) } 
 

Самостолкновение

  (д) => {heteroCollide = ложь} 
 

Сталкивающаяся вода

  (е) => {collideWater = true} 
 

Изменение Столкновение с другими объектами или самим собой

  (e)=>{e.this.collideSet = 1} или (e)=>{e.other.collideSet = 1} 
 

Изменить цвет фигуры [R, G, B, A]: R = красный, G = зеленый, B = синий, A = атрибут видимости: диапазон значений = от 0,0 до 1,0

  (д) => {цвет = [1,0, 0,0, 0,0, 1,0]} 
 

Цвет текста [R,G,B,A]

  (е) => {textColor = [1.0, 0.0, 0.0, 1.0]} 
 

Размер текста

  (е) => {textScale = 3} 
 

Плотность

  (д) => {плотность = 10,02} 
 

Аттракцион

  (д) => {притяжение = 50} 
 

Для отталкивания используйте отрицательное число со скобками.

  (е) => {притяжение = (-20)} 
 

Убийца

  (д) => {убийца = правда} 
 

Установить ключ уничтожения (с порожденными объектами)

  (e)=>{buttonDestroy := "e"} 
 

Установить столкновение (с порожденными объектами)

  (e)=>{collideSet := n} // n равно любому целому числу от 0 до 1023 
 

Добавить текст (с порожденными объектами)

  (д)=>{текст := "Привет, мир!"} 
 

Телепортировать объект

  (e)=>{e.other.pos[x,y]} //x,y - координаты, куда будет телепортирован объект 
 

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

Антигравитация

  (е) => {Sim.gravityAngleOffset = 3,1415927} 
 

Пауза моделирования

  (е) => {sim.					

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *