Язык программирования space engineers + видео обзор

Язык программирования space engineers

Язык программирования space engineers

Ну вот и обещанный гайд по программированию или скриптингу в Space Engineers. Это первая часть гайда и в ней мы рассмотрим объвление переменных и типы переменных.

И так, для начала мы установим Programmable block на нашу станцию/корабль.Открываем панель управления блока и жмякаем на кнопку «Edit». Мы сразу же видим:

Данный код создаёт метод Main в нашей внутриигровой «программе» в которой и будут происходить наши действия.Без него код не запуститься.

Писать код мы будем между строк, для этого кликаем ЛКМ после скобочки < и жмём Enter.

Объявим переменную.Что-бы объявить переменную в C# нужно перед названием переменной указать её тип, существует много типов переменных, но я сейчас перечислю самые популярные, а это:

Создадим переменную one типа int и зададим ей значение 100, для этого пишем в коде int one = 100

У нас должно получиться так:

Создадим ещё две переменных типа int.

Что мы сделали?Мы создали две переменные «one» и «two», значение one = 100, значение two = 50, создали ещё одну переменную zn, значение которой равняется разности двух переменных.То-есть 100-50, значение переменной zn будет равняться 50.

Так же можно делить: /
Умножать: *
Складывать: +

Язык программирования space engineers

Всем доброго времени суток. У вас не бомбит по поводу отсутствия обещанных гайдов? А у меня припекло.
//Так что, возьму на себя смелость написать гайд. Тему возьмём обещанную “Ветвление и циклы”. Как и положено зазнайке, я буду слегка выпендриваться большим количеством теории, но всё же
постараюсь сократить её до необходимого минимума.//

Ветвление.
//C# представленный нам для создания скриптов в SE, представлен в виде ФЯП (функционального языка программирования), а он является линейным. Это значит, что программа выполняется последовательно и её можно представить в виде БСА (Базовой структуры алгоритма). Для того чтобы программа имела возможность нескольких решений, и используют ветвление. Что же такое ветвление? Это своеобразный выбор между возможностями решений, в зависимости от условий.

Язык программирования space engineers

———————————————————————————————-—
В качестве примера мы с вами разберём кодовый замок, сделанный на основе сенсора. Сенсор будет выполнять в данном случае функцию ячейки памяти. (Поясняю, у сенсора 6 параметров которые мы можем изменять и проверять) Всё что нам надо также знать это увеличение сенсора и метод кодирвоания (экспериментальным, увеличение сенсора-2,45 за одно нажатие кнопки. Максимально значение 50, минимальное 1, значит диапазон возможных значений- 20. Следовательно, мы сделаем код из 3 ячеек, с 20-ю значениями в каждой). Одна из особенностей данной системы в том, что для правильной комбинации может быть множество вариантов. Это может быть сумма чисел, их разность и т.д. Мы будем использовать метод сравнение чисел.

Источник

Язык программирования space engineers

void Main()
<
// varitables
IMyPistonBase DoorPiston = GridTerminalSystem.GetBlockWithName(«DoorPiston») as IMyPistonBase;
IMySensorBlock DoorSensor = GridTerminalSystem.GetBlockWithName(«DoorSensor») as IMySensorBlock;
IMySensorBlock CloseSensor = GridTerminalSystem.GetBlockWithName(«CloseSensor») as IMySensorBlock;
IMySoundBlock SoundMessage = GridTerminalSystem.GetBlockWithName(«SoundMessage») as IMySoundBlock;
IMyLargeInteriorTurret DoorTurret= GridTerminalSystem.GetBlockWithName(«DoorTurret») as IMyLargeInteriorTurret; //
IMyLargeInteriorTurret DoorTurret2= GridTerminalSystem.GetBlockWithName(«DoorTurret2») as IMyLargeInteriorTurret; //

if (DoorSensor.DetectOwner == true || CloseSensor.DetectOwner == true)
<
DoorPiston.GetActionWithName(«Reverse»).Apply(DoorPiston);
DoorTurret.GetActionWithName(«OnOff»).Apply(DoorTurret);
DoorTurret2.GetActionWithName(«OnOff»).Apply(DoorTurret2);
SoundMessage.GetActionWithName(«PlaySound»).Apply(SoundMessage);
>
>

Язык программирования space engineers

