NobbyNobbs Опубликовано: 19 декабря 2013 Опубликовано: 19 декабря 2013 Приветствую, камрады! Кто-нибудь здесь джойстики CH программирует? Просто для меня сам процесс программирования этих джойстиков достаточно интересен, не знаю правда, что это за форма психического расстройства, но приходится с этим мириться. В частности в БЗС, мне кажется, всем могут пригодиться две фичи, первая из которых, надеюсь, со временем станет ненужной, а вот вторая 100% должна пригодиться мессоводам. В общем так: Скрипт намба 1, "Триммирование" РВ. Данный скрипт моделирует "как бэ триммирирование (поэтому в кавычках) РВ", а вернее "привязанный резинкой к приборной доске (или креслу, тут по обстоятельствам) РУС". В принципе этого же эффекта можно добиться аналоговыми "триммерами" имеющимися в основании джойстика, но я предпочитаю лишний раз резисторы не беспокоить. Код: sequence wait(js1.b6 and (not js2.b4)); a2=js1.a2-128; endsequence if(not (js1.b6)) then cms.a2=js1.a2+a2; endif Вышеизложенная часть скрипта внаглую скопирована из мануала (ссылка на его русский перевод в подписи) и в пояснениях вряд ли нуждается. Вы просто отклоняете РУС в положение, которое по вашему разумению должно соответствовать нейтрали, нажимаете кнопку B6 (у меня комбатстик, поэтому у владельцев файтерстика обозначения кнопок вероятнее всего будут другими), возвращаете РУС в центр, отпускаете кнопку... самолет летит прямо (относительно). Вроде как прикольно, но есть одно но: смещая "начало координат" (или нейталь джойстика, кому как нравится), к примеру на пикирование (чтобы компенсировать кабрирующий момент) мы приходим к ситуации, что выбрать ручку полностью на себя не представляется возможным, так как у нас теперь есть только 128 отсчетов ручки на себя при необходимости иметь 128+a2. поэтому пришлось придумать этому скрипту продолжение: sequence while([a2<0]and[js1.a2==255]); a2=a2+1; endsequence sequence while([a2>0]and[js1.a2==0]); a2=a2-1; endsequence То есть, в случае нехватки хода полностью "отдатой" или выбранной ручки джойстика мы наш "триммер" постепенно обращаем в нуль, возвращая нейтраль в центр. Такой вот костыль для костыля. Скрипт намба 2, "Лимитатор" Написал я его лишь для того, чтобы лишний раз не поджаривать двигатель мессершмита, летая на постоянном 1.42 ata (а по-другому, учитывая легкость хода РУСа от CH у меня просто не получается). Выглядит он вот так: if ([js2.a3<25] and ([a3==0])) then cms.a3=229; else if ([js2.a3<18] and ([a3==1])) then cms.a3=237; else if ([js2.a3<12] and ([a3==2])) then cms.a3=242; else cms.a3=255-js2.a3; endif endif endif sequence wait((js2.b6)and[a3<3]); a3=a3+1; endsequence sequence wait((js2.b8)and[a3>0]); a3=a3-1; endsequence Здесь a3 это виртуальная ось, которая на самом деле будет отвечать за выбранный режима работы нашего "лимитатора", а их у меня получилось 4: a3=0, 90% или 229 отсчетов, соответствует 1.2 ata при горизонтальном полете; a3=1, 93% или 237 отсчетов, соответствует 1.3 ata при горизонтальном полете; a3=2, 95% или 242 отсчета, соответствует 1.3 ata на горках, петлях и т.д., a3=3, 100%, 1.42 ata. Режимы переключаются кнопками 6 и 8 на РУДе (это четырехпозиционная хатка под указательным пальцем), вправо - увеличить наддув, влево - уменьшить наддув. Что еще? Вангую, что оси управления газом у владельцев CH ProThrottle в настройках игры инвертированы, и если возникнет желание поюзать скрипт, то придется эту галку в настройках убрать. Ну и сразу признаюсь, что цифры 90%, 93%, 95%, 100% по большому счету взяты с потолка, в том смысле, что когда я тестил скрипт, то выше 3 000 м. вообще не забирался. Ну и делитесь своими скриптами и идеями, не жадничайте. 6
SVOR Опубликовано: 20 декабря 2013 Опубликовано: 20 декабря 2013 Классная тема. Попробуем. Я недавно купил комплект, так что очень интересно
ROSS_Wespe Опубликовано: 20 декабря 2013 Опубликовано: 20 декабря 2013 (изменено) Там инструкция на английском. Я попереводил и бысто утух. Вот теперь с русским мануалом всё будет повеселей, спасибо Изменено 20 декабря 2013 пользователем ROSS_Wespe
NobbyNobbs Опубликовано: 20 декабря 2013 Автор Опубликовано: 20 декабря 2013 Там инструкция на английском. Я попереводил и бысто утух. Вот теперь с русским мануалом всё будет повеселей, спасибо спасибо неизвестному герою, сподобившемуся на перевод этого манускрипта ))
NobbyNobbs Опубликовано: 21 декабря 2013 Автор Опубликовано: 21 декабря 2013 подсмотрел у Икса видео о том, как оптимально настроить функцию "прильнуть к прицелу" (вот здесь). действительно, на мой взгляд оптимально, так как в отличие от "фиксированных взглядов" при "Иксовской" реализации остается возможность управлять обзором. что не нравится: под реализацию зачем-то нужно две кнопки. делаем одну кнопку: при первом нажатии влипаем в прицел, при повторном возвращаемся в более естественное положение. скрипт: sequence wait(js1.b4); cms.b8=true; delay(3); cms.b8=false; wait(js1.b4); cms.b3=true; delay(3); cms.b3=false; endsequence код прост и понятен, но если просто забить его в редактор, естественно ни фига работать не будет, поэтому на данном примере напишу пару слов о том, как вообще пользоваться CH Control Manager-ом, так как с ним все не очень очевидно. как создать профиль (карту, map) с поддержкой cms объяснять не буду, это просто, там есть волшебник. создали. теперь по обозначениям устройств: js1, js2, js3 это физические устройства, обычно в последовательности РУС, РУД, Педали. cms1, cms2, cms3 - это виртуальные устройства, соответствующие js1, js2, js3. cms4, cms5 и т.д. это видимые системе виртуальные устройства, которых вы можете насоздавать не помню сколько, кажется до cms16. cms - созданное контрол манагером "устройство", кнопки и оси которого отображены на вкладке CMS Controls в GUI. важно понимать, что системе непосредственно это устройство не видно. теперь непосредственно по скрипту, а именно - что делать чтобы он работал: так как мы "забираем" четвертую кнопку на первом джойстике, нам нужно найти ее в GUI [график юзер интерфейс], (для этого просто нажимаем её на устройстве или кликаем мышью на миниатюре в GUI) и снять галку с чекбокса DX Mode. мы отключили кнопку на физическом устройстве. по первому нажатию js1.b4 у нас включается кнопка cms.b8, которой не соответствует никакое устройство видимое системе, поэтому находим кнопку 8 на вкладке CMS Controls, кликаем по ней, в поле DirectX Device выбираем cms1, в поле DirectX Control - button 4 (можно было выбрать cms4 и любую кнопку на нем, но я использовал пустой слот от js1, чтобы без дела не болтался). для cms.b3 как раз таки выбираем cms4 и какую-нибудь кнопку, у меня оказалась свободной button 2. теперь нажимаем кнопку download, прописываем все это безобразие в джойстик и пользуемся. сразу оговорюсь, что в принципе в данном случаем можно вообще обойтись без программирования и реализовать эту фичу иначе, а именно - по нажатию кнопки приближать взгляд, при отпускании удалять. делается это следующим образом: что по русски означает - при нажатии кнопки на джойстике срабатывает кнопка плюс на нумпаде, при отпускании - минус.
23AG_KA Опубликовано: 23 декабря 2013 Опубликовано: 23 декабря 2013 Огромное спасибо за инфу. Просветите по важному вопросу: в Вин 8 про после перезагрузки система не видит Fighterstick. Только передергивание кабеля помогает. Джой не брал в руки с 2010 (когда была XP), потому сам не могу понять, а Гугл не помогает.
NobbyNobbs Опубликовано: 23 декабря 2013 Автор Опубликовано: 23 декабря 2013 Просветите по важному вопросу: в Вин 8 про после перезагрузки система не видит Fighterstick. Только передергивание кабеля помогает. у меня аналогичная беда с комбатстиком, правда я лечу её перезагрузкой (клин клином). вообще системы в этом лично я не смог увидеть - он то сразу подхватывается, то вообще не подхватывается.
Utyug Опубликовано: 23 декабря 2013 Опубликовано: 23 декабря 2013 А в диспетчере устройств, когда джойстик пропадает, неопознанных или неверно работающих устройств не появляется? Если появляются, можно попробовать их отключить (программно) и обнаружить/включить заново. У меня МДжой16 с неинтеловскими чипсетами таким страдал, написал командный файлик, который занимался отключением/включением (через утилитку devcon) Мало ли кому поможет.
NobbyNobbs Опубликовано: 23 декабря 2013 Автор Опубликовано: 23 декабря 2013 А в диспетчере устройств, когда джойстик пропадает, неопознанных или неверно работающих устройств не появляется? Если появляются, можно попробовать их отключить (программно) и обнаружить/включить заново. У меня МДжой16 с неинтеловскими чипсетами таким страдал, написал командный файлик, который занимался отключением/включением (через утилитку devcon) Мало ли кому поможет. посмотрел что и как в диспетчере устройств. в диспетчере устройств все хорошо, все "устройства работают нормально". но оказывается, что если при "приглючившем" джойстике зайти в панель управления на вкладку устройства, правой кнопкой щелкнуть по комбатстику и выбрать "устранение неполадок", то винда как это ни странно подумав говорит что-то в духе: "чувак, по ходу он завис, я его перезапустила" и после этого все работает. в общем создал для комбатстика ярлык на рабочем столе, теперь в случае чего буду "исправлять неполадки" правой кнопкой мыши, а не компьютер перезагружать. а вообще, буржуи на своих форумах, в том числе и на официальном майкрософтовском, говорят, что изначально надо было инсталлятор дров запускать в режиме совместимости с семеркой, потому как на дрова для восьмерки CH Products никак не разродятся. p.s. а с девконом почти разобрался. почти - потому что cmd для этой утилиты надо запускать с правами администратора, иначе ни фига не получается, а как это сделать через батник я ХЗ.
23AG_KA Опубликовано: 23 декабря 2013 Опубликовано: 23 декабря 2013 Спасибо! С "устранением неполадок" работает. Что интересно иногда есть в системе джой, но нет отклика по осям, а сейчас заходил, винда видит его только в группе "Нет данных" в "Устройствах и принтерах".
ROSS_Wespe Опубликовано: 23 декабря 2013 Опубликовано: 23 декабря 2013 А могёте написать скрипт, чтобы на кнопку ось виртуальную повесить. Я на лагге кнопку тормоза хочу в ось тормоза превратить. А птом через скрипт подобрать удобную мне скорость нажатия. С триммерами можно так же сделать. PS По триммированию в инструкции ещё один интересный скрипт приложен для пружинных джоев: там ещё одной осью можно двигать 0 джойстика. Т.е. владельцы СН могут получить триммера на ЛаГГ уже сейчас.
NobbyNobbs Опубликовано: 23 декабря 2013 Автор Опубликовано: 23 декабря 2013 с тормозом попробовать можно, но если честно, то я не очень понимаю как именно скрипт должен работать. просто если это будет полноценная ось, то надо биндить две кнопки, что на мой взгляд тормозу многовато будет, а с одной кнопкой не очень понятно как делать. вариант: при нажатии и удержании кнопки гашетка тормоза нажимается, при отпускании - отпускается; выглядеть это будет примерно вот так: sequence while (js1.b9 and ([cms.a1<255])); cms.a1=cms.a1+2; //delay(1); endsequence sequence while ((not js1.b9) and ([cms.a1>0])); cms.a1=cms.a1-3; //delay(1); endsequence скорость придется настраивать подбором комбинаций шага изменения значения оси и задержки (сейчас задержка выключена, надо удалить два слеша перед delay). минус подобной реализации я вижу в невозможности зафиксировать тормоз в промежуточном положении без необходимости яростно задрачивать многократно нажимать кнопку. если есть возможность выделить под тормоз целых две кнопки, то запрограммировать ось можно вот так: sequence while ((js2.b2)and([cms.a9<255])); CMS.A9=CMS.A9+1; delay(1); endsequence sequence while ((js2.b3)and([cms.a9>0])); CMS.A9=CMS.A9-1; delay(1); endsequence if ((js2.b4)and(js2.b3)and([cms.a9>0])) then CMS.A9=CMS.A9-1; else if ((js2.b4)and(js2.b2)and([cms.a9<255]))then CMS.A9=CMS.A9+1; endif endif так у меня сделано управление шагом винта на Лагге (мне показалось, что так шаг меняется точнее). нажимаем кнопку Б2 - медленно увеличиваем значение, нажимаем Б3 - медленно уменьшаем (задержка между итерациями 1 такт (сколько это в секундах - ХЗ, пишут, конечно, что 10 тактов~полсекунды, но это вранье). если нажимаем эти кнопки в сочетании с Б4 (использую как шифт), то значение меняется быстро. ИХМА - тормозу хватит и половины такого скрипта, два режима работы ему ни к чему. естественно, через GUI эту ось можно прикрутить как к новому девайсу, так и к уже имеющемуся. ну а если изложите свое видение реализации тормозов - можно покумекать
ROSS_Wespe Опубликовано: 23 декабря 2013 Опубликовано: 23 декабря 2013 При нажатии кнопки тормоз нажимается до 100%.При отпускании ось опять возвращается в 0. Скорость перехода от 0% к 100%. Тормоза - это реальная кнопка HAT3 Down [b15] на Fighterstick, а нажиматься должна виртуальная ось R на CM Device 1.
NobbyNobbs Опубликовано: 23 декабря 2013 Автор Опубликовано: 23 декабря 2013 (изменено) тогда можно взять первый скрипт из предыдущего моего поста, поменять B9 на B15 и пользоваться. фактически то же самое, но покороче вот здесь (я бы взял этот) if (js1.b15 and ([cms.a1<255])) then cms.a1=cms.a1+10; else if ((not js1.b15) and ([cms.a1>0]))then cms.a1=cms.a1-10; endif endif в GUI для сms.a1 надо сделать вот так: а для B15 отключить DX Mode. после этого нажимаете download, и в test/calibrate смотрите что получилось (если включен mapped mode конечно). p.s. +/- 10 надо поварьировать, пока не получите удовлетворительную скорость срабатывания. Изменено 23 декабря 2013 пользователем saatanaperkele
ROSS_Wespe Опубликовано: 23 декабря 2013 Опубликовано: 23 декабря 2013 Спасибо, всё отлично работает.
NobbyNobbs Опубликовано: 23 декабря 2013 Автор Опубликовано: 23 декабря 2013 (изменено) Спасибо, всё отлично работает. вы на Лагге обкатайте и если это в использовании удобно будет отпишитесь - я и себе так сделаю Изменено 23 декабря 2013 пользователем saatanaperkele
Monah Опубликовано: 24 декабря 2013 Опубликовано: 24 декабря 2013 Может кто написать скрипт, чтобы на ось газа повесить несколько виртуальных осей активируемых при нажатии определенных кнопок? И так чтобы при отпускание этой кнопки сохранялось значение оси.
NobbyNobbs Опубликовано: 24 декабря 2013 Автор Опубликовано: 24 декабря 2013 Может кто написать скрипт, чтобы на ось газа повесить несколько виртуальных осей активируемых при нажатии определенных кнопок? И так чтобы при отпускание этой кнопки сохранялось значение оси. сразу не скажу - тут думать надо. в частности, надо понять, что делать при повторном нажатии кнопки. что я имею ввиду: вы нажали одну кнопку, выставили одну виртуальную ось, нажали на вторую кнопку - выставили вторую ось. опять нажали первую кнопку, а у вас у физической оси одно значение, а у виртуальной другое. если просто их приравнять будет резкий скачок, что плохо. можно ввести дельту, типа как с триммерами, но тут тоже надо смотреть случаи когда физического хода руда не хватит чтобы достичь крайнего значения на виртуальной оси.
Monah Опубликовано: 24 декабря 2013 Опубликовано: 24 декабря 2013 Да хотя бы со скачком. Главное чтобы при отпускание кнопки сохранялось значение виртуальной оси. Хотел на радиаторы повесить, скачок на доли секунды думаю не критичен. И еще я имел ввиду не ось руда, а ось колесика, которое внизу на корпусе РУСа.
NobbyNobbs Опубликовано: 24 декабря 2013 Автор Опубликовано: 24 декабря 2013 Да хотя бы со скачком. Главное чтобы при отпускание кнопки сохранялось значение виртуальной оси. Хотел на радиаторы повесить, скачок на доли секунды думаю не критичен. а сам газ там же будет?
NobbyNobbs Опубликовано: 24 декабря 2013 Автор Опубликовано: 24 декабря 2013 (изменено) в общем скрипт будет до неприличия простым: if (js1.b4)then cms.a1=js1.a3; else if(js1.b3) then cms.a2=js1.a3; endif endif где в js1.b4 и js1.b3 надо заменить циферки соответствующие кнопкам на те, которые нужны непосредственно вам. ну и в GUI соответственно надо физическую ось и кнопки выключить, а для виртуальных осей №№ 1, 2 проставить устройства и оси (выше есть примеры как это делается). Изменено 24 декабря 2013 пользователем saatanaperkele
Monah Опубликовано: 24 декабря 2013 Опубликовано: 24 декабря 2013 Спасибо, попробуем. И за тему большое спасибо. До этого вообще понять ничего не мог.
Monah Опубликовано: 24 декабря 2013 Опубликовано: 24 декабря 2013 Все работает. Повесил три виртуальные оси на одну физическую. if(JS1.B2) THEN CMS.A5=JS1.A3; else if(JS1.B7) THEN CMS.A4=JS1.A3; else if(JS1.B3)THEN CMS.A6=JS1.A3; endIF endIF endIF 1
NobbyNobbs Опубликовано: 25 декабря 2013 Автор Опубликовано: 25 декабря 2013 (изменено) РОФ, БзС и микростик РУДа CH. есть мнение, что упомянутый микростик в виде "как есть" вообще непригоден для использования в РОФ и БЗС, однако его очень легко переделать в очередную четырехпозиционную хатку, примерно вот так: cms.b2=[js2.a1<10]; cms.b4=[js2.a1>245]; cms.b7=[js2.a2<10]; cms.b10=[js2.a2>245]; как итог - еще четыре кнопки, на две из которых (бывшая ось X) очень очень удобно повесить ФОВ+ и ФОВ-, а еще две фиг знает зачем нужны Изменено 25 декабря 2013 пользователем saatanaperkele 2 1
ROSS_Wespe Опубликовано: 25 декабря 2013 Опубликовано: 25 декабря 2013 (изменено) Прочитал инструкцию внимательно, вроде начало приходить понимание: Написал небольшое дополнение к скрипту, где к нажатию кнопки приравнивается ось. Дело в том, что , как я понял, виртуальной кнопке устройства CMS можно присвоить только нажатие определённой кнопки джойстика. Если вы используете кнопку джойстика для ещё какой либо функции с шифтом, то это значение при простом присвоении виртуальной кнопке значения кнопки джойстика теряется. В моём случае кнопка джойстика В15 используется без шифта как ось тормозов, а с шифтом-как пуск сигнальной ракеты. Соответственно кнопка-В15-это и есть рабочая кнопка, В4-кнопка "шифт" на джойстике. Кнопка cms.B1-отвечает за ось тормоза, кнопка cms.b2-отвечает за стрельбу из ракетницы. if (not cms.b1 and not cms.b2) then cms.b1=(js1.b15 and not js1.b4); cms.b2=(js1.b15 and js1.b4); else if (cms.b1 and not cms.b2) then cms.b1=js1.b15; else if (not cms.b1 and cms.b2) then cms.b2=js1.b15; endif endif endif Эта часть отвечает за двойное действие кнопки джойстика. Весь скрипт стал выглядеть теперь так: script sequence if (not cms.b1 and not cms.b2) then cms.b1=(js1.b15 and not js1.b4); cms.b2=(js1.b15 and js1.b4); else if (cms.b1 and not cms.b2) then cms.b1=js1.b15; else if (not cms.b1 and cms.b2) then cms.b2=js1.b15; endif endif endif if (cms.b1 and ([cms.a1<255])) then cms.a1=cms.a1+20; else if ((not cms.b1) and ([cms.a1>0]))then cms.a1=cms.a1-50; endif endif endsequence endScript Изменено 25 декабря 2013 пользователем ROSS_Wespe 1
NobbyNobbs Опубликовано: 25 декабря 2013 Автор Опубликовано: 25 декабря 2013 (изменено) Прочитал инструкцию внимательно, вроде начало приходить понимание: Написал небольшое дополнение к скрипту, где к нажатию кнопки приравнивается ось. Дело в том, что , как я понял, виртуальной кнопке устройства CMS можно присвоить только нажатие определённой кнопки джойстика. Если вы используете кнопку джойстика для ещё какой либо функции с шифтом, то это значение при простом присвоении виртуальной кнопке значения кнопки джойстика теряется. В моём случае кнопка джойстика В15 используется без шифта как ось тормозов, а с шифтом-как пуск сигнальной ракеты. Соответственно кнопка-В15-это и есть рабочая кнопка, В4-кнопка "шифт" на джойстике. Кнопка cms.B1-отвечает за ось тормоза, кнопка cms.b2-отвечает за стрельбу из ракетницы. if (not cms.b1 and not cms.b2) then cms.b1=(js1.b15 and not js1.b4); cms.b2=(js1.b15 and js1.b4); else if (cms.b1 and not cms.b2) then cms.b1=js1.b15; else if (not cms.b1 and cms.b2) then cms.b2=js1.b15; endif endif endif Эта часть отвечает за двойное действие кнопки джойстика. Весь скрипт стал выглядеть теперь так: script sequence if (not cms.b1 and not cms.b2) then cms.b1=(js1.b15 and not js1.b4); cms.b2=(js1.b15 and js1.b4); else if (cms.b1 and not cms.b2) then cms.b1=js1.b15; else if (not cms.b1 and cms.b2) then cms.b2=js1.b15; endif endif endif if (cms.b1 and ([cms.a1<255])) then cms.a1=cms.a1+20; else if ((not cms.b1) and ([cms.a1>0]))then cms.a1=cms.a1-50; endif endif endsequence endScript давайте по пунктам. "1. Если вы используете кнопку джойстика для ещё какой либо функции с шифтом, то это значение при простом присвоении виртуальной кнопке значения кнопки джойстика теряется." в общем случае нет. то есть, если назначить что-нибудь в духе cms.b1=js1.b1; то эта виртуальная кнопка будет точно такой же кнопкой как и настоящая, просто у нее скорее всего будет другой ID и ее надо переназначить в игре. в том числе она будет работать с шифтом или другими клавишами-модификаторами. в случае с тормозом она действительно "потерялась", но только потому, что в GUI была отключена кнопка b15, то есть сама кнопка как-бы была "удалена" для системы, а никаких клавиш вместо нее мы с вами не назначали, только ось. 2. Скрипт. немножко теории: синтаксис типа cms.b1 стоит использовать только в случае если вы будете использовать значение этой переменной как кнопку для вывода в систему. если вам нужна просто булева переменная, то лучше использовать b1, b2,..., b128. такая же ситуация с осями - если мы не будет отдавать значение во вне, надо использовать a1, a2...an в вашем случае (если оставить скрипт как есть) нужна одна кнопка cms.b1 и одна переменная b1. практика. на мой взгляд первый блок if где вы сравниваете cms.b1 и cms.b2 просто не нужен, потому как в нем вы сравниваете переменные, значения которых определяются внутри самого блока. спрашивается - а зачем, если вы и так заведомо знаете их значение? вернуть ракеты можно малыми усилиями, обозначив, что тормозить надо при ненажатом шифте. а для сочетания (шифт+b15) прописать кнопку, которой в GUI поставить в соответсвие cms1 -> button 15. иначе говоря: if ((not js1.b4) and js1.b15 and ([cms.a1<255])) then cms.a1=cms.a1+20; else if ((not js1.b15) and ([cms.a1>0]))then cms.a1=cms.a1-50; endif endif cms.b1=js1.b4 and js1.b15; как-то так апдейт: не увидел sequence endsequence. блоки sequence нужны для работы с командами wait и while, для if они лишние. Изменено 25 декабря 2013 пользователем saatanaperkele
PitMit Опубликовано: 25 декабря 2013 Опубликовано: 25 декабря 2013 Мужики, вы бы в коментах в скриптах хоть вкратце писали, что делаете. А то скрипт видно, а что, зачем и почему - не особо. Вот пример моего скрипта в БоБе для раздельных тормозов и выпуска закрылков в различные положения для мессера. Правда я использую только руд. Может кому пригодиться. // CMS Script File // // Game Title: CoD // Written By: // Date: // script cms.b3 = js1.b4 and js1.b11; // левый тормоз cms.b4 = js1.b3 and js1.b11; // правый тормоз cms.b12 = js1.b4 and js1.b29; // левый тормоз на оси cms.b13 = js1.b3 and js1.b29; // правый тормоз на оси cms.b6 = JS1.B14; cms.b7 = JS1.B16; cms.b8 = js1.b3 and JS1.B14; cms.b9 = js1.b3 and JS1.B16; cms.b10 = js1.b4 and JS1.B14; cms.b11 = js1.b4 and JS1.B16; if ((js1.b3 and js1.b14) or (js1.b4 and JS1.B14)) then cms.b6 = not js1.b14; endif if ((js1.b3 and js1.b16) or (js1.b4 and JS1.B16)) then cms.b7 = not js1.b16; endif SEQUENCE // закрылки боевое положение выпустить WAIT( cms.b6 ); // Ждать нажатия кнопки B14 на JS1 CMS.B1 = TRUE; // Нажать Кнопку CMS DELAY( 177 ); // Ждать 7 секунд CMS.B1 = FALSE; // Отжать кнопку CMS ENDSEQUENCE SEQUENCE // закрылки боевое положение убрать WAIT( cms.b7 ); // Ждать нажатия кнопки B14 на JS1 CMS.B2 = TRUE; // Нажать Кнопку CMS DELAY( 177 ); // Ждать 7 секунд CMS.B2 = FALSE; // Отжать кнопку CMS ENDSEQUENCE SEQUENCE // закрылки взлетное положение выпустить WAIT( cms.b8 ); // Ждать нажатия кнопки B14 на JS1 CMS.B1 = TRUE; // Нажать Кнопку CMS DELAY( 350 ); // Ждать 15 секунд CMS.B1 = FALSE; // Отжать кнопку CMS ENDSEQUENCE SEQUENCE // закрылки взлетное положение убрать WAIT( cms.b9 ); // Ждать нажатия кнопки B14 на JS1 CMS.B2 = TRUE; // Нажать Кнопку CMS DELAY( 360 ); // Ждать 15 секунд CMS.B2 = FALSE; // Отжать кнопку CMS ENDSEQUENCE SEQUENCE // закрылки посадочное положение выпустить WAIT( cms.b10 ); // Ждать нажатия кнопки B14 на JS1 CMS.B1 = TRUE; // Нажать Кнопку CMS DELAY( 530 ); // Ждать 23 секунды CMS.B1 = FALSE; // Отжать кнопку CMS ENDSEQUENCE SEQUENCE // закрылки посадочное положение убрать WAIT( cms.b11 ); // Ждать нажатия кнопки B14 на JS1 CMS.B2 = TRUE; // Нажать Кнопку CMS DELAY( 530 ); // Ждать 23 секунды CMS.B2 = FALSE; // Отжать кнопку CMS ENDSEQUENCE endScript
ROSS_Wespe Опубликовано: 25 декабря 2013 Опубликовано: 25 декабря 2013 Спасибо, как всё просто, а я голову сломал, пока придумывал.
ROSS_Wespe Опубликовано: 25 декабря 2013 Опубликовано: 25 декабря 2013 Почему выражение not js1.b4 в скобках? if ((not js1.b4) and js1.b15 and ([cms.a1<255])) then
NobbyNobbs Опубликовано: 25 декабря 2013 Автор Опубликовано: 25 декабря 2013 Почему выражение not js1.b4 в скобках? if ((not js1.b4) and js1.b15 and ([cms.a1<255])) then если честно, то потому, что я не знаю как именно работает оператор отрицания без скобок. то есть со скобками он гарантированно применяется к той переменной перед которой указан, а без скобок может с тем же успехом применяться ко всему выражению.
ROSS_Wespe Опубликовано: 25 декабря 2013 Опубликовано: 25 декабря 2013 Попробовал Ваш скрипт, есть одно но. Если я нажал шифт и кнопку 15, то сработало как надо, нажалась кнопка выстрел, но если я при нажатой кнопке 15 отпустил шифт, то кнопка выстрел отжимается. Так же если я проста нажал кнопку 15, то срабатывает ось тормоза, но если в это время я нажал кнопку шифт, то ось тормоза перестаёт нажиматься. А я сделал, чтобы кнопка работала точно так же, как в классическом варианте-т.е. нажатие шифта контролируется только для выбора какой сценарий для этой кнопки запустить-ось или выстрел. Пока кнопка 15 не будет отжата снова, повторное нажатие шифта ни на что не влияет. Насчёт использования не кнопки на CMS, а переменной согласен.
NobbyNobbs Опубликовано: 25 декабря 2013 Автор Опубликовано: 25 декабря 2013 Попробовал Ваш скрипт, есть одно но. Если я нажал шифт и кнопку 15, то сработало как надо, нажалась кнопка выстрел, но если я при нажатой кнопке 15 отпустил шифт, то кнопка выстрел отжимается. Так же если я проста нажал кнопку 15, то срабатывает ось тормоза, но если в это время я нажал кнопку шифт, то ось тормоза перестаёт нажиматься. А я сделал, чтобы кнопка работала точно так же, как в классическом варианте-т.е. нажатие шифта контролируется только для выбора какой сценарий для этой кнопки запустить-ось или выстрел. Пока кнопка 15 не будет отжата снова, повторное нажатие шифта ни на что не влияет. Насчёт использования не кнопки на CMS, а переменной согласен. понял вас. просто у меня комбатстик, и поэтому о том как положено работать каноническому шифту от CH я не знал.
NobbyNobbs Опубликовано: 25 декабря 2013 Автор Опубликовано: 25 декабря 2013 Товарищ Веспе! Посмотрел повнимательнее придуманную Вами фишку с шифтом - это круто! Пара лишних букв в коде есть, но сам алгоритм шикарный if (not (cms.b1 or cms.b2)) then cms.b1=(js1.b9 and not js1.b4); cms.b2=(js1.b4 and js1.b9); else if (cms.b1) then cms.b1=js1.b9; else if (cms.b2) then cms.b2=js1.b9; endif endif endif
Monah Опубликовано: 29 декабря 2013 Опубликовано: 29 декабря 2013 Триммирование кнопками хатки элеронов и руля высоты. Сброс триммеров одной кнопкой. %DEFINE TRIMMER_CENTER 0 %DEFINE TRIMMER_STEP 1 %DEFINE js_eleron JS1.A1 %DEFINE js_elevator JS1.A2 %DEFINE js_trim_up JS1.B25 %DEFINE js_trim_all_center JS1.B9 %DEFINE js_trim_down JS1.B29 %DEFINE js_trim_right JS1.B27 %DEFINE js_trim_left JS1.B31 %DEFINE cms_eleron CMS.A1 %DEFINE cms_elevator CMS.A2 %DEFINE a_trimmer_eleron A1 %DEFINE a_trimmer_elevator A2 %DEFINE b_trimmer_direction_elevator B5 %DEFINE b_trimmer_direction_eleron B4 script cms.A1=JS1.A1; cms.A2=JS1.A2; sequence wait(js_trim_all_center); a_trimmer_elevator = TRIMMER_CENTER; a_trimmer_eleron = TRIMMER_CENTER; endsequence sequence wait(js_trim_up); if(b_trimmer_direction_elevator) then a_trimmer_elevator = a_trimmer_elevator + TRIMMER_STEP; else if([0 < a_trimmer_elevator]) then a_trimmer_elevator = a_trimmer_elevator - TRIMMER_STEP; else b_trimmer_direction_elevator = TRUE; a_trimmer_elevator = TRIMMER_STEP; endif endif endsequence sequence wait(js_trim_down); if(b_trimmer_direction_elevator) then if([0 < a_trimmer_elevator]) then a_trimmer_elevator = a_trimmer_elevator - TRIMMER_STEP; else b_trimmer_direction_elevator = FALSE; a_trimmer_elevator = TRIMMER_STEP; endif else a_trimmer_elevator = a_trimmer_elevator + TRIMMER_STEP; endif endsequence if(b_trimmer_direction_elevator) then cms_elevator = js_elevator + a_trimmer_elevator; else cms_elevator = js_elevator - a_trimmer_elevator; endif sequence wait(js_trim_right); if(b_trimmer_direction_eleron) then a_trimmer_eleron = a_trimmer_eleron + TRIMMER_STEP; else if([0 < a_trimmer_eleron]) then a_trimmer_eleron = a_trimmer_eleron - TRIMMER_STEP; else b_trimmer_direction_eleron = TRUE; a_trimmer_eleron = TRIMMER_STEP; endif endif endsequence sequence wait(js_trim_left); if(b_trimmer_direction_eleron) then if([0 >a_trimmer_eleron]) then a_trimmer_eleron = a_trimmer_eleron - TRIMMER_STEP; else b_trimmer_direction_eleron = FALSE; a_trimmer_eleron = TRIMMER_STEP; endif else a_trimmer_eleron= a_trimmer_eleron + TRIMMER_STEP; endif endsequence if(b_trimmer_direction_eleron) then cms_eleron = js_eleron + a_trimmer_eleron; else cms_eleron = js_eleron - a_trimmer_eleron; endif endscript Долго парился, т.к. нуб в деле программирования. Где-то нашел скрипт и редактировал его под один джойстик. Может можно и проще скрипт написать. Кто врубается посмотрите.
ROSS_Wespe Опубликовано: 29 декабря 2013 Опубликовано: 29 декабря 2013 Докладываю. Кнопка в виде оси на тормоза ЛаГГ работает отлично. Нажимаются тормоза гораздо быстрей, чем при назначении кнопки на тормоз в игре. Притом интенсивность нажатия и отпускания можно регулировать не зависимо от игры.
=59=Moroka Опубликовано: 13 февраля 2014 Опубликовано: 13 февраля 2014 Реализация дополнительных осей на CH Pro Throttle Во первых, спасибо saatanaperkele, что поднял тему... Хочу поделиться парой наработок, которые могут оказаться кому-нибудь полезны... Речь пойдет об использовании Хатки, для имитации аналоговых осей. В БЗС имеется достаточно много параметров, управление которыми можно повесить на оси: триммера по трем осям, водо- и маслорадиаторы, шаг винта, смесь, капот (?), zoom... И на всю эту красоту у нас имеется плохо приспособленный для этих целей миниджой и... Хатки! Так вот, нашлась возможность использования Хатки... но не как 8-и позиционного переключателя, а в режиме энкодера! В этом варианте мы просто крутим кончик Хатки (не саму Хатку ) в одну или в другую сторону, и в каждой новой позиции аналоговая ось прибавляет или убавляет свое значение на величину заданного шага! Сценарий При реализации сценария мы будем ссылаться на позиции Хатки, обращаясь к зарезервированным за ней кнопкам от «B25» до «B32»(8 позиций) и «B24» (среднее положение). Введем аналоговую величину nv - индекс направления вращения, с возможными значениями -1, 0, +1 (соотв. против часовой, никуда не вращается, по часовой). Также понадобятся "флаги нажатий". Под них задействуем 8 логических переменных b25...b32. Удобно начать с директив %DEFINE axis cms.a4 // назовем удобно ось cms устройства. Потом будет достаточно вписать сюда ту ось, которую будете использовать Вы. %DEFINE Hut1 js2.b25 // назовем удобно позицию реального js устройства. %DEFINE Hut2 js2.b26 // Потом будет достаточно вписать сюда Свое устройство .... %DEFINE Hut8 js.2b32 // ... так для всех позиций Хатки %DEFINE step_ax4 8 // здесь назначим значение приращения для оси (например 8). Легко менять... %DEFINE nv a24 // индекс направление вращения (+1, 0, -1). Храним в переменной а24 а далее так: SEQUENCE // Секция сброса... WAIT( js1.b24 ); // сброс всех флагов, если Хат в центре b25 = false; b26 = false; b27 = false; b28 = false; b29 = false; b30 = false; b31 = false; b32 = false; ENDSEQUENCE // Секция обработка логики энкодера nv = 0 // сбрасываем nv в ноль! SEQUENCE // далее, на примере 2-й позиции Хатки... (b26) WAIT ( Hat2 ); // когда нажата 2-я поз. хатки b26 = true; // запоминаем флаг в соотв. лог. переменной IF ( b25 and b26 ) THEN // сравниваем с соседним значением "флаг нажатия слева". Если перед этим была нажата позиция "слева", то... nv = 1; // индекс направления вращения = 1 b25 = false; // сбрасываем предыдущий "флаг слева" ELSE IF (b26 and b27) THEN // если нет слева, то сравниваем с соседним значением "флаг нажатия справа". Если перед этим была нажата позиция "справа", то... nv = -1 nv = -1 b27 = false; // сбрасываем предыдущий флаг "справа" ENDIF ENDIF ENDSEQUENCE // SEQUENCE // Повторяем для следующего положения хатки (b27)... и т.д. до конечной позиции (b32) WAIT ( Hat3 ); // когда нажата 3-я поз. хатки... b27 = true; // и т.д. ........... ........... // Секция управления осью axis = axis + (nv * step_ax); // собственно меняем значение оси на, на величину шага (step_ax) // увеличивая (nv=1), уменьшая (nv=-1), или оставляя как есть (nv=0) IF ([axis > 255]) THEN // Удерживаем axis = 255; // полученное ELSE // значение IF ([axis < 0]) THEN // в рабочем axis = 0; // диапазоне... ENDIF ENDIF Последняя проверка значений обязательна! Дело в том, что, как удалось выяснить опытным путем, CMS использует для своей целочисленной арифметики 4-х байтные значения в диапазоне ~ от ‑2147483648 до 2147483647 (причем эти значения могут иметь и переменные a1, a2, и т.д. так и cms.a1, cms.a2, и т.д.). Ограничение же по диапазону (как и применение масштабирования) происходит уже "на выходе" CMS. Поэтому можно так накрутить наш энкодер, что будет непонятно где твоя ось... Осталось вместо одной оси объявить, например 4 (и 4 разных шага к ним). И используя 3 кнопки на ручки и последовательности SEQUENCE...WILE... в секции управления осью получаем ещё 4 управляемые оси на нашем CH Pro Throttle. Полный тест скрипта, чтобы не загромаждать пост, спрятан под спойлером... Осталось уточнить имена Ваших физических и cms устройств, (Внимание! Под спойлером в тексте есть отличия в обозначениях!) И настроить GUI....Удачи... Спойлер ЧЁЁРТТ НЕ МОГУ УБРАТЬ ПОДСПОЙЛЕР!!!! // Title: Хат-энкодер // script %DEFINE step_ax1 2 // значение прирощения для оси1 %DEFINE step_ax2 4 // значение прирощения для оси2 %DEFINE step_ax3 6 // значение прирощения для оси3 %DEFINE step_ax4 8 // значение прирощения для оси4 %DEFINE nv a24 // индекс направление вращения: (+1,0,-1) // SEQUENCE // Секция сброса... WAIT( js1.b24 );// сброс всех флагов, если Хат в центре b25 = false; b26 = false; b27 = false; b28 = false; b29 = false; b30 = false; b31 = false; b32 = false; ENDSEQUENCE // Секция обработка логики энкодера nv = 0; SEQUENCE // обработка по первому положению Хат: b25 WAIT ( js1.b25 ); b25 = true; IF ( b32 and b25 ) THEN nv = 1; b32 = false; ELSE IF (b25 and b26) THEN nv = -1; b26 = false; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WAIT ( js1.b26 ); b26 = true; IF ( b25 and b26 ) THEN nv = 1; b25 = false; ELSE IF (b26 and b27) THEN nv = -1; b27 = false; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WAIT ( js1.b27 ); b27 = true; IF ( b26 and b27 ) THEN nv = 1; b26 = false; ELSE IF (b27 and b28) THEN nv = -1; b28 = false; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WAIT ( js1.b28 ); b28 = true; IF ( b27 and b28 ) THEN nv = 1; b27 = false; ELSE IF (b28 and b29) THEN nv = -1; b29 = false; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WAIT ( js1.b29 ); b29 = true; IF ( b28 and b29 ) THEN nv = 1; b28 = false; ELSE IF (b29 and b30) THEN nv = -1; b30 = false; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WAIT ( js1.b30 ); b30 = true; IF ( b29 and b30 ) THEN nv = 1; b29 = false; ELSE IF (b30 and b31) THEN nv = -1; b31 = false; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WAIT ( js1.b31 ); b31 = true; IF ( b30 and b31 ) THEN nv = 1; b30 = false; ELSE IF (b31 and b32) THEN nv = -1; b32 = false; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WAIT ( js1.b32 ); b32 = true; IF ( b31 and b32 ) THEN nv = 1; b31 = false; ELSE IF (b32 and b25) THEN nv = -1; b25 = false; ENDIF ENDIF ENDSEQUENCE // Секция управления осями SEQUENCE WHILE (not (js1.b2 or js1.b3 or js1.b4));//ось при отпущенных кнопках cms.a1 = cms.a1 + (nv * step_ax1); IF ([cms.a1 > 255]) THEN cms.a1 = 255; ELSE IF ([cms.a1 < 0]) THEN cms.a1 = 0; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WHILE (js1.b2);// если нажата кнопка 2 cms.a2 = cms.a2 + (nv * step_ax2); IF ([cms.a2 > 255]) THEN cms.a2 = 255; ELSE IF ([cms.a2 < 0]) THEN cms.a2 = 0; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WHILE (js1.b3);// если нажата кнопка 3 cms.a3 = cms.a3 + (nv * step_ax3); IF ([cms.a3 > 255]) THEN cms.a3 = 255; ELSE IF ([cms.a3 < 0]) THEN cms.a3 = 0; ENDIF ENDIF ENDSEQUENCE // SEQUENCE WHILE (js1.b4);// если нажата кнопка 4 cms.a4 = cms.a4 + (nv * step_ax4); IF ([cms.a4 > 255]) THEN cms.a4 = 255; ELSE IF ([cms.a4 < 0]) THEN cms.a4 = 0; ENDIF ENDIF ENDSEQUENCE endScript 1
NobbyNobbs Опубликовано: 13 февраля 2014 Автор Опубликовано: 13 февраля 2014 прикольно, но писать такое не для ленивых я ось шага винта на кнопки руда повесил, а радиаторы на микростик (отклонение от центра вверх/вниз сделал как две кнопки). и если с шагом винта мне все нравится, то для радиаторов все равно квадрант хочу (сайтековский, как самый дешевый), чтобы всегда было видно в каком положении рычаги - в кабине смотреть на них неудобно. зы. а капот это у фок и прочих лавок с воздушным охлаждением, то есть та же ось, что и водорадиатор по идее.
=59=Moroka Опубликовано: 13 февраля 2014 Опубликовано: 13 февраля 2014 (изменено) прикольно, но писать такое не для ленивых я ось шага винта на кнопки руда повесил, а радиаторы на микростик (отклонение от центра вверх/вниз сделал как две кнопки). и если с шагом винта мне все нравится, то для радиаторов все равно квадрант хочу (сайтековский, как самый дешевый), чтобы всегда было видно в каком положении рычаги - в кабине смотреть на них неудобно. зы. а капот это у фок и прочих лавок с воздушным охлаждением, то есть та же ось, что и водорадиатор по идее. Там не так страшно писать... копипастом наращиваем Я у себя zoom повесил... Изменено 13 февраля 2014 пользователем =J13=Moroka
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас