Основы скриптинга в 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}

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

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

Have Phun or Algodoo!

Комментарии

Аватар пользователя monstryuga

Толково, грамотно, и понятно.

Толково, грамотно, и понятно.
Хоть начал понимать структуру и язык для Algodoo.
А бился об те самые три сосны :).
Спасибо, особенно за разъяснения по поводу обращения к объекту, для переменных.

Аватар пользователя monstryuga

Все понял, но ничего не понял

Все понял, но ничего не понял :).
Я не очень хорошо изучил пока Thyme, и собственно путаюсь в структуре языка программирования. Что есть к чему обращение, и куда потом кидать результат?
Хочу получить цвет объекта при столкновении, и окрасить скриптованный объект в цвет другого объекта.
Как окрасить другой объект, я знаю - (event)=>{event.other.color=[код цвета,прозрачность]}, а окрасить скриптованный объект в цвет другого объекта, с которым столкнулся скриптованый?

Аватар пользователя monstryuga

Все, разобрался. Код (event)=

Все, разобрался. Код (event)=>{
event.this.color := event.other.color
}, и скриптованный объект берет цвет от объекта столкновения. Даже переменные не пришлось объявлять.
:)

Аватар пользователя monstryuga

Усовершенствовал. Теперь

Усовершенствовал. Теперь можно менять цвет, в зависимости от цвета объекта столкновения.
(event)=>{ event.other.color == {[0.0, 0.0, 0.0, 1.0]} ? {} : { event.this.color = event.other.color}
Дословно:
Выполнить=> другой объект. цвет ==( равен) {[0.0, 0.0, 0.0(черный),1.0(непрозрачный)]тогда {ничего не делать} : (иначе){скриптованный объект.цвет =(приравнять) к цвету объекта столкновения}

Аватар пользователя monstryuga

Текстура от переменной

Новая проблема :(.
При столкновении с объектом, шарик (пусть будет шарик), изменяет переменную. Эта переменная, содержит путь к текстуре. И как мне теперь, сделать вообще левому объекту, текстуру от переменной?

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