Язык программирования space engineers

Но все по прежнему.

Пробовал и в таком:

В таком случае прожектор включается и не выключается вообще.
Т.е. значения true и false в нашем случае не работают? И почему? Или они вообще в игровом коде не задействуются?
Подумал о такой вещи как бездействие сенсора, т.е. код отсутствия действия, или состояние бездействия как еще одно действие. Например: Sensor.NotDetect
Но такого не нашел.

Т.к. я далек от знания языков программирования, дописать выключение прожектора не получается. Есть у кого какие мысли?

Язык программирования space engineers

Язык программирования space engineers

Язык программирования space engineers

Язык программирования space engineers

Язык программирования space engineers

Если кому-то поможет сделать скрипт проще и короче.

В данном примере есть создание новой переменной блока «Поршня»

IMyPistonBase DoorPiston = GridTerminalSystem.GetBlockWithName(«DoorPiston») as IMyPistonBase

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

Внутри есть строка действия:

Данная строка долгая для написания и занимает много символов (а запас символов в программном блоке ограничен), да и получается какая-то нелепость с ненужным поиском действия (ведь мы его знаем. зачем его искать в списке?) поэтому лучше использовать несколько другой способ, реализующий абсолютно точно такое же действие напрямую:

Читается так: блок DoorPiston, произведи действие Reverse.

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

IMyPistonBase DoorPiston = GridTerminalSystem.GetBlockWithName(«DoorPiston») as IMyPistonBase;
DoorPiston.Reverse();
//вместо DoorPiston.GetActionWithName(«Reverse»).Apply(DoorPiston);

IMyLargeInteriorTurret DoorTurret= GridTerminalSystem.GetBlockWithName(«DoorTurret») as IMyLargeInteriorTurret;
DoorTurret.OnOff();
//вместо DoorTurret.GetActionWithName(«OnOff»).Apply(DoorTurret);

IMySoundBlock SoundMessage = GridTerminalSystem.GetBlockWithName(«SoundMessage») as IMySoundBlock;
SoundMessage.PlaySound();
//вместо SoundMessage.GetActionWithName(«PlaySound»).Apply(SoundMessage);

Язык программирования space engineers

. да и еще не совсем понятно куда делся оператор ELSE или в данной версии языка он отсутствует?

Оператор else в коде работает и он записывается так:

Язык программирования space engineers

Продолжим рассматривать всё тот же поршень DoorPiston.

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

Fields:
float Velocity
float MinLimit
float MaxLimit

Источник

Как я строил гексапод в Space Engineers. Часть 1

Здравствуйте. Я хочу рассказать про проектирование и программирование системы управления конечностями в гексаподе, построенном в Space Engineers.

Забегая вперед скажу, что всё, что касается программирования в Space Engineer, будет в следующей статье. В этой я расскажу про обратную кинематику и покажу прототип на HTML Canvas в котором я занимался отладкой алгоритмов.

Язык программирования space engineers

Предыстория и постановка задачи.

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

Язык программирования space engineers

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

С чего начнет строить гексапод нормальный человек? Наверное зайдет в игру и начнет строить тело робота с конечностями, а потом думать как это всё оживлять. Но это не наш метод (ц)

Я начал с теории

Для строения ноги была выбрана следующая схема:

Inner joint — внутренний сустав, качающийся по оси рысканья (yaw)
Mid joint и outer joint — внешние суставы, качающиеся по оси тангажа (pitch). Направление отсчета — от основания ноги к концу ноги.

Язык программирования space engineers

Угол 0 для всех суставов означает, что нога полностью выпрямлена (прямую ногу будет проще строить в игре).

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

Угол внутреннего сустава можно найти через арктангенс горизонтальных координат цели.

С двумя другими суставами посложнее. У нас есть длина всех суставов. Можно найти угол к горизонту и расстояние между средним суставом и землей, а так-же расстояние до целевой точки.

Дальше через теорему косинусов нужно найти углы треугольника по известным сторонам.

Язык программирования space engineers

Язык программирования space engineers

Так это выглядит в коде:

Движение

Далее. Робот должен ходить, верно? То-есть мы должны передавать N раз в секунду каждой ноге координаты заданной позиции. С учетом того, что ног 6 и 3 из них двигаются в противофазе получается как-то сложно. Нужно ввести новый уровень абстракции.

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

Язык программирования space engineers

Обдумывая как всё будет работать я понял, что задача слишком сложная для того, что-бы всё заработало с первого раза (с дебагом в Space Engineers всё плохо, но об этом в следующей части).

Поэтому я решил написать визуализатор. Мне хотелось его сделать без дополнительных библиотек и иметь возможность запускать его в один клик и без привязки к окружению.
Поэтому был выбран JS + HTML Canvas.

А сейчас нарисуем сову.

Шаг — структура данных для управления ногой:

Но для отрисовки понадобятся еще несколько классов:

Обертка над Canvas:

В классе Leg есть метод для получения текущих координат суставов. Вот эти координаты мы и будем отрисовывать.

Так-же я добавил отрисовку точек, в которых находилась нога в N последних тиков.

И наконец Worker, который будет запускать симуляцию:

Язык программирования space engineers

Здесь видно, что траектория движения ног отличается от окружности. Движение по вертикали напоминает урезанную синусоиду, а движение по горизонтали линейно. Это должно уменьшить нагрузку на ноги.

Теперь несколько пояснений, что происходит в коде.

Как научить робота поворачивать?

Для поворота я рассмотрел 2 ситуации:

Если робот стоит — ноги двигаются по окружности.

Единственное но — движение именно по окружности сильно усложнило-бы код с текущей реализацией. Поэтому ноги двигаются по касательной к окружности.

Когда робот двигается нужно реализовать что-то вроде Ackermann steering geometry с дифференциалом.

Язык программирования space engineers

То-есть длина шага ног, двигающихся по меньшему радиусу, — меньше. А угол поворота — больше.

Что-бы реализовать изменение угла поворота для каждой ноги я придумал следующий алгоритм:

1. Считаем угол от изначального положения ноги к центру робота:

2. Считаем угол от изначального положения ноги к (центру робота + смещение, которое отвечает за поворот — это изменяемый параметр):

3. Поворачиваем шаг на разницу этих углов:

Но это не всё. Еще нужно изменять длину шага. Реализация в лоб — домножать длину шага на изменение расстояния до центра — имело фатальный недостаток — внешние ноги слишком широко шагали и начинали задевать друг друга.

Поэтому пришлось усложнить реализацию:

1. Считаем изменение расстояния до центра для каждой ноги:

0.3 — магическое число

2. Находим отношение между минимальным и максимальным изменением

Этот множитель отражает разницу между минимальным и максимальным изменением расстояния до центра. Он всегда меньше 1 и если на него домножать длину шага — она при повороте не будет увеличиваться даже для внешних по отношению к направлению поворота ног.

Вот как это работает (gif 2 мегабайта):

Язык программирования space engineers

→ Поиграться с результатом можно тут

Для более пристального изучения рекомендую сохранить содержимое в html файл и продолжить в любимом текстовом редакторе.

В следующей публикации я расскажу как заставил всё это работать в Space Engineers.
Спойлер: в Programmable Block можно писать на C# почти последней версии.

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Читают сейчас

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Похожие публикации

Проблемы современной робототехники 2, или как игры спасут мир…

Онлайн-книга своими руками на JavaScript

Деревянный робот, который умеет играть в шахматы

Курсы

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Минуточку внимания

Комментарии 23

В это игре в этом нет смысла. Кроме случаев когда у вас какие-то экзотические настройки, из-за чего уран в жестком дефиците.

По сабжу — идея автора годная. Возникает только вопрос гексапод должен определять высоту постановки ноги, как он это делает? Насколько я помню (давно не играл, увы) реальных способов узнать где земля (без использования модов) в игре нет.

Язык программирования space engineers

Landing gears?
Не подошли по следующим причинам:
1) Они повреждаются или разрушаются при столкновении с поверхностью. Я нашел только 2 модуля, которые могут служить подошвой ноги: колеса и дрель. Но дрель имеет слишком низкий коэффициент трения — робот скатывался вниз даже на слабом уклоне.
2) В процессе шага конец ноги поворачивается относительно поверхности — пришлось-бы добавить еще 2 ротора что-бы это компенсировать.

Проект уже есть в workshop, но я хочу дать на него ссылку вместе с объяснениями — что и как работает. То-есть в следующей статье.

Вроде все уже согласились что одним из самых оптимальных вариантов является летающая машина.

