Как сделать спидометр в algodoo
В поле OnCollide уже находится запись (e)=><> . Эта запись, по моему мнению, означает, что при столкновении (переменная E) выполнится (=> этот знак) то, что находится в фигурных скобках. В эти скобки-то мы и записываем наш скрипт.
Допустим, мы хотим, чтобы появился некий объект, пусть круг, в заданной нами точке.
Наш скрипт выглядит так:
Внимательно следите за ошибками, любая лишняя, или недостающая буква, отсутствующие знаки приводят к ошибке скрипта вцелом!
Теперь давайте разберёмся с формулами.
Всем известно, что компьютер это – ЭВМ. Это значит, что он может вести расчёты. Вы можете не вычислять самостоятельно значения для параметров.
Самым простым примером будет сложение, вычитание, умножение или деление. Итак, скрипт:
OnCollide (e)=>
Означает, что при каждом столкновении заскриптованого объекта с простым у простого будет добавляться его собственное значение плотности. Допустим, это значение было равно 2, после 1 столкновения оно будет равно 2+2=4. После 2 столкновений – 4 + 4= 8. После 3 столкновений – 8+8 = 16. Этот принцип применим и к намного более сложным вычислениям.
Теперь давайте разберёмся ещё более подробно к ключевым словам, которые Phun и Algodoo понимают.
Geom – Применимо к лазерам, означает, что лазер влияет на объект, и не влияет на себя.
Laser – Применимо к лазерам, означает, что лазер влияет на себя, и не влияет на объект.
Итак, если вы поняли, как объект может непосредственно влиять на объект. Давайте рассмотрим случай, когда скриптовый объект находится на расстоянии от другого объекта, к которому относится. Непонятно? Ну, мне тоже было бы непонятно, если бы я этого не знал.
Объясняю: такой случай, например, когда нам надо вывести информацию о далёком объекте на Прямоугольник с текстом. Например, количество патронов, скорость, или любую другую.
Для этого нам потребуется ввести свою переменную, которая будет нести нужную информацию.
Итак, наша система будет получать данные о количестве патронов. Пусть 1 выстрел тратит 2 патрона. Выглядит так –
…Scene.my.Patron := Scene.my.Patron – 2…
Теперь нам надо вывести информацию, об оставшихся патронах. Обычно используют лазеры, но разница только в скорости обновления информации.
Создаём прямоугольник, делаем его чёрным, вписываем любой текст. Подгоняем текст по размеру, для удобства. К прямоугольнику, вернее рядом с ним, привинчиваем осью с мотором, какой-нибудь объект, так чтобы он бесконечно ударял в прямоугольник (желательно с большой скоростью).
В объект садим скрипт:
Получаем в прямоугольнике в скриптовом меню, в окне Text следующее
Означает к пустому тексту добавить значение нашей переменной. И вот наш прямоугольник показывает текущее значение этой переменной.
ВАЖНОЕ ПРИМЕЧАНИЕ! Если вы сохраните не всю сцену, а только те объекты, которые у вас получились, то переменная потеряется! Её необходимо снова вписать в консоль, и только потом добавлять ваши обьекты.
Мини туториал по созданию пули (снаряда).
Все состоит из прямоугольников, круга (не обязательно) и пружины.
В квадратах справа показана группа коллизий (столкновения) цвета и коллизия совпадают.
Для сдерживания заряда пуля соединена с гильзой голубоватым прямоугольником (запал), через зелёный. Зелёный прямоугольник нужен для отсоединения гильзы и пули пружиной, при удалении этого прямоугольника пружина исчезает и пуля летит под действием инерции.
При соприкосновении синего прямоугольника на пуле с синим киллером на раме пушки он исчезает, что освобождает энергию сжатой пружины. Пуля под действием пружины, опираясь на гильзу, а та в свою очередь на другой упор (затвор) вылетает в жёлоб ствола, и летит по направляющей прямо. Пройдя некоторое расстояние, пружина начнёт возвращать пулю назад. Чтобы этого не случилось, мы и поставили зелёный прямоугольник между пружиной и пулей. Зелёный прямоугольник, соприкасаясь с зелёным киллером на стволе, исчезает и пуля летит дальше, освобождаясь от гильзы.
Теперь необходимо освободить ствол от гильзы:
Гильза легко выпадает в отверстие прямо перед собой, выталкиваемая следующим патроном, под воздействием сил гравитации она упадёт вниз. В то время пуля, уже получившая ускорение, будет двигаться к своей цели. По закону сохранения энергии действие равно противодействию, это значит что вся остальная конструкция пушки получит обратное ускорение (отдачу). Это выглядит весьма реалистично.
Однако, у такой конструкции есть ряд недостатков.
1) Низкая вместимость снарядов.
2) Слабый урон при попадании (если вес пули мал, то и удар мал, но если увеличить вес пули, то вес конструкции тоже увеличится, что увеличит отдачу при малом остатке патронов).
Механизм очень редко заедает, при грамотном расположении снарядов скорострельность может быть очень высокой, точность на приемлемом уровне.
Возможность изменения типа кнопок управления (3 кнопки: вверх, вниз, огонь. Или 4 кнопки. вверх, вниз, огонь, перезарядка.)
А вот готовая сцена созданная на основе этого урока:
Cannon_v2.1.phz
1. AirFrictionMult – Множитель трения о воздух (0 – нет трения).
2. Attraction – Притяжение (отрицательное значение означает отталкивание).
3. AutoBrake – Авто тормоз (имеет 2 переменных True – да, False – нет).
4. Ccw – Параметр изменяющий направление вращения мотора (имеет 2 переменных True – по часовой, False – против часовой).
5. CollideSet – Параметр столкновений (рекомендуется создать объект, применить желательные столкновения A,B,C,D,E,F,G. и скопировать его CollideSet).
6. CollideWater – Параметр столкновений с водой (имеет 2 переменных True – да, False – нет).
7. Color – Параметр цвета, пишется в квадратных скобках, через запятые. 4 значения. 1 – это красный. 2 – это зелёный. 3- это синий. 4 – это прозрачность. Все от 0 до 1 (например [1,1,1,1] – белый, [1,0,0,1] – красный).
8. Constant – Параметр пружины, определяет её силу (большие значения могут привести к пропаданию пружины, или её некорректному поведению).
9. ControllerAcc – Ускорение, при назначении на обьект клавиш управления (клавиши управления настраиваются в контекстном меню обьекта).
10. ControllerInvertX – Инверсия клавиш управления по горизонтальной оси (имеет 2 переменных True – да, False – нет).
11. ControllerInvertY – Инверсия клавиш управления по вертикальной оси (имеет 2 переменных True – да, False – нет).
12. ControllerReverseXY – Реверс горизонтальной и вертикальной оси.
13. Cutter – Параметр лазера, отвечает за разрезание лазером (имеет 2 переменных True – да, False – нет).
14. DampingFactor – Затухание для пружин (отрицательное значение означает, что пружина будет колебаться бесконечно, увеличивая частоту).
15. Density – Плотность (если значение равно 0 – объект пропадёт, 0.01 – вес воздуха в игре).
17. DrawBorder – Рисовать границы объекта (имеет 2 переменных True – да, False – нет).
18. DrawCake – Рисовать сектор круга (имеет 2 переменных True – да, False – нет).
19. FadeDist – Дистанция распада лазера (расстояние, на которое лазер может светить).
20. FadeTime – Время, за которое след трейсера пропадёт.
22. HeteroCollide – Параметр, позволяющий двум одинаковым обьектам не сталкиватся между собой (оба объекта должны обладать им. Имеет 2 переменных True – да, False – нет).
23. Immortal – Бессмертие / невозможность стереть объект, а лазеру разрезать его. (Бессмертный объект можно стереть, если его значение плотности будет равно 0. Имеет 2 переменных True – да, False – нет).
24. ImpulseLimit – Сила, с превышением которой ось исчезнет (значение равное +Inf означает что ось НЕ исчезнет, при любых нагрузках).
25. InertiaMultipler – Точно неизвестно, из перевода – Множитель инерции.
26. Killer – Стиратель (имеет 2 переменных True – да, False – нет).
27. LegasyMod – Точно неизвестно, возможно тип обработки поведения пружины, разницы не замечено.
28. Length – Расстояние, при котором пружина в покое (проще говоря, длина пружины в нормальном состоянии).
29. MaterialVelocity – Скорость в метр/секунда.
30. MaxRays – Максимум отражений/преломлений лазера (если значение равно 0 , то лазер даже через прозрачный объект не пройдёт).
31. Motor – Параметр оси. Мотор или просто ось (имеет 2 переменных True – да, False – нет).
32. MotorSpeed – Скорость мотора (измеряется в градус/секунда, в связи, с чем рекомендую копировать с уже известной оси).
33. MotorTorgue – Сила, с которой мотор вращается (Значение может быть отрицательным, тогда вращение будет в обратную строну.).
34. OnCollide, OnLaserHit, OnHitByLaser – Это те строки, куда можно записать скрипт, активирующийся в зависимости от действия. OnCollide – Столкновение объекта с объектом. OnLaserHit – При попадании лазера на объект. OnHitByLaser – при попадании на объект лазерного луча.
35. OpaqueBorders – Прозрачные границы объекта (имеет 2 переменных True – да, False – нет).
36. Protractor – Транспортир на круге (имеет 2 переменных True – да, False – нет).
37. RefractiveIndex – Индекс преломления света (проще говоря, чем больше, тем сильнее свет преломляется. Значение 0 – полное поглощение света. Значение +Inf – полное отражение света).
38. Restitution – Показатель упругости, чем больше, тем сильнее объект будет отскакивать.
39. Ruller – Применимо только к Box (прямоугольнику) Разметка, вроде линейки.
40. ShowForceArrow – Показывать стрелку сил (только алгудо версии 1.71 и выше).
41. ShowLaserBodyAttrib – Показывать картинку лазера (имеет 2 переменных True – да, False – нет).
42. ShowVelocity - Показывать стрелку скорости (только алгудо версии 1.71 и выше).
43. Size – Размер (применимо к лазеру).
44. Text – Текст, имеет вид “Текст” (вписывается вместе с ДВОЙНЫМИ апострофами, не ставьте 4 одинарных! Отображаться будет только то что в апострофах!).
45. TextColor – Цвет текста, пишется в квадратных скобках, через запятые. 4 значения. 1 – это красный. 2 – это зелёный. 3- это синий. 4 – это прозрачность. Все от 0 до 1 (например [1,1,1,1] – белый, [1,0,0,1] – красный).
46. TextScale – Размер текста.
47. Texture – Содержит путь типа C:DocumentsAndSettings/User/Мои документы/Tekstura по котрому на вашем PC находится текстура в формате BMP.
48. TextureMatrix – Матрица, содержащая данные о расположении на объекте текстуры, такие как положение, угол наклона, увеличение. (рекомендуется копировать из заранее созданного объекта с подогнанной текстурой).
49. Velocity – Скорость распространения света (применимо к лазеру).
DELETED запись закреплена
Роман Алексеев
В оси: bend = true
bendConstant = 100
bendTarget = <
(scene.my.rp / 28) + 12.8
> Где 12.8 это начальное положение
Роман Алексеев
Иван, Может быть то, что в других сценах спидометром управляют восемьсот объектов разных? Непонятно что, откуда и куда берёт, и почему.
Андрей, нет. Есть два простых способа спидометра: bendConstant на растягивающейся оси, закрепленной на стрелке и колесе, либо переменная в оси. Первый способ я сам нашел, а второй Влад Попов вряд ли поймет
Иван, Я сомневаюсь, что люди ничего не понимающие в этом, с ходу разберутся в принципе действия такого спидометра, закрытого тыщей крышек
Андрей, выделяешь и видишь, что к нему идет ось. Смотришь что в ней написано и куда она идет. Затем смотришь ось стрелки. Ничего сложного, а если это кажется сложным, то лучше заняться марбл рейсами
Роман Алексеев ответил Андрею
Андрей, "научным тыком" можно многое узнать, смотришь чем отличается ось на спидометре и обычная, все это поправляешь и готово.
Кирилл Илинич
Самое простое - заскриптовать угол от скорости.
Например так: postStep = (e) =>
Добавь текстуру стрелки на круг и готово.
тут пока сыро.. работаю над материалом
Scene.cloneEntityTo(объект, позиция). объект получается как раз по GeomID, либо напрямую, при столкновении с скриптовым.
сработал такой синтаксис:
print(scene.entityByGeomID(31));
Скриптинг в Phun. Перечень свойств у объектов (не полный)
entityByGeomID
GadApedia/Thyme algodoo english – ZUM-Wiki
wiki.zum.de
If you set the density of an object to NaN ( Not a Number) , it vanishes! This is not a clean code though, as it will not free the storage-space, but it works, and of you dont destroy and create more then 1000 objects, you dont have to bother at all about storage-space. Clean code will be described in the sophisticated methods at entityByGeomID.
Create a new object
If you insert
(e)=>< Scene.addCircle(< radius := 0.02;vel := [2, 2] >)>
into the poststep-section, this will allready create a neverending bunch of circles, that spread from the origin, and move towards the top-right direction. As no color is specified, they will have all nice different colors.
Also other geometries can be created this way. Kilinich creates a fountain of water by coding the poststep as
sim.tick % 2 == 0 ? v := scene.addbox( pos := [0, 1];
vel := [0, 30];
size := [0.3, 1];
angle := rand.normal / 50
>);
v.liquify
> : <>
and added a killer-plain, so there wont be too much water, as too much water is slowing the scene.
Control structures
The variable can either be a "global variable" (Scene.my variable, global propertys), or an local object variable, stored inside an object.
Any assigned Scene.my variable (example Scene.my.theNumber) will be untouched and saved in the scene. Loading a scene will load any assigned Scene.my variable with its last value.
Читайте также: