Kap 12 Author Report Share Posted May 18 Вот собственно GlovePIE и PPJoy. первая в установке не нуждается, достаточно вывести экзешник на рабочий стол и с него запускать программу. PPJoy в свою очередь нуждается в установке и в виндоус 7 и выше, может работать только в тестовом режиме. К слову, в котором работает без проблем и ущерба. При установке PPJoy, рекомендую оси, для удобства ставить в такой конфигурации, последовательность осей X, Y, Z, RX, RY, RZ, удобна для работы с ними, а две последние оси, в том виде в каком даёт установщик. Количество кнопок ставим 16 и одну хатку POV1, что даст нам ещё 8 кнопок. Количество джойстиков может быть больше одного, я ставил два, ноPPJoySetup-0.8.4.6 скоро убедился, что одного вполне достаточно. Кроме того, что с одним проще работать, так проще и конфигурировать игровые устройства.GlovePIEWithEmotiv043 Документ.rtf Quote Link to post Share on other sites
Kap 12 Author Report Share Posted May 18 PPJoySetup-0.8.4.6.zipGlovePIEWithEmotiv043.zip Что то не то загрузилось, попробую заархивировать. Quote Link to post Share on other sites
Kap 12 Author Report Share Posted May 28 Управление разными осями одним устройством. Управление виртуальными осями при помощи одной реальной. Например у вас есть Джойстик с одной осью управления тягой, т.е. обычный 4-х канальный джой : ТМ1600, Лоджитек и т.п. Три оси управляют самолётом и одна тягой. Однако хочется ещё управлять шагом, радиатором(и), качеством смеси. Словом, ещё несколькими осями дополнительно. С применением GlovePIE и PPJoy это достаточно просто. Будем считать, что обе эти программы у вас установлены, тогда скопируем вот такой простенький скрипт, назначим в корне игры в папке Users>settings.ini необходимые оси: JoystickDevice1 AXE_RZ=radiator JoystickDevice1 AXE_RY=power JoystickDevice1 AXE_RX=pitch Ограничимся пока з-мя осями, тягой, шагом и радиатором, ставим номер под которым будет числиться ваш PPJoy, его можно увидеть в стандартной виндовской настройке игровых устройств. По расчёту сверху вниз, причём для иловского конфига верхний джой будет иметь нулевой номер, а для скрипта первый. Предположим, что физический джойстик вверху, а виртуальный внизу, тогда их номера будут 0 и 1 соответственно. СКРИПТ: // Управление тягой /* если не нажаты кнопки 1-го джойстика за №3 и№4 ось Joystick1.Z управляет осью PPJoy1.analog4 на которую назначена Тяга */ if (Joystick1.Button3 and Joystick1.Button4 = false) { PPJoy1.analog4 = Joystick1.Z } // Управление шагом /* если нажата кнопка 1-го джойстика за №3, то ось Joystick1.Z управляет осью PPJoy1.analog3 на которую назначен Шаг Винта */ if (Joystick1.Button3) { PPJoy1.analog3 = Joystick1.Z } // Переключение управления шагом винта: ручное-авто /* Полезно на кнопку включающую управление шагом, повесить и переключение шага ручной-авто, двойной клик будет переключать режим */ if (DoubleClicked(Joystick1.Button3)) { PPJoy1.Digital6 = true wait 0.1 PPJoy1.Digital6 = false } // Управление радиатором /* если нажата кнопка 1-го джойстика за №4, то ось Joystick1.Z управляет осью PPJoy1.analog5 на которую назначен Радиатор */ if (Joystick1.Button4) { PPJoy1.analog5 = Joystick1.Z } // Переключение управления радиатором: ручное-авто /* Полезно на кнопку включающую управление радиатором, повесить и переключение управления ручной-авто, двойной клик будет переключать режим, по сути двойной клик это просто перключение радиатора, но при открытом на 100% радиаторе, он будет переводить его в режим авто */ if (DoubleClicked(Joystick1.Button4)) { PPJoy1.Digital5 = true wait 0.1 PPJoy1.Digital5 = false } //Конец скрипта Само собой кнопки PPJoy1.Digital5 и PPJoy1.Digital6 можно заменить парными командами с клавы, например так (A)vto(R)adiator или (A)vto(S)tep: if (DoubleClicked(Joystick1.Button4)) { (Key.A+Key.R) = true wait 0.1 (Key.A+Key.R) = false } Да и кнопки джойстика Joystick1.Button можно заменить на кнопки клавы если воспользоваться предыдущими материалами, например так: if (DoubleClicked(Key.4)) { (Key.A+Key.S) = true wait 0.1 (Key.A+Key.S) = false } Естественно в ПУ назначить на команды переключения шага и радиатора соответствующие выбранные кнопки. Если направления движения осей не совпадают, или не нравятся, их можно инверировать прибавлением знака минус было: PPJoy1.analog5 = Joystick1.Z стало: PPJoy1.analog5 = -Joystick1.Z Если использовать этот скрипт, то многострочный комментарий между метками /* и */ можно удалить, что бы не захламлять скрипт. Есть ещё фишка для включения впрыска форсажных смесей для немецких самолётов, в том смысле, что бы не спалить мотор, но об этом следующий раз. 1 Quote Link to post Share on other sites
Kap 12 Author Report Share Posted May 29 Продолжим. Добавим автоматическое включение впрыска форсажной смеси. Впрыск этот нельзя включать и выключать при тяге более 70% (по памяти), мотор быстро выходит из строя. Что бы этого наверняка не произошло, изменим предыдущий скрипт, добавив следующее: var.int = round(MapRange(PPJoy1.analog4, -1, 1, 0, 110)) это команда разбивки оси тяги от 0 до 110 if (INRANGE(var.int, 00, 00)) { если тяга равна нулю PPJoy1.Digital6 = true тогда программа нажимаем и отпускает кнопку 6 wait 0.1 //триггер форсажа PPJoy1.Digital6 = false Соответственно включение форсажа в ПУ назначаем на неё или другие варианты по вкусу.(см. выше) вот весь скрипт: // Управление тягой if (Joystick1.Button3 and Joystick1.Button4 = false) { PPJoy1.analog4 = Joystick1.Z } // Управление форсажем var.int = round(MapRange(PPJoy1.analog4, -1, 1, 0, 110)) if (INRANGE(var.int, 00, 00)) { PPJoy1.Digital4 = true wait 0.1 PPJoy1.Digital4 = false } // Управление шагом if (Joystick1.Button3) { PPJoy1.analog3 = Joystick1.Z } // Переключение управления шагом винта: ручное-авто if (DoubleClicked(Joystick1.Button3)) { PPJoy1.Digital6 = true wait 0.1 PPJoy1.Digital6 = false } // Управление радиатором if (Joystick1.Button4) { PPJoy1.analog5 = Joystick1.Z } // Переключение управления радиатором: ручное-авто if (DoubleClicked(Joystick1.Button4)) { PPJoy1.Digital5 = true wait 0.1 PPJoy1.Digital5 = false } конец скрипта Принцип управления следующий: при сбросе тяги в 0% , будет последовательно включатся и выключаться впрыск, можно конечно сделать тоже самое, только с ручным включением, но так проще, к тому же режим впрыска отражается на мониторе, а для того, что бы повторно включить его, после сброса в ноль например, (или выключить), нужно всего одно короткое движение назад. Quote Link to post Share on other sites
Kap 12 Author Report Share Posted May 29 Опечатка в описании, включает впрыск кнопка PPJoy1.Digital4 В скрипте правильно и на неё назначать форсаж. Quote Link to post Share on other sites
Kap 12 Author Report Share Posted May 29 Кстати, таким же макаром, можно управлять и триммером руля высоты. Абсолютно также выделить кнопку передающую на РУД управление триммером. Тогда при её нажатии, РУД будет управлять триммером, а при отпускании триммер будет зафиксирован в нужном положении. Соответственно в эту часть скрипта добавить эту кнопку в перечень управляющих кнопок. Например: было // Управление тягой if (Joystick1.Button3 and Joystick1.Button4 = false) { PPJoy1.analog4 = Joystick1.Z } стало // Управление тягой if (Joystick1.Button3 and Joystick1.Button4 and Joystick1.Button5 =false) { PPJoy1.analog4 = Joystick1.Z } Тогда в блоке скрипта где прописаны команда по аэродинамическому управлению, а их именно так желательно составлять, т.е. поблочно, можно написать так (предположим триммер тангажа у нас PPJoy1.analog1: // Управление триммером тангажа if (Joystick1.Button5) { PPJoy1.analog5 = -Joystick1.Z } Т.е. нажали энную кнопку джойстика и управляем триммером РВ. Отпустили кнопку триммер остался в новом положении. Уточнить знак перед осью -Joystick1.Z т.е. если надо то снять "-". Можно добавить двойной клик той же кнопкой и триммер встанет в нейтральное положение, например: if (DoubleClicked(Joystick1.Button5)) { PPJoy1.analog1 = 0.00 } В профиле естественно добавить ось триммера РВ. JoystickDevice1 AXE_Y=trimelevator 1 Quote Link to post Share on other sites
Kap 12 Author Report Share Posted June 4 Пример использования модовых кнопок. Использование модовых (Mode) состояний (режимов), является стандартным в программном обеспечении, идущим в комплекте с джойстиком. Во всяком случае, это используется в Saitek Х52, CН, на джойстике присутствует специальный переключатель и цветовой индикатор модовых режимов. При переключении появляется возможность одну и ту же кнопку (группу кнопок), назначать на выполнение разных команд. В вышеупомянутых джойстиках три модовых режима, причём у Saitek можно включить любой по выбору, а у СН - последовательными переключениями, что менее удобно. При использовании модов необходимо пользоваться либо графическим интерфейсом, либо писать скрипты в том же софте. Зачастую, эти профили глючат, слетают при обновлениях, одним словом не надёжны и капризны. В тоже время правильно написанный и отлаженный скрипт для GlovePIE, никогда не подведёт, и всегда работает как часы. Для примера, покажу скрипт GlovePIE, для использования модовых режимов джойстика СН. У этого джоя достаточно кнопок (4 шт) и хаток (3 х 4-х позиционных и одна 8-ми). Из этого числа, одна кнопка (№3), является переключателем модовых режимов, последовательно включая кнопки джойстика №17; №18; №19. 8-ми позиционная хатка управляет процессами на двигателе т.е.: смесь, компрессор, магнето и т.д. и поэтому не модифицируется. Одна 4-х позиционная хатка управляет закрылками (выпуск, уборка, автомат, вторая такая же, управляет видами, обе они тоже не модифицируются. Таким образом модифицируется только одна, самая удобная под большой палец, 4-х позиционная хатка. Вот, что она делает: при включении скрипта, устанавливается нулевой мод (Mode = 0) при котором хатка управляет левым, правым и обоими одновременно, тормозами. Очень удобно при рулёжке, хоть тормозные оси и имеют всего два значения: полностью отпущено, полностью зажато. При включении первого мода (Mode = 1) (нажатием кнопки джоя №3), хатка является селектором ствольного оружия, т.е. переключает использование оружия1 или оружия2, а оружию 1+2, позволяет вести непрерывный огонь, или фиксированная очередь, (длиной о,25сек, например). При очередном нажатии кнопки джоя №3, включится следующий (второй) мод (Mode = 2). Тогда хатка будет управлять оружием №3, оружием №4, режимами пуска ракет и сбросом подвесного вооружения. Следующее нажатие на кнопку№3, опять включает Mode = 0 и т.д. Важно то, что ни включение первого мода, ни нажатие кнопок хатки, непосредственно оружием 1 или 2 не управляет, они только выбирают оружие или режим пользования им, а непосредственно оружием, управляет гашетка: кнопка джоя №1. При включённом Mode = 2, оружием 3 и 4 а также режимом пуска ракет и сбросом ПБ, управляет хатка, а гашетка продолжит управлять оружием включенным в Mode = 1. Переключение модов и выбор ствольного оружия будут сопровождаться голосовым сообщением, что по моему, более удобно, чем цветовая индикация. Приведенный скрипт, является фрагментом и отдельно не тестировался. Если решите воспользоваться, то номера кнопок реальных и виртуальных джоев и осей, поставить свои. Если надо могу выложить полный скрипт в виде архива. Списки осей и кнопок на работу скрипта не влияют и собственно для этого не нужны. Тем не менее я всегда создаю такие списки для удобства подгонки и отладки. Скрипт *********************************************************** // Список осей *********************************************************** //PPJoy1.Analog7 Тормоз правый AXE_V //PPJoy1.Analog6 Тормоз левый AXE_U //PPJoy1.analog5 Закрылки AXE_RZ //PPJoy1.analog4 Радиатор AXE_RY //PPJoy1.analog3 Тяга AXE_RX //PPJoy1.analog2 Шаг Винта AXE_Z //PPJoy1.analog1 Триммер Тангажа AXE_Y //PPJoy1.Analog0 Руддер AXE_X *********************************************************** // Список кнопок *********************************************************** //PPJoy1.Digital0 = взгляд через прицел //PPJoy1.Digital1 = приближение взгляда //PPJoy1.Digital2 = визуализация оси тангажа //PPJoy1.Digital3 = включатель оружия 1+2 //PPJoy1.Digital4 = включатель оружия 2 //PPJoy1.Digital5 = переключатель режимов огня //PPJoy1.Digital6 = включатель оружия 1 //PPJoy1.Digital7 = гашетка //PPJoy1.Digital8 = кран шасси //PPJoy1.Digital9 = колодки //PPJoy1.Digital10 = фиксация дутика //PPJoy1.Digital11 = тормоз правый //PPJoy1.Digital12 = тормоз левый+правый //PPJoy1.Digital13 = тормоз левый //PPJoy1.Digital14 = включение 1-го авторежима закрылков //PPJoy1.Digital15 = включение 2-го авторежима закрылков //PPJoy1.Digital16 = оружие 3 //PPJoy1.Digital17 = режим пуска РС //PPJoy1.Digital18 = оружие 4 //PPJoy1.Digital19 = сброс ПБ // Переключатель модовых кнопок if (Joystick1.Button17 = 1) then var.Mode = 0; if (Joystick1.Button18 = 1) then var.Mode = 1; if (Joystick1.Button19 = 1) then var.Mode = 2; // Присвоение кнопок виртуального джойстика if (var.Mode = 0) then begin speech.sam.text = “нулевой режим.” PPJoy1.Digital8 = Joystick1.Button1 PPJoy1.Digital9 = Joystick1.Button4 PPJoy1.Digital10 = Joystick1.Button13 PPJoy1.Digital11 = Joystick1.Button14 PPJoy1.Digital12 = Joystick1.Button15 PPJoy1.Digital13 = Joystick1.Button16 } if (var.Mode = 1) then begin speech.sam.text = “первый режим.” if (Joystick1.Button13){ PPJoy1.Digital4 = false PPJoy1.Digital6 = false PPJoy1.Digital3 = true } if (Joystick1.Button14){ PPJoy1.Digital3 = false PPJoy1.Digital6 = false PPJoy1.Digital4 = true } if (Joystick1.Button16){ PPJoy1.Digital4 = false PPJoy1.Digital3 = false PPJoy1.Digital6 = true } if Clicked(Joystick1.Button15){ toggle(PPJoy1.Digital5) } } if (var.Mode = 2) then begin speech.sam.text = “второй режим.” PPJoy1.Digital3 = false PPJoy1.Digital4 = false PPJoy1.Digital5 = false PPJoy1.Digital6 = false PPJoy1.Digital16 = Joystick1.Button13 PPJoy1.Digital17 = Joystick1.Button14 PPJoy1.Digital18 = Joystick1.Button15 PPJoy1.Digital19 = Joystick1.Button16 } *********************************************************** // Управление механизацией *********************************************************** // Управление тормозами if PPJoy1.Digital11 or PPJoy1.Digital12 == 1 { PPJoy1.analog6 = 1 }else{ PPJoy1.analog6 = -1 } if PPJoy1.Digital13 or PPJoy1.Digital12 == 1 { PPJoy1.analog7 = 1 }else{ PPJoy1.analog7 = -1 } *********************************************************** // Управление вооружением *********************************************************** if (PPJoy1.Digital3){ Key.W+Key.3 = PPJoy1.Digital7 } if (PPJoy1.Digital4){ Key.W+Key.2 = PPJoy1.Digital7 } if (PPJoy1.Digital6){ Key.W+Key.1 = PPJoy1.Digital7 } if (PPJoy1.Digital5 == 1) { if (pressed(Joystick1.Button1)) { PPJoy1.Digital7 = true wait (200ms) PPJoy1.Digital7 = false } }else{ PPJoy1.Digital7 = Joystick1.Button1 } if (pressed(PPJoy1.Digital5)) { speech.mary.text = “фиксированная очередь.” } if (released(PPJoy1.Digital5)) { speech.mary.text = “непрерывный огонь.” } конец скрипта Quote Link to post Share on other sites
morgenmuffel 0 Report Share Posted June 5 (edited) В 13.05.2024 в 14:34, Kap сказал: Продолжаю. // Управление обзором // Взгляд через прицел при нажатии ЛКМ Правильно было бы: "...при нажатии ПКМ", исправьте если сочтёте нужным, т.е. при нажатии правой кнопки мыши и её удержании более 0,1сек, будет использована функция взгляда через прицел. При отпускании кнопки взгляд возвращается в исходное состояние. При быстром клике, когда время нажатия меньше 0,1сек, функция будет работать как тумблер, переключая взгляд в одно из двух состояний. Для того что бы работало, надо назначить в Панели Управления (в дальнейшем ПУ), на команду "смотреть через прицел" кнопку PPJoy1.Digital1, для чего при включённом скрипте, напротив нужной команды кликнуть правой кнопкой мыши, либо при помощи простенького скрипта для назначения кнопок PPJoy1.Digital, который приведу в конце поста. // Плавное изменение угла обзора при нажатии ПКМ Здесь тоже перепутана кнопка в названии, на работоспособность скрипта тоже никак не влияет, но если есть желание надо переименовать в: "...при нажатии ЛКМ". По сути левая кнопка мыши управляет плавным приближение взгляда к прицелу. Используется всего два крайних положения, поскольку считаю этого более чем достаточно и для стрельбы, и для удобного обзора. Можно было бы и не делать плавное изменение, но в таком случае глазам не комфортно мгновенно перестраиваться под другой угол обзора. Для того что бы работало, надо в ПУ на команды "Увеличить угол зрения" поставить NumPad+, а "Уменьшить угол зрения" поставить NumPad-. В принципе работает подобно взгляду через прицел. При кратковременном нажатии как тумблер, при нажатии с удержанием, приближает взгляд, при отпускании удаляет. Кроме того, при нажатии и удержании взгляд фиксируется по центру, обзор мышью восстанавливается при отпускании кнопки. Очень удобно, чередуя кратко временные нажатия можно осматриваться как с приближённым к прицелу взглядом, так и с удалённым или фиксировать взгляд в двух вариантах приближения. Тут получается,если нажать ЛКМ то взгляд плавно смотрит через прицел.ЗдОрово,но не всегда удобно.Лучше будет по нажатию ЛКМ плавно приблизить то место куда направлен взгляд.Как такое реализовать? Edited June 5 by morgenmuffel Quote Link to post Share on other sites
Kap 12 Author Report Share Posted June 5 Просто быстро нажми и отпусти левою кнопку, взгляд приблизится, но будет поворачиваться по желанию, так же переключается и обратно. Т.е. если время клика меньше указанного в скрипте, то взгляд отрабатывает только в сторону: увеличения, либо уменьшения, естественно после клика ЛКМ должна быть отпущена. Время кстати можно самому корректировать в этом месте: // Инициализация изменения угла обзора if (pressed(Mouse1.Button1)) { PPJoy1.Digital2 = true wait 0.2 //время можно изменить PPJoy1.Digital2 = false } if (released(Mouse1.Button1)) { PPJoy1.Digital2 = true wait 0.2 // то же PPJoy1.Digital2 = false } Quote Link to post Share on other sites
morgenmuffel 0 Report Share Posted June 6 Для сравнения два коротких видео: с твоим скриптом и с моим.Да,когда взгляд приближен, можно в таком положении повернуть голову в сторону.Но как только повторно жмешь,то взгляд всегда смотрит в прицел.С моим же вариантом взгляд остается на той же точке, куда смотрел.У меня только не хватает плавности, но так же на одной кнопке мышки и на удержании ее.Кстати "удержанием" перестал пользоваться; Из за того,что долго удерживаешь сокращается ресурс микриков кнопки мышки. 1.с твоим скриптом 2.с моим скриптом Quote Link to post Share on other sites
Kap 12 Author Report Share Posted June 6 Да собственно не проблем, если не нужно принудительно возвращать взгляд в центр, а при обзоре мышкой это так, тогда убираем этот блок, (или назначаем другую кнопку): // Центровка осей при нажатии ЛКМ if (Mouse1.Button1) { var.M1_X = 0 var.M1_Y = 0 } Далее, если приближение организовать без удержания кнопки, т.е. нажал - приблизил, ещё раз нажал - удалил тогда этот блок переписываем. Вместо PPJoy1.Digital2 вписываем Mouse1.Button1 вот так: // Плавное изменение угла обзора при нажатии ЛКМ if pressed(Mouse1.Button1) then var.zout = not var.zout if var.press < 18 and var.zout = true Key.Numpadminus = true Key.Numpadminus = false var.press += 1 wait 0.01 elseif var.press >0 and var.zout = false if var.press > 18 then var.press = 18 Key.Numpadplus = true Key.Numpadplus = false var.press -= 1 wait 0.01 endif Эту часть вообще убираем: // Инициализация изменения угла обзора if (pressed(Mouse1.Button1)) { PPJoy1.Digital2 = true wait 0.2 PPJoy1.Digital2 = false } if (released(Mouse1.Button1)) { PPJoy1.Digital2 = true wait 0.2 PPJoy1.Digital2 = false } И всё будет как ты хочешь. 1 Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.