У колесной платформы есть существенный недостаток — неадкватно низкое трение скольжения (вообще выглядит как баг). Т.е. едет она вроде бы почти адекватно, а вот стоять на месте категорически не может. Как следствие такая платформа будет соскальзывать даже при минимальном уклоне.

Хотя как вариант поддамкрачивать ее — приехал, выставил Landing Gear на поршнях и все, типа база.

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

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

А на счет подъема — зачем он вам? Ретрансляторы для копания + проекторы для сборки «дропподов» возволят вам кидаться в вашу базу ресурсами, без необходимости подниматься. К тому же, опять же, лед есть и на астероидах, так что можно и на взлет/посадку ресурсы собирать в космосе.

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

Язык программирования space engineers

Ах, ностальгия… Лет 15 назад именно это было темой моего проекта по… компьютерной графике 🙂 Помню, тоже развлекался сначала с формулами вычисления координат «стопы» относительно крепления «бедра» для таких-то углов сочленений и длин «бедра» и «голени» вместе с обратными формулами — нахождения необходимых углов сочленений для такой-то координаты «стопы». Затем, как и Вы — перешел к следующему уровню абстракции: ходьбе. Тоже вначале чесал репу, а потом дошло, что все на самом деле просто: касающиеся земли ноги просто смещаются на Х назад, в то время как другие три ноги совершают движение на 2Х вперед, сопровождающееся подъемом по той или иной дуге. Затем пошли алгоритмы разворотов и поиска маршрута по неровной поверхности (правда, без обхода препятствий). Даже скриншоты остались:
Язык программирования space engineers

А потом, в виду того, что это был проект не по роботике, а по компьютерной графике… препод попросил перенести алгоритм на нечто живое:
Язык программирования space engineers

Было очень приятно перечитать статью, тем более, что проект был «из спортивного интереса». Я все хотел эти алгоритмы перенести в железо… на нечто, что можно пощупать руками… но потом как-то не срослось.

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

Источник

Programming Guide

Programming in Space Engineers is done with the Programmable Block which can be given scripts written in C# (pronounced C Sharp). This can be used to make autonomous mining drones, long-range player-killing torpedoes, automated welding arms for ship construction and much more.

Contents

Introduction

Editor access

Only one player can edit the same script at a time. If someone else has an editor for the current block open and someone else tries to open that block’s editor, a notification will be shown that the editor is already open.

Main method

When the editor is opened for first time, void Main() method is present inside the code editor. This is entry point that will be called when executing script. If Main method is removed / renamed, the script will not run and you will be notified in the programmable block details area. Custom methods/variables can be defined and used, but only the Main method will be called without reference.

Variable lifetime and scoping

There are two types of variables for scripting:

Local (inside the methods) these variables will keep their value only during execution of a method. Value will be “lost” when the method ends. Global (outside the methods) these variables will keep their values during the lifetime of script. For example, if the variable needs to keep its value between separate runs of the script, it needs to be defined outside the methods.

After pressing “Remember & Exit” or “Remember” buttons, the previous script will be overwritten and all Global variables will be lost.

All variables, local and global except for the built-in Storage variable will lose their value or return to their default value when recompiling the code and between saved game loads. The Storage variable is unique in that it will store the data as a string for use between saved sessions and recompile.

Compiling

When the “Check code” button is pressed, the code will be compiled and the result of the compilation will be shown. There are two steps of the compilation process: First the code inside editor is compiled by c# compiler for language errors. If there are any errors during compilation the following dialog is shown: It this case “aaa” string is placed before Main method. This is the wrong language construction and the compilation failed. In the error dialog the Line number error and description of the error is shown.

After compilation, the code is checked for usage of disallowed namespaces and types. In case that check fails, the following dialog is shown: In this case System.IO.Directory was used to delete some directory. This is forbidden and error is shown that “Not allowed type was used in script”.

If compilation and checks pass, a dialog is shown, confirming the checks passed, and the code is saved.

Script execution

Script can be triggered by the following means:

1. By pressing «Run» button in terminal properties of programmable block.

2. By assigning terminal action and manually pressing the action button (1-9) while controlling the grid using cockpit, control station or remote control.

3. By pressing button on a button panel with assigned action «Run».

4. By a timer with assigned action «Run».

