Jump to content

GlovePIE за всё хорошее, против всего плохого


Recommended Posts

Вот собственно GlovePIE и PPJoy. первая в установке не нуждается, достаточно вывести экзешник на рабочий стол и с него запускать программу. PPJoy в свою очередь нуждается в установке и в виндоус 7 и выше, может работать только в тестовом режиме. К слову, в котором работает без проблем и ущерба. При установке PPJoy, рекомендую оси, для удобства ставить в такой конфигурации, последовательность осей X, Y, Z, RX, RY, RZ, удобна для работы с ними, а две последние оси, в том виде в каком даёт установщик. 276974472__2024-05-18_173442185.thumb.png.4059fc5edab52c2e0e128f66f6224f19.png  Количество кнопок ставим 16 и одну хатку POV1, что даст нам ещё 8 кнопок. Количество джойстиков может быть больше одного, я ставил два, ноPPJoySetup-0.8.4.6 скоро убедился, что одного вполне достаточно. Кроме того, что с одним проще работать, так проще и конфигурировать игровые устройства.GlovePIEWithEmotiv043

Документ.rtf

Link to post
Share on other sites
 
  • Replies 60
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

Однако, здравствуйте!(с) Начну издалека. Да здравствует Свобода, Равенство и Братство!  Свобода.  Это когда вирпил не связан с ограничениями (финансовыми, временными, пряморукостью и т.д.,

// Тумблер ON/OF CapsLock CapsLock = Mouse1.Button3 if (pressed(PPJoy1.Digital0)) { Mouse.CursorPosX = screen.Width/2 Mouse.CursorPosY = screen.Height /2 Mouse.Swallow = true } if (re

Управление разными осями одним устройством.   Управление виртуальными осями при помощи одной реальной. Например у вас есть Джойстик с одной осью управления тягой, т.е. обычный 4-х канал

Posted Images

 
  • 2 weeks later...

Управление разными осями одним устройством.

 

Управление виртуальными осями при помощи одной реальной.

Например у вас есть Джойстик с одной осью управления тягой, т.е. обычный 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
Если использовать этот скрипт, то многострочный комментарий между
метками /* и */ можно удалить, что бы не захламлять скрипт. Есть ещё фишка для включения впрыска форсажных смесей для немецких самолётов, в том смысле, что бы не спалить мотор, но об этом следующий раз.

  • Upvote 1
Link to post
Share on other sites
 

Продолжим.

 Добавим автоматическое включение впрыска форсажной смеси. Впрыск этот нельзя включать и выключать при тяге более 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% , будет последовательно включатся и выключаться впрыск, можно конечно сделать тоже самое, только с ручным включением, но так проще, к тому же режим впрыска отражается на мониторе, а для того, что бы повторно включить его, после сброса в ноль например, (или выключить), нужно всего одно короткое движение назад. 

Link to post
Share on other sites
 

Опечатка в описании, включает впрыск кнопка PPJoy1.Digital4  

В скрипте правильно и на неё назначать форсаж.

Link to post
Share on other sites
 

Кстати, таким же макаром, можно управлять и триммером руля высоты. Абсолютно также выделить кнопку передающую на РУД управление триммером. Тогда при её нажатии, РУД будет управлять триммером, а при отпускании триммер будет зафиксирован в нужном положении. Соответственно в эту часть скрипта добавить эту кнопку в перечень управляющих кнопок. Например: было

 // Управление тягой
 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

 

  • Upvote 1
Link to post
Share on other sites
 

        Пример использования модовых кнопок.
 Использование модовых (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 = “непрерывный огонь.”
}
конец скрипта

Link to post
Share on other sites
 
В 13.05.2024 в 14:34, Kap сказал:

Продолжаю.

 // Управление обзором

 // Взгляд через прицел при нажатии ЛКМ

Правильно было бы: "...при нажатии ПКМ", исправьте если сочтёте нужным, т.е. при нажатии правой кнопки мыши и её удержании более 0,1сек, будет использована функция взгляда через прицел. При отпускании кнопки взгляд возвращается в исходное состояние. При быстром клике, когда время нажатия меньше 0,1сек, функция будет работать как тумблер, переключая взгляд в одно из двух состояний. Для того что бы работало, надо назначить в Панели Управления (в дальнейшем ПУ), на команду "смотреть через прицел" кнопку PPJoy1.Digital1, для чего при включённом скрипте, напротив нужной команды кликнуть правой кнопкой мыши, либо при помощи простенького скрипта для назначения кнопок PPJoy1.Digital, который приведу в конце поста.

 // Плавное изменение угла обзора при нажатии ПКМ

Здесь тоже перепутана кнопка в названии, на работоспособность скрипта тоже никак не влияет, но если есть желание надо переименовать в: "...при нажатии ЛКМ". По сути левая кнопка мыши управляет плавным приближение взгляда к прицелу. Используется всего два крайних положения, поскольку считаю этого более чем достаточно и для стрельбы, и для удобного обзора. Можно было бы и не делать плавное изменение, но в таком случае глазам не комфортно мгновенно перестраиваться под другой угол обзора. Для того что бы работало, надо в ПУ  на команды  "Увеличить угол зрения" поставить NumPad+, а   "Уменьшить угол зрения" поставить NumPad-.  В принципе работает подобно взгляду через прицел. При кратковременном нажатии как тумблер, при нажатии с удержанием, приближает взгляд, при отпускании удаляет. Кроме того, при нажатии и удержании взгляд фиксируется по центру, обзор мышью  восстанавливается при отпускании кнопки. Очень удобно, чередуя кратко временные нажатия можно осматриваться как с приближённым к прицелу взглядом, так и с удалённым или фиксировать взгляд в двух вариантах приближения. 

 

Тут получается,если нажать ЛКМ то взгляд плавно смотрит через прицел.ЗдОрово,но не всегда удобно.Лучше будет по нажатию ЛКМ плавно приблизить то место куда направлен взгляд.Как такое реализовать?

Edited by morgenmuffel
Link to post
Share on other sites
 

Просто быстро нажми и отпусти левою кнопку, взгляд приблизится, но будет поворачиваться по желанию, так же переключается и обратно. Т.е. если время клика меньше указанного в скрипте, то взгляд отрабатывает только в сторону: увеличения, либо уменьшения, естественно после клика ЛКМ должна быть отпущена. Время кстати можно самому корректировать в этом месте:

 // Инициализация изменения угла обзора
 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

Link to post
Share on other sites
 

Для сравнения два коротких видео: с твоим скриптом и с моим.Да,когда взгляд приближен, можно в таком положении повернуть голову в сторону.Но как только повторно жмешь,то взгляд всегда смотрит в прицел.С моим же вариантом взгляд остается на той же точке, куда смотрел.У меня только не хватает плавности, но так же на одной кнопке мышки и на удержании ее.Кстати "удержанием" перестал пользоваться; Из за того,что долго удерживаешь сокращается ресурс микриков кнопки мышки.

1.с твоим скриптом

2.с моим скриптом

 

Link to post
Share on other sites
 

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

// Центровка осей при нажатии ЛКМ
 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
}

И всё будет как ты хочешь.

 

  • Like 1
Link to post
Share on other sites
 

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...