GRUPO STEAM
Space Engineers RU RU_space
GRUPO STEAM
Space Engineers RU RU_space
8
EM JOGO
89
ON-LINE
Fundado em
22 de dezembro de 2013
Idioma
Russo
Local
Russian Federation 
 Este tópico foi afixado, então deve ser importante
Neuromancer 8/jan./2015 às 11:08
Программирование в SE
Пока разбирался как использовать Action, запилил небольшой защитный скрипт:
Как это работает: ставим поршень с дверью, перед дверью две туррели и сенсор, за дверью еще один сенсор и звуковой блок (динамик), а так же компьютерный блок.
В компе пишем скрипт. Сенсоры должны его запускать (назначить сенсорам на активацию запуск комп. блока).. Ставим туррели в положение Офф, дверь закрываем.
Назначаем имена объектам:
DoorPiston - имя поршня, который открывает/закрывает дверь
DoorSensor - имя сенсора на выходе
CloseSensor - имя сенсора за дверью
DoorTurret - туррель 1
DoorTurret2 - туррель 2
SoundMessage - звуковой блок
Теперь, когда вы (владелец блока) подходите к сенсору, дверь открывается и активируются туррели, затем к другому сенсору - турели деактивируются и дверь закрывается.
Надеюсь кому нибудь этот пример поможет =) Скрипт внизу:
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);
}
}
http://gtm.steamproxy.vip/sharedfiles/filedetails/?id=371705652
Última edição por Neuromancer; 8/jan./2015 às 11:16
< >
Exibindo comentários 112 de 12
Neuromancer 8/jan./2015 às 11:18 
официальный гайд по программированию
http://gtm.steamproxy.vip/sharedfiles/filedetails/?id=360966557&insideModal=1
к сожадению на англ и без примеров.
RuXandeR 17/jan./2015 às 20:40 
Я далек от программирования, однако любопытство взяло верх над полным отсутствием грамотности в этом вопросе. Решил по аналогии запилить освещение.
Суть: Подходишь к прожектору (в зону досягаемости сенсора) - он включается. Отходишь (в зону недосягаемости сенсора) - выключается.
Первое действие получилось - прожектор включается. А вот с выключением не выходит.
Для того чтобы прожектор погас, нужно выйти из зоны действия прожектора и зайти в нее обратно. Причем значение "true" для сенсора совсем не обязательно и сенсор вызывает действие скрипта на прог.блоке без него.

Вот часть кода:
IMySensorBlock Sensor1 = GridTerminalSystem.GetBlockWithName("Sensor1") as IMySensorBlock; IMyReflectorLight Light1 = GridTerminalSystem.GetBlockWithName("Light1") as IMyReflectorLight; if (Sensor1.DetectOwner) {Light1.GetActionWithName("OnOff").Apply(Light1);}

Пробовал написать в таком виде:
if (Sensor1.DetectOwner == true) {Light1.GetActionWithName("OnOff").Apply(Light1);} if (Sensor1.DetectOwner == false) {Light1.GetActionWithName("OnOff").Apply(Light1);}
Но все по прежнему.

Пробовал и в таком:
if (Sensor1.DetectOwner == true) {Light1.GetActionWithName("OnOff_On").Apply(Light1);} if (Sensor1.DetectOwner == false) {Light1.GetActionWithName("OnOff_Off").Apply(Light1);}
В таком случае прожектор включается и не выключается вообще.
Т.е. значения true и false в нашем случае не работают? И почему? Или они вообще в игровом коде не задействуются?
Подумал о такой вещи как бездействие сенсора, т.е. код отсутствия действия, или состояние бездействия как еще одно действие. Например: Sensor.NotDetect
Но такого не нашел.

Т.к. я далек от знания языков программирования, дописать выключение прожектора не получается. Есть у кого какие мысли?
Última edição por RuXandeR; 17/jan./2015 às 21:29
Neuromancer 21/jan./2015 às 6:53 
if (Sensor1.DetectOwner) это тоже самое что и ==true
Neuromancer 21/jan./2015 às 6:55 
if (Sensor1.DetectOwner == false) - этот событие происходит видимо когда в поле сенсора попадает кто нибудь, отличный от овнера. Чтобы сенсор срабатывал когда в его поле никого нету, должно быть другое состояние, посмотри в офф статье. я пока не нашел.
Получается при этом условии ты заходишь в поле сенсора, он проверят ты овнер или нет. если ты овнер - срабатывает первое условие, если не овнер - второе. а если ты овнер и не находишься в поле то ничего не срабатывает и он горит всегла, как-то так походу)
sinkapoy 4/abr./2015 às 22:44 
за основу взят язык с# так, что туториалы можно по нему смотреть (если кому-то легче будет)
Rapteell 5/dez./2015 às 3:51 
Сам не так давно начал играть и разбираться в игре но на мой скромный взгляд тут не хватает таймера с запуском проверки наличия владельца в зоне досягаемости сенсора. да и еще не совсем понятно куда делся оператор ELSE или в данной версии языка он отсутствует?
Apofigen 8/nov./2017 às 5:06 
Если кому-то поможет сделать скрипт проще и короче.

В данном примере есть создание новой переменной блока "Поршня"
IMyPistonBase DoorPiston = GridTerminalSystem.GetBlockWithName("DoorPiston") as IMyPistonBase
, где

IMyPistonBase - тип переменной блока;

DoorPiston - имя переменной; (лучше его задавать одноимённым с названием блока в терминале, дабы избежать путаницы)

"DoorPiston" - то, что в скобках после GetBlockWithName(), есть название блока в терминале

as IMyPistonBase - данное выражение говорит о том, что всю строку после знака "=" надо считать как тип данных IMyPistonBase (важно, иначе присвоение значения переменной не произойдёт);

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

if (условие)
{
действие
}

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

DoorPiston.GetActionWithName("Reverse").Apply(DoorPiston);

Данный код понимается так: блок DoorPiston, произведи поиск действия в своём списке действий по точному названию "Reverse" (GetActionWithName() - поиск и получения действия из списка действий, доступных блоку по точному названию) и примени его к блоку DoorPiston (Apply() - применить к блоку в скобках действие, которое мы получили).

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

DoorPiston.Reverse();

Читается так: блок 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);

Как можно заметить - это проще, быстрее и понятнее.
Última edição por Apofigen; 8/nov./2017 às 7:46
Apofigen 8/nov./2017 às 7:27 
Escrito originalmente por Rapteell:
...да и еще не совсем понятно куда делся оператор ELSE или в данной версии языка он отсутствует?

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

if(условие)
{
операции,_если_true;
}
else
{
операции,_если_false;
}
Última edição por Apofigen; 8/nov./2017 às 7:28
Apofigen 8/nov./2017 às 8:42 
Продолжим рассматривать всё тот же поршень DoorPiston.

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

Interface name: IMyPistonBase
Parent: IMyFunctionalBlock
Fields:
float Velocity
float MinLimit
float MaxLimit
Terminal properties:
Velocity -> Single
UpperLimit -> Single
LowerLimit -> Single
Actions:
OnOff -> Toggle block On/Off
OnOff_On -> Toggle block On
OnOff_Off -> Toggle block Off
Reverse -> Reverse
IncreaseVelocity -> Increase Velocity
DecreaseVelocity -> Decrease Velocity
ResetVelocity -> Reset Velocity
IncreaseUpperLimit -> Increase Maximal distance
DecreaseUpperLimit -> Decrease Maximal distance
IncreaseLowerLimit -> Increase Minimal distance
DecreaseLowerLimit -> Decrease Minimal distance

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

Fields:
float Velocity
float MinLimit
float MaxLimit

Поле - это значение и оно доступно только для чтения, однако если у блока есть соответствующее свойство, то его можно изменить.

Terminal properties:
Velocity -> Single
UpperLimit -> Single
LowerLimit -> Single

Вот пример получения значения поля в переменную
float A = DoorPiston.MinLimit;

То же самое, только через свойство
float A = DoorPiston.GetValueFloat("LowerLimit");

И пример задания полю значения с помощью переменной A, которую мы получили с прибавлением единицы, чтобы была разница между нижним и верхним пределом
DoorPiston.SetValueFloat("UpperLimit",A+1);

И на всякий случай "сожмём" поршень
DoorPiston.SetValueFloat("Velocity",-1);
Última edição por Apofigen; 8/nov./2017 às 9:12
Yurbalife 10/jan./2018 às 8:04 
DoorSensor.DetectOwner возвращает свойство реагирует ли сенсор на своих. Чтобы он срабатывал на определенного пользователя надо вызвать метод DetectedEntities(List<MyDetectedEntityInfo> entities); и уже в entities разбирать кто пришел к тебе в гости
Vaha 5/mai./2019 às 6:41 
Можно не разбирать кто пришел, а заменить это
if (Sensor1.DetectOwner)

и просто поверить сработал сенсор или нет на то что у него прописано в настройках

if (Sensor1.IsActive) {Light1.GetActionWithName("OnOff_On").Apply(Light1);} else {Light1.GetActionWithName("OnOff_Off").Apply(Light1);}
anton.bikovsky 1/abr./2020 às 22:21 
Всем доброго времени суток! Вопрос такой имеется. Кто может написать скрипт на старт трехступенчатой ракеты с земли с последующим выходом на заданную орбиту? Собрал МКС, болтается на орбите. Есть космолет "Буран". Хочу сделать такую вещь: старт с Земли, выход на орбиту, стыковка космолета с МКС. С идеями в ЛС пожалуйста))) Всем добра, не болейте) Еще есть нужда в доработке скрипта орбиты: нужно, после выхода на заданную орбиту, выключать трастеры и вклучать их лишь тогда, когда МКС отклоняется от орбиты примерно +/- 500м. для корректировки
Última edição por anton.bikovsky; 1/abr./2020 às 22:24
< >
Exibindo comentários 112 de 12
Por página: 1530 50