| Программируемый блок и ускорители

11 сообщений / новых - 0
Сообщение
Аватар пользователя Reliciouos
Не в сети
Программируемый блок и ускорители
-1
0
+1

Здравствуйте, инженеры.

Застрял на проблеме работы с ускорителями в программируемом блоке, а именно

IMyThrust LHT = GridTerminalSystem.GetBlockWithName("LHT (Up)") as IMyThrust; - не кладет в переменную злосчастный двигатель (((

И вроде все глаза проглядел, зная как он чувствителен к регистру имени блока и т.п. И гугл весь облазил, не могу понять, в чём дело... помогите, пожалуйста, если кто знает решение.

Какого лешего он вообще приписывает к имени эти направления в скобках? Нельзя это как-то убрать?

Аватар пользователя Reliciouos
Не в сети
-1
0
+1

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

Итого: пришел к мнению, что требуется "аварийная кнопка", нажатие по которой выключает и включает все связанные со скриптами блоки и перезапускает все таймеры. Это может быть как "живая кнопка", так и отдельный программируемый блок, запускаемый вручную с быстрой панели.

Может есть какие мысли на сей счет, поделитесь опытом.

- To infinity and beyound!
Buzz Lightyear

Аватар пользователя PazDim
Не в сети
-1
0
+1

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

Аватар пользователя Reliciouos
Не в сети
-1
0
+1

Хм, с группой? Есть что-то вроде GetGroupWithName(string name) ?

- To infinity and beyound!
Buzz Lightyear

Аватар пользователя Евгений Мартюк
Не в сети
-1
0
+1

Мне больше нравится находить ускорители по типу <IMyThrust> и различать по направлению относительно Блока типа <IMyShipController>.

Как это делается можно посмотреть здесь /workshop/5533

Аватар пользователя Евгений Мартюк
Не в сети
-1
0
+1

проблема с зависанием LCD решается переключением на вывод приватного текста и обратно.

            screen.ShowPrivateTextOnScreen();   
            screen.ShowPublicTextOnScreen(); 

Аватар пользователя Reliciouos
Не в сети
-1
0
+1

Спасибо, выкл/вкл дисплея тоже помогает и тоже программно решается.

Вопрос по скрипту - на вики написано, что циклы foreach не работают, вместо этого советуют работать с листами, как с коллекциями через for. Видимо эта информация устаревшая?

- To infinity and beyound!
Buzz Lightyear

Аватар пользователя Евгений Мартюк
Не в сети
-1
0
+1

Да, устаревшая. Я сам его случайно увидел в чужом скрипте который препарировал.

Reliciouos написал(а):

Спасибо, выкл/вкл дисплея тоже помогает и тоже программно решается.

Но переключение на вывод приватного текста и обратно еще и настраевает дисплей.

Аватар пользователя Reliciouos
Не в сети
-1
0
+1

Евгений Мартюк написал(а):

Но переключение на вывод приватного текста и обратно еще и настраевает дисплей.

Не понял, что значит настраивает дисплей?

- To infinity and beyound!
Buzz Lightyear

Аватар пользователя Евгений Мартюк
Не в сети
-1
0
+1

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

Аватар пользователя PazDim
Не в сети
-1
+2
+1

Reliciouos написал(а):

Спасибо, выкл/вкл дисплея тоже помогает и тоже программно решается.

Вопрос по скрипту - на вики написано, что циклы foreach не работают, вместо этого советуют работать с листами, как с коллекциями через for. Видимо эта информация устаревшая?

Использую foreach, пока все работает. По поводу групп:

string ENGINE_GROUP_NAME = "Двигатели";//Название группы двигателей

List<IMyTerminalBlock> engines = new List<IMyTerminalBlock>();//Двигатели

//Получаем список двигателей     
//Получаем список групп     
List<IMyBlockGroup> blockGroups = new List<IMyBlockGroup>();     
GridTerminalSystem.GetBlockGroups(blockGroups);     
//Ищем группу двигателей     
for(var i = 0; i < blockGroups.Count; i++)     
{   
    if(blockGroups[i].Name == ENGINE_GROUP_NAME)   
    {   
        //Получаем список двигателей   
        blockGroups[i].GetBlocks(engines);   
        break;   
    }   
}

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

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