5. By another script in another programmable block in the same grid.

6. By antenna with assigned programmable block, when recieved message from another antenna. (see Antenna#Programming)

7. By the script itself, by assigning a value to Runtime.UpdateFrequency variable. In this case, no argument can be specified, however, you can use the following Main method signature: void Main(string argument, UpdateType updateSource) to gain acces to the information about what exactly triggered the script and so make the script «know» if it was triggered by Update1, Update10, Update100 events or manually or whatever event was the reason of trigger execution.

Script is executed only on server even if it’s triggered from client. If there is any exception during script execution, all clients will be notified in programmable block details area about failure. In case of exception during script execution, script will not run again unless User opens editor and change script.

Counting of instructions

Every time script is executed, every instruction of script is counted. If script executes more instruction than limit, execution is stopped and user is notified that script is too complex for execution. This prevents scripts to “freeze” game.

Whitelist

The types and classes allowed in scripts are restricted. Refer to the Scripting Whitelist to see what you are allowed to use.

Available interfaces

Possible Actions

Currently only terminal actions can be triggered inside scripts. User can access terminal system for grid on which programmable block is located and trigger any terminal action on any block at grid.

Block Classes (Action List)

Same block class for different SubTypeID

Some blocks have the same parent (e.g. in cubeblocks.sbc) and differs only by subtype (e.g. ). This means there is no distinction between these blocks in code.

Example of these blocks is the Cargo Container: there are 3 types of cargo containers in the game: small, medium and large. These three types differ only by the Subtype and Type is the same for them e.g. large cargo container id is:

In this case there is only one class IMyCargoContainer for all types of cargo containers.

Example programs

Hello world

The standard Hello World program in Space Engineers can be written as such:

If this program is entered into a programmable block and run, it will result in «Hello, world!» being displayed in the programmable block’s interface on the lower right hand side of the screen.

Getting your position

This program will show the current GPS coordinates of your programming block’s position in the world.

Checking a sensor

It’s easy to get a sensor to open a door or trigger some other action even without any programming if you just place that action in the sensor’s «Setup actions» list. However, triggering an action when a sensor does not detect something is more difficult, and cannot be done with timer blocks. This program will automatically check a sensor every 10 ticks (working out to about 6 times per second) and close a door if the sensor does not detect anything. This can easily be applied to other purposes, like turning off drills when asteroids are not in sensor range.

For this script to work, the sensor must be named «Door Sensor 1» and the door must be named «Door 1». If you configure the sensor to open the door, the door will automatically open when the player enters the sensor range and close when the player leaves the sensor range.

Compilation errors

This is a list (in progress) of known compilation errors and what causes them.

Источник

Видео

Скрипты в Space Engineers: Урок1. Общие сведения, поиск и управление блоками. Быстрый таймер.

Скрипты в Space Engineers: Урок1. Общие сведения, поиск и управление блоками. Быстрый таймер.

Space Engineers - Гайд для новичков | Как писать скрипты без знаний языка программирования

Space Engineers - Гайд для новичков | Как писать скрипты без знаний языка программирования

Программирование скриптов в Space Engineers [1]

Программирование скриптов в Space Engineers [1]

Space Engineers Скрипты

Space Engineers Скрипты

Space engineers гайд для новичков | Програмируемый блок, таймер, сенсор | Где и как применить.

Space engineers гайд для новичков | Програмируемый блок, таймер, сенсор | Где и как применить.

Программирование скриптов в Space Engineers [1

Программирование скриптов в Space Engineers [1

Space Engineers: Программируем Экскаватор. Управление манипулятором на шарнирах.

Space Engineers: Программируем Экскаватор. Управление манипулятором на шарнирах.

Space Engineers: Гайд как писать автоматизирующие скрипты!

Space Engineers: Гайд как писать автоматизирующие скрипты!

Space Engineers: Простые скрипты с разбором и объяснениями. Стрим №1. (гайд, туториал, мануал)

Space Engineers: Простые скрипты с разбором и объяснениями. Стрим №1. (гайд, туториал, мануал)

Что делать в Начале Игры? Ч1 2021 Гайд 🚀 Space Engineers

Что делать в Начале Игры? Ч1 2021 Гайд 🚀 Space Engineers
Поделиться или сохранить к себе:
Добавить комментарий

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