Jump to content

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


Recommended Posts

// Сигнализация оптимального положения РВ (Звуковая загрузка)

var.int = round(MapRange(PPJoy1.analog1, -1, 1, 0, 200)) // разбивка оси от 0 до 200 у.е.
if ( INRANGE (var.int, 140, 160 ) ) { // если РУС находится в диапазоне от 140 до 160 то:
playsound "d:\sounds\Windows XP Balloon" // проигрывать звуковой сигнал
wait(500 ms)  // временной интервал между проигрываниями
}

Сигнализация оптимального положения РВ (Звуковая загрузка).
Для того, что бы пользоваться этой функцией, необходимо представиить ось тангажа, как некий диапазон цифр от 0 до 200, (подобная операция будет использоваться довольно часто).
Из расчёта:
РУС полностью от себя - значение 0;
РУС по центру - значение 100;
РУС полностью на себя - значение 200.
Нас интерисует 40% - 60% хода ручки, что будет соответствовать значениям 140 - 160, что и прописываем командой:
if ( INRANGE (var.int, 140, 160 ) ) 
Когда РУС будет находиться в этом диапазоне будет проигрываться (playsound)  звуковой файл "Windows XP Balloon" находящийся по адресу d:\sounds\.
Звуковой фаил, это обычные звуки Виндоус хранящиеся в c:\WINDOWS\Media там можно выбрать по вкусу, я их скопировал в папку d:\sounds\ для удобства.
 

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

//Управление триммером элеронов,срабатывает при крайних положениях РУС по крену

var.int = round(MapRange(PPJoy1.analog0, -1, 1, 0, 100)) // разметка оси крена (PPJoy1.analog0) от 0 до 100
if ( INRANGE (var.int, 00, 05 ) ) { // если РУС в крайнем левом положении то:
PPJoy2.analog0 =  -1.00 // ось триммера элеронов имеет значение 100% влево

}
if ( INRANGE (var.int, 10, 90 ) ) { // Если РУС не находится в крайних левом и правом положениях то:
PPJoy2.analog0 =  0.00 // ось триммера имеет значение 0%

}
if ( INRANGE (var.int, 95, 100 ) ) { // если РУС в крайнем правом положении то:
PPJoy2.analog0 =  1.00 // ось триммера элеронов имеет значение 100% вправо
  
}

Управление триммером элеронов.

Организация схожа с предыдущей, разница лишь в том, что когда РУС находится в нужном диапазоне.

То на оси виртуального джоя №2 (обратите внимание осями триммеров, управляют оси второго виртуального джоя), подаётся прямая команда , на пример:

PPJoy2.analog0 =  -1.00  заставляющая ось триммера элеронов принять значение 100% влево.

Аналогично действуют и команды "триммер вправо 100%) и " триммер по центру".

Триммеры РН и РВ аналогичны, только триммер РВ действует в противофазе с РВ, т.е. РВ на себя ( имеет значение 1.0), а триммер РВ в противоположную сторону (PPJoy2.analog1 =  -1.00).

 

Link to post
Share on other sites
 
//Управление триммером элеронов,срабатывает при крайних положениях РУС по крену

var.int = round(MapRange(PPJoy1.analog0, -1, 1, 0, 100)) // разметка оси крена (PPJoy1.analog0) от 0 до 100
if ( INRANGE (var.int, 00, 05 ) ) { // если РУС в крайнем левом положении то:
PPJoy2.analog0 =  -1.00 // ось триммера элеронов имеет значение 100% влево

}
if ( INRANGE (var.int, 10, 90 ) ) { // Если РУС не находится в крайних левом и правом положениях то:
PPJoy2.analog0 =  0.00 // ось триммера имеет значение 0%

}
if ( INRANGE (var.int, 95, 100 ) ) { // если РУС в крайнем правом положении то:
PPJoy2.analog0 =  1.00 // ось триммера элеронов имеет значение 100% вправо
  
}

Управление триммером элеронов.

Организация схожа с предыдущей, разница лишь в том, что когда РУС находится в нужном диапазоне.

То на оси виртуального джоя №2 (обратите внимание осями триммеров, управляют оси второго виртуального джоя), подаётся прямая команда , на пример:

PPJoy2.analog0 =  -1.00  заставляющая ось триммера элеронов принять значение 100% влево.

Аналогично действуют и команды "триммер вправо 100%) и " триммер по центру".

Триммеры РН и РВ аналогичны, только триммер РВ действует в противофазе с РВ, т.е. РВ на себя ( имеет значение 1.0), а триммер РВ в противоположную сторону (PPJoy2.analog1 =  -1.00).

 

Link to post
Share on other sites
 

Что то у меня со связью,  то сообщения пропадают безследно, то дублируются.

Может модератор сотрёт дубль.

Link to post
Share on other sites
 
/* Управление приближением взгляда, взгляда через прицел
 и изменение кривых отклика при приближением взгляда*/

// Управление приближением взгляда всё работает при нажатии кнопки джоя № 7

 Key.Z = Pressed(PPJoy1.Digital4) /* назначить в ПУ кнопку "Z"
 на прильнуть к прицелу */
 Key.X  = Released(PPJoy1.Digital4) /* назначить в ПУ кнопку "X"
 на широкоугольный обзор */

}

// переключатель кривых отклика
if ( released(PPJoy1.Digital4) )     { // если отпущена то
PPJoy1.analog0 = Joystick1.X    // Ось Х кривые отклика по 100%
PPJoy1.analog1 = Joystick1.Y    // Ось Y кривые отклика по 100%
PPJoy1.analog2 = Joystick1.Z   // Ось Z кривые отклика по 100%
}
if (PPJoy1.Digital4 == 1 )     {                         // если нажата то
PPJoy1.analog0 = Joystick1.X /2   // Ось Х кривые отклика по 50%
PPJoy1.analog1 = Joystick1.Y /2   // Ось Y кривые отклика по 50%
PPJoy1.analog2 = Joystick1.Z /2  // Ось Z кривые отклика по 50%
}

// взгляд через прицел
if ( released( Joystick1.Button7) )     { /*если отпущена кнопка джоя № 7
переключается функция "смотреть чкрез прицел"
в ПУ назначить на неё клавишу NUMPAD8 */
    Key.NUMPAD8 = true
    wait(50 ms)    //время в течении которогобудет нажата клавиша
    Key.NUMPAD8 = false
}



// переключатель(быстрое нажатие-взгляд через прицел,длительное-приближение)

if (!var.running) {
var.t = 0.25        /*временной интервал после которого
                      взгляд будет приближен */
var.running = true
}
if (HeldDown(Joystick1.Button7, var.t)) { /* если время нажатия
                                 больше 0.25с, то выполняется */
var.b7HeldDown = true      /* прильнуть к прицелу и
                           кривые отклика по 50% */
PPJoy1.Digital4 = Joystick1.Button7 /*кнопка "смотреть через прицел"
                                     нажата, переключения ещё нет */
}
if (released(Joystick1.Button7)) { //если  кнопка джоя отпущена то

var.b7HeldDown = false /* выполняется команда "широкоугольный обзор"
                           и кривые отклика по 100% */
PPJoy1.Digital4 = false  /* кнопка "смотреть через прицел" отпущена,
                             переключение произошло */
}

Управление приближением взгляда, взгляда через прицел и изменение кривых отклика при приближением взгляда.

Этот блок пожалуй самый сложный в скрипте.
Вот какие функции он выполняет:
При помощи нажатия клавиш Z и X осуществляется приближение и удаление взгляда.
Клавиша Z включаются при нажатии кнопки №4 виртуального джоя №1 Pressed(PPJoy1.Digital4)
Клавиша Х включаются при отпускании той же кнопки (Released(PPJoy1.Digital4.
Приближение взгляда не фиксировано, т.е. приближение есть пока нажата кнопка.

В этот блок включён и делитель кривых отклика, если нажата (и удерживается) всё та же кнопка №4 (PPJoy1.Digital4), то кривые отклика будут уменьшены на 50% (вдвое), полный расход ручки даст в игре только половину отклонения кривых. 
Делитель так же работает только при нажатой кнопке.
Кроме того, если в момент работы делителя, рули дойдут до крайнего положения (что в игре будет считаться только половиной ) и будут в этом положении удержаны,  а потом делитель будет выключен, то рули резко примут реальное значение.

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

Взгляд через прицел.
Функция управляется кн №7 реального джоя.
Переключение происходит (внимание!) не при нажатии на кнопку, а при её отпускании if ( released( Joystick1.Button7) ) .
Это сделано для удобства переключения т.е. если выбран нужный режим (кратковременными нажатияими), то он не должен "сбиватьмя" при последующим длительным.
Само же переключение выполняет клавиша NUMPAD8 цифровай панели, именно на неё в Пульте Управления и необходимо назначить эту функцию.

Теперь как устроен сам блок переключения.
Общий алгоритм работы базируется на определителе времени нажатия кнопки.
Время нажатия (в сек.) задаётся здесь: var.t = 0.25        /*временной интервал.
Т.е. если время нажатия кнопки больше 0,25 сек. то включается приближение взляда и делитель кривых, а при отпускании взляд, отдаляется, делитель 
выключается и функция "смотреть через прицел" переключается.
Если время нажатия меньше, переключается только функция "смотреть через прицел" . 
Принцип управления такой: короткими нажатиями на кнопку выбираем режим, например: "смотреть через прицел" , потом нажимаем и удерживаем ту же кнопку, взгляд приближается, пользуемся, потом  отпускаем кнопку, взгляд удаляется и функция "смотреть через прицел" переключается.
Этот блок можно установить отдельно, с делителем или без.
Если будете это делать обратите особое внимание на назначение кнопок (своих) в операторе управления.
Кнопки там назначаются в двух видах:
if (HeldDown(Joystick1.Button7, var.t и var.b7HeldDown , учтите, номера кнопок (в нашем случае 7), должны совпадать.

Link to post
Share on other sites
 

Может записать трек и показать как всё это работает?

Правда звуки будут не слышны, но вместо них можно вставить включение ночного освещения и щелчки включения затемнителя прицела.

Link to post
Share on other sites
 
// Управление шагом - газом совмещённое с дырчем


var.int = round(MapRange(-Joystick1.RZ, -1, 1, 0, 220))  // разметка оси реального устройства (РУДа)

if ( INRANGE (var.int, 0, 10 ) ) { // если значение оси РУДа в диапазоне от 0 до 10
PPJoy1.analog3 =  -1.00          // шаг 0%
playsound "d:\sounds\chimes"  // играть звуковой файл
wait(500 ms)                           // интервал проигрывания
}

if ( INRANGE (var.int, 30, 40 ) ) { // если значение РУДа от 30 до 40
PPJoy1.analog3 =  1.00            // шаг 100%
PPJoy1.analog4 =  1.00            // тяга    0%
}

if ( INRANGE (var.int, 60, 70 ) ) { // если значение оси РУДа в диапазоне от 
PPJoy1.analog3 =  1.00            // шаг 100%
PPJoy1.analog4 =  0.45            // тяга   30%
}

if ( INRANGE (var.int, 90, 100 ) ) { // если значение оси РУДа в диапазоне от 
PPJoy1.analog3 =  0.00              //  шаг  50%
PPJoy1.analog4 =  0.09              //  тяга  50%
}

if ( INRANGE (var.int, 120, 130 ) ) {// если значение оси РУДа в диапазоне от 
PPJoy1.analog3 =  0.60               // шаг 80%
PPJoy1.analog4 =  -0.44              // тяга 80%

}

if ( INRANGE (var.int, 150, 160 ) ) {  // если значение оси РУДа в диапазоне от 150 до 160
PPJoy1.analog3 =  1.00                 // шаг 100%
PPJoy1.analog4 =  -0.82                // тяга 100%
}

if ( INRANGE (var.int, 180, 190  ) ) { // если значение оси РУДа в диапазоне от 180 до 190
PPJoy1.analog3 =  1.00                 // шаг 100%
PPJoy1.analog4 =  -1.00                // тага 110%
}

if ( INRANGE (var.int, 210, 220 ) ) { // если значение оси РУДа в диапазоне от 210 до 220
PPJoy1.analog3 =  -1.00               // шаг 0%
playsound "d:\sounds\chimes"      // играть звуковой файл
wait(500 ms)                                // интервал проигрывания

}

Управление шагом - газом совмещённое с дырчем.

Подобный блок я уже описывал выше, тут ничего сложного.
Нужно прописать в своём конфиге (в папке User) оси тяги и шага, в нашем случае 
AXE_RX JoystickDevice1=pitch
AXE_RZ JoystickDevice1=-power
В GlovePIE они у нас 
PPJoy1.analog3 = шаг
PPJoy1.analog4 = тяга
Обратите внимание, номер оси шага меньше номера оси тяги, это нужно для того, что бы на мониторе писалось 
изменение тяги (а не шага), что удобнее для контроля.
Конструкция блока типична, разбивается на условный диапазон реальная ось РУДа (например) 
var.int = round(MapRange(-Joystick1.RZ, -1, 1, 0, 220))
и в нужных участках назначаются прямые команды на значения осей шага и тяги, например:
if ( INRANGE (var.int, 90, 100 ) ) {//если РУД находится в диапазоне от 90 до 100 (т.е. почти посередине между 0 и 220)
PPJoy1.analog3 =  0.00     // шаг 50%
PPJoy1.analog4 =  0.09     // тяга 50%

Первая и последняя части этого блока меняют только шаг в 0% и при этом включают звуковой сигнал (это помогает
не передать РУД, когда нужны крайние значения тяги (0% или 100%) при шаге !00%).
Эти части можно безболезненно убрать, также можно отдельно убрать и озвучку.
Кстати убирать можно не стирая строку, а ставя  перед ней //
Так работает: playsound "d:\sounds\chimes"
                      wait(500 ms)
Так нет       :// playsound "d:\sounds\chimes"
                  // wait(500 ms)

И ещё, надо смотреть уменьшает или увеличивает своё значение ось Реального РУДа и если нужно, менять при помощи знака.
У меня РУД сайтека, он при ходе вперёд уменьшает значение оси, поэтому перед определителем оси и на значении осей в скрипте, стоит знак минус
тогда РУД значение увеличивает (минус на минус дают плюс) :-Joystick1.RZ, и например PPJoy1.analog4 =  -1.00  // тага 110%
В Панели Управления на осях шага и тяги выключить симметричность.


 

Link to post
Share on other sites
 
// Управление режимами огня (Фиксированная очередь в 3 вариантах)

//   Первый (базовый) вариант

  if ( pressed(Joystick1.Button1) ) {  //при нажатии кнопки джоя № 1
    PPJoy1.Digital0 = true
    wait(230 ms)                       // длительность очереди в мс (230 ms)
    PPJoy1.Digital0 = false
 }

 Key.NUMPAD1 = PPJoy1.Digital0 //в ПУ  назначить на клавиши "NUMPAD1"  нужное оружие (одинаково для всех вариантов)


//  Второй вариант


 PPJoy1.Digital0 = Joystick1.Button1  // добавлена строка 
 if ( pressed(Joystick1.Button1) ) {  // при нажатии кнопки джоя № 1
    PPJoy1.Digital0 = true
    wait(1 s)                       // длительность очереди в секундах  (1 сек)
    PPJoy1.Digital0 = false
 }


//  Третий вариант


 if ( pressed(Joystick1.Button1) ) {  //при нажатии кнопки джоя № 1
    PPJoy1.Digital0 = true
    wait(230 ms)                       // длительность очереди в мс (230 ms)
    PPJoy1.Digital0 = false

 }

if (!var.running) {
var.t = 0.235       // временной интервал после которого
var.running = true  // огонь непрерывный
}
if (HeldDown(Joystick1.Button1, var.t)) {
var.b1HeldDown = true
PPJoy1.Digital0 = Joystick1.Button1
 }
  if (released(Joystick1.Button1)) {

var.b1HeldDown = false
PPJoy1.Digital0 = false
}

Режимы огня.

Эту часть дам в расширенном виде.

В скрипте приведён базовый вариант (первый), длина очереди в нём задаётся командой  wait и временным 
значением в нашем случае 230 мсек.
При любом нажатии (кратковременном или длительном) оружие произведётт определённое количество
выстрелов (в зависимости от своей скорострельности и времени стрельбы), вы как бы стреляете из пистолета.

Второй вариант отличается от первого тем, что в нём в начале добавлена строка
PPJoy1.Digital0 = Joystick1.Button1  // добавлена строка  
Так же изменено время, до 1 сек,
Тогда количество выстрелов будет зависеть от времени нажатия кнопки, но не более чем оружие сможет выстрелить за 1 сек.
Т.е. если в 1 сек оружие делает 10 выстрелов, то вы циклично и быстро, нажимая гашетку, сможете сделать несколько очередей
пока их общая длина не станет равной 1 сек (т.е. сделать 10 выстрелов), либо нажав и удерживая гашетку, выстрелить те же 
10 выстрелов  одной очередью, либо кратковременно нажав, можете сделать очередь любой длины менее 10 выстрелов. 
Опять аналогия, но уже с автоматом, увеличивая или уменьшая время (wait), вы как бы меняете ёмкость магазина, а отстрелять 
его можете хоть в несколько очередей, хоть в одну.

Третий вариант похож на тот, что в игре, нажали гажетку - оружие стреляет, отпустили - не стреляет.
Разница в том, что кратковременное нажатие ( менее 235 мсек), даст фиксированую очередь (как в первом варианте).
Если гашетка будет удерживаться больше 235 мсек, то стрельба будет непрерывной.
Этот вариант состоит из 2 частей, из базового и определителя времени нажатия ( подобный расписан в управлении взглядом).

Лично я, использую первый (базовый вариант).

Link to post
Share on other sites
 
 // Управление радиатором кнопка %9 реального джоя


 if (!var.running) {
var.t = 0.2  // время для определения двойного клика
var.tDoubleClick = 0.2
var.tB9Release = 0
var.running = true
}
var.now = timestamp
if (pressed(Joystick1.Button9)) {
if (((var.now - var.tB9Release) < var.tDoubleClick)) {
var.B9DClick = true
}
} else if (released(Joystick1.Button9)) {
var.tB9Release = var.now
if (var.B9Dclick) {
    PPJoy1.Digital12 = true
    wait(100 ms)
    PPJoy1.Digital12 = false
var.B9Dclick = false
var.tB9Release = -1
} else {
    PPJoy1.Digital13 = true
    wait(100 ms)
    PPJoy1.Digital13 = false
}
}
 if (!var.running) {
var.t = 0.5 // время для определения удержания кнопки
var.running = true
}
if (HeldDown(Joystick1.Button9, var.t)) {
var.b9HeldDown = true
 wait(1 s) //задержка дли закрытия радиатора
    PPJoy1.Digital14 = true
    wait(100 ms)
    PPJoy1.Digital14 = false
}
}
if ( pressed(PPJoy1.Digital12) ) {
PPJoy1.analog7 = 0.0   // радиатор 50%
}
if ( pressed(PPJoy1.Digital13) ) {
PPJoy1.analog7 =1.0    // радиатор 100%
}
if ( pressed(PPJoy1.Digital14) ) {
PPJoy1.analog7 = -1.0  // радиатор 0%
}

 if (released(Joystick1.Button9)) {

var.b9HeldDown = false
PPJoy1.Digital12 = false
PPJoy1.Digital13 = false
PPJoy1.Digital14 = false
}

Здесь кое что новое, днём распишу.

Link to post
Share on other sites
 

Управление радиатором.

В основном скрипте обеспечивается только две установки радиатора, 50% и 100%, что в принципе достаточно для полётов и боя.
Тем не менее, иногда нужно и полное закрытие.
Для того, что бы обеспечить три положения радиатора при помощи одной кнопки, в приведеном скрипте, пришлось "скрестить" два оператора распознавания
нажатия кнопок.
Первый работает на распознавании "двойной клик vs одинарный клик".
Второй оператор подобен уже рассмотренным выше, определителям времени нажатия кнопок.
Конструкцию  скрипта можно было бы упростить, сразу назначив прямые команды для оси радиатора, но тогда из игры не получалось вийти в Винду.
Хотелось всё же, что бы всё работало правильно, поэтому теперь, скрипт, сначала включает виртуальные кнопки, а уж они, определяют значения осей, в таком варианте обеспечивается выход в Виндоус при включённой игре. 
Естественно в Userовском профиле назначить  на ось виртуального джоя, ось радиатора:
AXE_RY JoystickDevice1=-radiator
B GlovePIE она числится как:
PPJoy1.analog7.
 Алгоритм работы такой:
1) кратковременное нажатие (  менее 0.2сек)  радиатор 100%;
2 )двойной клик -                                            радиатор  50%;
3) удержание (более 0.2)                                 радиатор   0%;
Напомню, все манипуляции кнопкой №9, реального джоя и ещё, при закрытии радиатора с положения 50%,
радиатор в течении 0,5 сек перейдёт в положение 100%, потом 0%, а из положения 100%, при закрытии, сразу в 0%.
 

Link to post
Share on other sites
 
// Управление закрылками
   if ( pressed(Joystick1.Button3) ) {  // уборка кнопка джоя № 3
    Key.F = true                         // в ПУ клавиша F
    wait(250 ms)
    Key.F = false
    PPJoy1.analog6 = PPJoy1.analog6 -0.3 //значение оси уменьшено 
   }
    if ( pressed(Joystick1.Button4) ) {  // выпуск кнопка джоя № 4
    Key.V = true                          // в ПУ клавиша V 
    wait(250 ms)
    Key.V = false
    PPJoy1.analog6 = PPJoy1.analog6 +0.3 //значение оси увеличено
   }


//  Сигнализация выпуска закрылков

var.int = round(MapRange(PPJoy1.analog6, 0, 1, 0, 100))
if ( INRANGE (var.int, 05, 100 ) ) {
playsound "d:\sounds\ding"
wait(500 ms)

}

 Управление закрылками и сигнализация их положения.
Для выполнения указанных функий используются, две кнопки (№ 3 - уборка, №4 - выпуск) реального джоя.
Две клавиши: "F"- уборка, "V"- выпуск и виртуальная ось, опорная для включения сигнализации. 
Тут всё просто, желательно, что бы кнопки  джоя, распологались рядом, для удобства 
управления (а ля хатка)
Назначаете клавиши на уборку и выпуск закрылков в ПУ.
Скрипт помимо нажати клавиш, будет изменять значения опорной оси, 
при уборке уменьшать на 30%     PPJoy1.analog6 = PPJoy1.analog6  -0.3
при выпуске увеличивать на 30% PPJoy1.analog6 = PPJoy1.analog6 +0.3
Опорная ось сигналицации, при значении от 05 до 100, будет включать звуковой сигнал,
а при значении от 0 до 05, будет сигнал выключать.
На крафтах с автоматической уборкой закрылков, при их атоуборке,
звук не выключится, надо будет нажать на кнопку уборки, столько раз 
сколько было нажато на выпуск (для изменения значения оси сигнализации).

Link to post
Share on other sites
 
// Управление уборкой и выпуском шасси в том чиcле и вручную при
// нажатии кнопки джоя № 8, кратковременное - уборка, длительное -выпуск
if (!var.running) {
var.t = 0.235
var.running = true
}
if (HeldDown(Joystick1.Button8, var.t)) {
var.b8HeldDown = true
PPJoy1.Digital10 = Joystick1.Button8
}else if ( pressed(Joystick1.Button8))  {
    PPJoy1.Digital11 = true
    wait(230 ms)
    PPJoy1.Digital11 = false
 }
  if (released(Joystick1.Button8)) {
var.b1HeldDown = false
PPJoy1.Digital10 = false
PPJoy1.Digital11 = false
}
 if ( pressed(PPJoy1.Digital10) ) {
    Key.Y = true
    wait(50 ms)
    Key.Y = false
    Key.L = true
    wait(50 ms)
    Key.L = false
//////////////////////не менее 100 //////////////
    Key.L = true
    wait(50 ms)
    Key.L = false



}


if ( pressed(PPJoy1.Digital11) ) {
    Key.G = true
    wait(50 ms)
    Key.G = false
    Key.K = true
    wait(50 ms)
    Key.K = false
//////////////////////не менее 50//////////////

    Key.K = true
    wait(50 ms)
    Key.K = false


}

 Управление уборкой и выпуском шасси, в том чиcле, вручную, и аварийно.

 

 

Эта функция так же построена на определителе времени нажатия кнопки.

Кратковременное нажатие кнопки джоя №8, включает уборку, в том числе и вручную.

Нажатие с удержанием той же кнопки, включает выпуск, в том числе вручную и аварийно.

В Панели Управления на уборку – выпуск шасси, назначить 2 клавиши: «Y» и «G».

На уборку шасси вручную, назначить клавишу «К».

На выпуск вручную, назначить «L».

При таком варианте назначений, можно использовать ту же кнопку №8, в качестве кнопки тормоза, назначив её в ПУ, простым нажатием, при выключенном GlovePIE.

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

По причине не возможности, избежать (при любом способе нажатия на кнопку №8), цикла уборки, цикл выпуска (по количеству итераций клавиши «L»), вдвое больше количества итераций клавиши «К».

Т.е. когда вы удерживаете кнопку и включаете выпуск, то при отпускании включается и уборка.

Программа, выполняет нажатие клавиш «К» и «L»,  поочерёдно, но цикл с клавишей «К», короче.

После того как он закончится, продолжается итерация клавиши «L» до полного выпуска.

В приведенном фрагменте, количество итераций условно сокращено, в большом скрипте, нет.

 

Link to post
Share on other sites
 

Несколько советов.

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

подкорректировать скрипт.

Но если скрипт выполняет какую то команду постоянно, например удерживает кнопку.

Например команда записана с ошибкой вот так

    Key.L = true

Вместо

    Key.L = true

    wait(50 ms)

    Key.L = false

Тогда клавиша «L» будет как бы нажата и игра не даст выйти в Виндоус.

В этом случае воспользуйтесь командой Shift PIE она отключит выполнение скрипта и позволит вам выйти в Виндоус.

 

Все вышеизложенные скрипты работоспособны и проверены.

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

Ошибки в синтаксисе (если возникнут), GlovePIE отметит красным цветом строки.

Менее грубые, отметит розовым цветом строки.

Отлаженный скрипт, работает как часы и НИКОГДА не глючит!

 

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

 

Link to post
Share on other sites
 
 

Привинтить, что ли, к моему мышеджою тоже всяких финтифлюшек?...

Link to post
Share on other sites
 
//Управление радиатором  кнопка джоя № 9

   PPJoy1.analog7 = -1.0

  if  ( pressed(Joystick1.Button9))  {
  PPJoy1.analog7 = PPJoy1.analog7 + 0.999
}

 if  (PPJoy1.analog7 = 1.0) {
 PPJoy1.analog7 = -1.0
 }

Наконец то протестировал скрипт.

Делитель кривых отклика не впечатлил, без него лучше.

Управление радиатором не логичное и громоздкое, заменяем его на вот этот изящный скрипт.

Управляется простыми нажатиями, переключая радиатор последовательно по кольцу: 0-50-100-0.

Так же на понравилось управление уборкой - выпуском шасси, его тоже меняем на более удобный скрипт.

Тут тоже управление одной кнопкой и она же тормоз.

 

Link to post
Share on other sites
 
/ Управление уборкой и выпуском шасси в том чиcле и вручную при
// нажатии кнопки джоя № 8,

if (  pressed(Joystick1.Button8) ) {
toggle( PPJoy1.Digital10 )
}

if ( pressed(PPJoy1.Digital10) ) {
    Key.G = true
    wait(50 ms)
    Key.G = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
     Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
     Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
     Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
      Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false
    Key.L = true
    wait(50 ms)
    Key.L = false

}


if ( released(PPJoy1.Digital10) ) {
    Key.G = true
    wait(50 ms)
    Key.G = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false
    Key.K = true
    wait(50 ms)
    Key.K = false


}

 

Link to post
Share on other sites
 

Вот обещаный трек, тут в принципе всё кроме стрельбы, минут на 6.

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

DemoGlovePIE.ntrk

Link to post
Share on other sites
 
  • 6 years later...

Весьма полезный пласт информации!!!
Сразу забрал тот твой скриптик для подхвата физическим джойстиком еще двух осей виртуального при нажатии кнопки джойстика.
Они идут как триммера.Очень удобно иногда бывает.Но в игре забываешь - то ли кнопка нажата и триммера работают или отжата.
Не информативно.Вот и хотел при нажатии этой кнопки,чтобы звучал звуковой сигнал.
 Пока же сделал обходной маневр:Вывел визуальную сигнализацию нажатия клавиши:
Это связка из трех программок - JoyToKey(с помощю неё привязал кнопку джойстика к клавише клавиатуры)  плюс еще две: Вывод нажатых кнопок на экран через YAKD и RTSS

И еще по тому скрипту из темы Мышеджой.Можно его как то  поправить в лучшую сторону?

Link to post
Share on other sites
 
  • 2 weeks later...




 // Тумблер ON/OF CapsLock

 CapsLock = Mouse1.Button3

 if (pressed(PPJoy1.Digital0)) {
    Mouse.CursorPosX = screen.Width/2
    Mouse.CursorPosY = screen.Height /2
    Mouse.Swallow = true
}
 if (released(PPJoy1.Digital0)) {
    Mouse.Swallow = false
}
 if (Clicked(CapsLock)) {
    toggle(PPJoy1.Digital0)
}

 if (CapsLock = false) then var.f=0
 if (CapsLock = true and var.off = 0 and var.f=0) {
    var.off = 1
    var.f=1
 elseif (CapsLock = true and var.off = 1 and var.f=0) {
    var.off = 0
    var.f=1
 }
}
 if var.off = 0 then


********************************************************************************
 // Старт
********************************************************************************

 if starting then

 Pie.FrameRate = 500    // Частота опроса

 var.M1_mapX = 3000     // Разрешение оси X
 var.M1_mapY = 3000     // Разрешение оси Y
 var.M1_Wheel = 6       // Количество щелчков колеса для 1-й оси
 var.M1_Wheel2 = 2      // Количество щелчков колеса для 2-й оси
 var.M1_Wheel3 = 5      // Количество щелчков колеса для 3-й оси

 var.M1_P =  1          // При старте джойстика Газ на 100
 var.M1_R =  1          // При старте джойстика Радиатор на 100
 var.M1_S =  1          // При старте джойстика Шаг на 100

 var.M1_mapP = 60*var.M1_Wheel
 var.M1_mapR = 60*var.M1_Wheel2
 var.M1_mapS = 60*var.M1_Wheel3

 PPJoy1.Analog2 = -1    // При старте джойстика закрылки убраны

 // Эмуляция кнопок клавиатуры
 Key.1 = Joystick1.Button10
 Key.2 = Joystick1.Button11
 Key.3 = Joystick1.Button12
 Key.4 = Joystick1.Button13

 Key.5 = Joystick1.Pov1Up
 Key.6 = Joystick1.Pov1Right
 Key.7 = Joystick1.Pov1Down
 Key.8 = Joystick1.Pov1Left

 Key.9 = Joystick1.Button14
 Key.0 = Joystick1.Button15
 Key.F10 = Joystick1.Button16

 var.off = true

endif


********************************************************************************
 // Мышь
********************************************************************************

 // Cдвиг 1-й мышки
 var.dx = Delta(Mouse1.DirectInputX)/ var.M1_mapX
 var.dy = Delta(Mouse1.DirectInputY)/ var.M1_mapY
 var.dz = Delta(Mouse1.DirectInputZ)

 // Перевод перемещения мышки в движение осей виртуального джойстика
 var.M1_X += var.dx
 var.M1_Y += var.dy

 // Центровка осей при нажатии СКМ
 if (Mouse1.Button1) {
    var.M1_X = 0
    var.M1_Y = 0
}

 // Ограничения диапазонов осей
 if (var.M1_X < -1) var.M1_X = -1
 if (var.M1_X >  1) var.M1_X =  1
 if (var.M1_Y < -1) var.M1_Y = -1
 if (var.M1_Y >  1) var.M1_Y =  1
 if (var.M1_P < -1) var.M1_P = -1
 if (var.M1_P >  1) var.M1_P =  1
 if (var.M1_R < -1) var.M1_R = -1
 if (var.M1_R >  1) var.M1_R =  1
 if (var.M1_S < -1) var.M1_S = -1
 if (var.M1_S >  1) var.M1_S =  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   Обзор по Pitch     AXE_Y
 //PPJoy1.Analog0   Обзор по Yaw       AXE_X


*********************************************************************************
 // Список кнопок
********************************************************************************
 //PPJoy1.Digital0  = тумблер вкл/выкл
 //PPJoy1.Digital1  = взгляд через прицел
 //PPJoy1.Digital2  = приближение взляда
 //PPJoy1.Digital3  = переключение режимов шага винта ручной-авто
 //PPJoy1.Digital4  = закрылки в автомате
 //PPJoy1.Digital5  = закрылки в посадку
 //PPJoy1.Digital6  = закрылки убраны
 //PPJoy1.Digital7  =
 //PPJoy1.Digital8  =
 //PPJoy1.Digital9  =  
 //PPJoy1.Digital10 =
 //PPJoy1.Digital11 =
 //PPJoy1.Digital12 =
 //PPJoy1.Digital13 =
 //PPJoy1.Digital14 =
 //PPJoy1.Digital15 =
 //PPJoy1.Digital16 =
 //PPJoy1.Digital17 =
 //PPJoy1.Digital18 =
 //PPJoy1.Digital19 =


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

 // Взгляд через прицел при нажатии ЛКМ
 if (pressed(Mouse1.Button2)) {
    PPJoy1.Digital1 = true
    wait 0.1
    PPJoy1.Digital1 = false
}
 if (released(Mouse1.Button2)) {
    PPJoy1.Digital1 = true
    wait 0.1
    PPJoy1.Digital1 = false
}

 // Плавное изменение угла обзора при нажатии ПКМ
 if pressed(PPJoy1.Digital2) 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
}

  // Виды
 if (Key.5 + Key.6) {                    //взгляд на противника
    Key.F4 = true
    wait 0.5
    Key.F4 = false
}
 if (Key.6 + Key.7) {                    //взгляд на союзника
    Key.F3 = true
    wait 0.5
    Key.F3 = false
}

 // Управление взлядом по осям
 PPJoy1.analog1 = Var.M1_Y
 PPJoy1.analog0 = Var.M1_X
 var.TrimPitch = PPJoy1.analog1
 var.TrimYaw = PPJoy1.analog0
 FakeTrackIR.Pitch = var.TrimPitch *100
 FakeTrackIR.Yaw = var.TrimYaw *150
 var.int = round(MapRange(var.M1_X, -1, 1, 0, 10))
 if (INRANGE(var.int, 00, 00)) {
    FakeTrackIR.X = -1.00
}
 if (INRANGE(var.int, 01, 09)) {
    FakeTrackIR.X =  0.00
}
 if (INRANGE(var.int, 10, 10)) {
    FakeTrackIR.X = 1.00
}
 var.int = round(MapRange(var.M1_Y, -1, 1, 0, 10))
 if (INRANGE(var.int, 00, 02)) {
    FakeTrackIR.Y = -1.00
}
 if (INRANGE(var.int, 03, 07)) {
    FakeTrackIR.Y =  0.00
}
 if (INRANGE(var.int, 08, 10)) {
    FakeTrackIR.Y = 1.00
}
 Var.TrimPitch = Smooth (10)
 Var.TrimYawy = Smooth (10)


********************************************************************************
 // Управление ВМГ
********************************************************************************
 
 // Управление тягой
 if (Key.5 = False and Key.7 = False) {
    var.M1_P += var.dz/var.M1_mapP
}
 var.int = round(MapRange(var.M1_P, -1, 1, 0, 12))
 if (INRANGE(var.int, 00, 00)) {
    PPJoy1.analog4 = -1.00                          //  0%
}
 if (INRANGE(var.int, 01, 02)) {
    PPJoy1.analog4 = -0.46                          // 30%
}
 if (INRANGE(var.int, 03, 04)) {
    PPJoy1.analog4 = -0.10                          // 50%
}
 if (INRANGE(var.int, 05, 06)) {
    PPJoy1.analog4 =  0.55                          // 85%
}
 if (INRANGE(var.int, 07, 08)) {
    PPJoy1.analog4 =  0.64                          // 90%
}
 if (INRANGE(var.int, 09, 10)) {
    PPJoy1.analog4 =  0.73                          // 95%
}
 if (INRANGE(var.int, 11, 12)) {
    PPJoy1.analog4 =  1.00                          //110%
}

 // Управление шагом
 if (Key.5 ) {
    var.M1_S += var.dz/var.M1_mapS
}
 var.int = round(MapRange(var.M1_S, -1, 1, 0, 10))
 if (INRANGE(var.int, 00, 00)) {
    PPJoy1.analog3 =  -1.00                         //  0%
}
 if (INRANGE(var.int, 01, 02)) {
    PPJoy1.analog3 =  0.00                          // 50%
}
 if (INRANGE(var.int, 03, 04)) {
    PPJoy1.analog3 =  0.70                          // 85%
}
 if (INRANGE(var.int, 05, 06)) {
    PPJoy1.analog3 =  0.80                          // 90%
}
 if (INRANGE(var.int, 07, 08))  {
    PPJoy1.analog3 =  0.90                          // 95%
}
 if (INRANGE(var.int, 09, 10))  {
    PPJoy1.analog3 =  1.00                          //100%
}

 // Переключение управления шагом винта: ручное-авто
 if (DoubleClicked(Key.5)){
    PPJoy1.Digital3 = true
    wait 0.1
    PPJoy1.Digital3 = false
}

 // Управление радиатором
 if (Key.7 ) {
    var.M1_R += var.dz/var.M1_mapR
}
 var.int = round(MapRange(var.M1_R, -1, 1, 0, 45))
 if (INRANGE(var.int, 00, 00)) {                   //  0%
    PPJoy1.analog5 =  -1.00
}
 if (INRANGE(var.int, 15, 25)) {                   // 50%
    PPJoy1.analog5 =  0.00
}
 if (INRANGE(var.int, 35, 45)) {                   //100%
    PPJoy1.analog5 =  1.00
}


********************************************************************************
 // Управление механизацией
********************************************************************************

  // Катапультирование
 if (pressed(Key.1+Key.2+Key.3+Key.4)){
    Key.Ctrl+E = true
    wait 0.2
    Key.Ctrl+E = false
}

 // Выпуск шасси вручную
 if pressed (Key.1 and Key.4) then var.gear = not var.gear
 if var.geare < 50  and var.gear = true
    Key.G+Key.U = true
    Key.G+Key.U = false
    var.geare += 1
    wait 0.01
elseif var.geare >0  and var.gear = false
 if var.geare > 50 then var.geare = 50
    Key.G+Key.D = true
    Key.G+Key.D = false
    var.geare -= 1
    wait 0.01
endif

 // Управление закрылками
 if (!var.running) {
    var.t = 0.2                          //время двойного клика
    var.tDoubleClick = 0.2
    var.tKF10Release = 0
    var.running = true
}
 var.now = timestamp
 if (pressed(Key.F10)) {
 if (((var.now - var.tKF10Release) < var.tDoubleClick)) {
    var.KF10DClick = true
 }
} else if (released(Key.F10)) {
    var.tKF10Release = var.now
 if (var.KF10Dclick) {
    PPJoy1.Digital4 = true
    var.KF10Dclick = false
    var.tKF10Release = -1
} else {
    PPJoy1.Digital4 = false
    PPJoy1.Digital5 = true
    wait 0.1
    PPJoy1.Digital5 = false
 }
}
 if (!var.running) {
    var.t = 0.5                          //время удержания кнопки
    var.running = true
}
 if (HeldDown (Key.F10, var.t)) {
    var.KF10HeldDown = true
    wait 1.0                             //задержка уборки закрылков
    PPJoy1.Digital4 = false
    PPJoy1.Digital6 = true
    wait 0.1
    PPJoy1.Digital6 = false
}
 if (PPJoy1.Digital4) {
    PPJoy1.analog2 = -1 + PPJoy1.analog1^3*3      
    speech.agata.text = “закрылки в автомате.”
}
 if (PPJoy1.Digital5) {
    PPJoy1.analog2 =1.0                            
    speech.agata.text = “закрылки в посадку.”
}
 if (PPJoy1.Digital6) {
    PPJoy1.analog2 = -1.0                          
    speech.agata.text = “закрылки убраны.”
}
 if (released(Key.F10)) {
    var.KF10HeldDown = false
    PPJoy1.Digital5 = false
    PPJoy1.Digital6 = false
}

 // Управление тормозами
 if (Key.6 or Key.7) != 1 {
    PPJoy1.analog6 = -1.00
} else {
    PPJoy1.analog6 =  1.00
}
 if (Key.7 or Key.8) != 1 {
    PPJoy1.analog7 = -1.00
} else {
    PPJoy1.analog7 =  1.00
 }
}


Вот скрипт для ТМ1600 и обзора мышкой.

По-элементно:

 // Тумблер ON/OF CapsLock

Эта кнопка включает - выключает скрипт, выбрана за то, что обычно подсвечивается при включении светодиодом на клаве. Включать и выключать скрипт можно с клавы или нажав среднюю (колёсико) кнопку мыши. Желательно вывести курсор поверх игры, тогда при включении скрипта, курсор встанет по центру монитора и при фиксации взгляда будет стоять в середине прицела, особенно полезно когда прицел разбит.  Если указатель будет в виде красной точки, будет ещё комфортней. Указатели в этой папке, их скачать открыть, выбрать подходящий, закинуть в диск С / Windows/Cursor. После чего через контрольную панель выбрать Мышь/Указатели/Обзор, где открыть Папку Cursor, найти и добавить нужный указатель.

 // Старт

 var.M1_mapX = 3000     // Разрешение оси X
 var.M1_mapY = 3000     // Разрешение оси Y

Здесь подобрать подходящие разрешения. 

 // Эмуляция кнопок клавиатуры

Вот тут немного сложнее, смысл такой: четырём кнопкам джойстика (на выносной панельке) присваиваются значения цифровых клавиш 1 2 3 4 по часовой стрелке начиная с верхней левой кнопки джоя. Следующие цифры: 5 6 7 8 установятся сами. Т.е. хатка вверх - 5 , вправо - 6, вниз -7, влево - 8. Ещё две цифры: 9 и 0 назначить на кнопки справа и слева от хатки и наконец клавишу F10 назначить на заднюю центральную кнопку. Назначить - просто вписать номер кнопки джоя в готовую конструкцию т.е. вместо 10 в строке Key.1 = Joystick1.Button10, поставить свой номер и т.д.

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

 // Список осей

Оси из списка, прописать в конфиге, кроме нулевой и первой, они отвечают за обзор. Также прописать (или назначить) Оси джойстика,  Движок на панельке, если не шумит, сделать триммером Руля Высоты, кривые для точности управления триммером поставить 0-4-9-16-25-36-49-64-81-100.

 // Список кнопок

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

Всё на сегодня, продолжу после.

unavailiable.cur

  • Upvote 1
Link to post
Share on other sites
 

Продолжаю.

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

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

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

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

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

  // Виды

Учитывая то, что самые необходимые команды должны быть "под рукой", считаю, что если используются  Внешние Виды (ВВ), то включение их должно быть удобно и оперативно. В скрипте на "вид на противника" назначить F4, а  на "вид на союзника" назначить F3. Тогда при удержании хатки в позиции "Hat Switch  45" (вверх-вправо), с частотой в пол секунды будут "перелистаны" все противники. Можно это сделать и кратковременными нажатиями. С видом на союзника, всё тоже самое можно проделать отклоняя хатку по диагонали вправо-вниз (Hat Switch 135). Если не понравится "перелиставание", то раздел виды в скрипте удалить или закомментировать, тогда в ПУ хаткой установить соответствующие виды. Именно так установить "вид из кабины" хатка влево-вниз (Hat Switch -135) и "вид со стороны" хатка влево-вверх (Hat Switch -45). 

Буду выкладывать порциями, а то если отключат свет - пропадёт, а черновик лень писать. 

Link to post
Share on other sites
 

Далее.

 // Управление взглядом по осям

Это собственно мышетрекир с функцией смещения по осям X иY при взгляде через прицел. Честно говоря тестировал я эту часть не досконально, что то может потребовать доработки. Вот эти строки в конце блока:

 Var.TrimPitch = Smooth (10)
 Var.TrimYawy = Smooth (10)

Это сглаживание осей, якобы можно ставить до (30), стоит (10), точно не уверен нужно ли это.

 // Управление ВМГ

  Управление  тягой, шагом и радиатором осуществляется колесом мыши. Если не хатка не нажата вверх или вниз , т.е. не включены кнопки 5 или 7, то вращение колеса задаёт тягу в следующих значениях 0% - 30% - 50% - 85% -90% - 95% - 110%. Т.е. колесо мыши имеет всего шесть щелчков (7 положений). Это диапазона хватает на все виды полёта включая взлёт - посадку и воздушный бой, и при этом обладает простотой и оперативностью управления. Полёт в строю конечно затруднён, но если нужен бОльшая дискретность управления то можно просто изменить количество щелчков мыши в боле // Старт, поставив нужное количество вместо установленных 6 , учитывая, что значений будет больше чем щелчков, на единицу (6 щелчков - 7 значений, 10 щелчков - 11 значений). 

 var.M1_Wheel = 6       // Количество щелчков колеса для 1-й оси

А сам блок после удаления фиксированных значений должен будет выглядеть проще вот так:

 // Управление тягой
 if (Key.5 = False and Key.7 = False) {
    var.M1_P += var.dz/var.M1_mapP
}

PPJoy1.analog4 = Var.M1_P

 // Управление шагом

Аналогично с предыдущим с той лишь разницей, что управлять шагом винта можно нажав хатку вверх (включив клавишу 5). При этом и тяга, и значения радиатора, останутся такими как были. Ось последовательно придаёт шагу следующие значения: 0% - 50% - 85% - 90% - 95% - 100%. Немного поясню, 0% для дырча, для планирования на дальность, дли пикирования на большой скорости. 50% для маршрутных полётов, полётов на дальность с экономией топлива, обязательно в сочетании с тягой 50%. 85% шага и столько же тяги, это режим наиболее возможной тяги без перегрева на жарких картах и низких высотах, 90% и 95% с соответствующими значениями тяги то же самое, что и предыдущая, если позволяет температура воздуха. На немецких самолётах для ручного управления шагом, автоматику надо выключать, для чего назначить в ПУ на команду "Шаг винта автоматический" кнопку  PPJoy1.Digital3. Для перехода сделать двойной клик хаткой. Далее как выше изложено. Если диапазон управления шагом будет мал, то поступить как с блоком тяги.

 // Управление радиатором 

Радиатор управляется колесом мыши при зажатой вниз хатке (включена клавиша 7). Он имеет два щелчка и  три значения: 0% - 50% - 100%.  Этого как показала практика вполне хватает, если надо больше - меняем.

 

Link to post
Share on other sites
 

Забыл дописать, шаг 100% это воздушный бой, тяга меняется, а шаг обычно нет.

 // Управление механизацией

Катапультирование можно назначить самому, приведенный пример, просто использование 4 кнопок панельки, при одновременном их нажатии инициируется знаменитая Ctrl E, которая должна быть назначена в ПУ.

 // Выпуск шасси вручную

Правильно было бы  // Выпуск шасси в т.ч. вручную и аварийно.

Блок управляет уборкой и выпуском шасси при одновременном нажатии двух копок на панельке, включающих клавиши 1 и 4               

 (if pressed (Key.1 and Key.4) Одновременно включается циклическое нажатие кнопок G+U (Gear Up)  G+D  (Gear Down), отвечающих за ручные уборку и выпуск, в ручном режиме они работают последовательно. Соответственно в ПУ в команде "убрать/выпустить шасси" одновременно нажимаем клавиши 1 и 4, а в командах "убрать шасси вручную" и "выпустить шасси вручную",  G и U, и  G и D соответственно.

 // Управление закрылками

Самый "хитрый" блок скрипта. Необходимо присвоить центральной задней кнопке джойстика функцию включения F10, это вверху скрипта в эмуляции: Key.F10 = Joystick1.Button(настоящий номер кнопки) 

Работает блок так: при кратковременном нажатии на кнопку джоя эмулирующую F10, закрылки устанавливаются в посадку. При нажатии на кнопку со временем удержания не менее полсекунды, закрылки убираются. При  двойном клике, закрылки переходят в автоматический режим, отслеживая положение РУС, но на копируя его, при значении Оси Руля высоты от 0 до -1 убирая закрылки, а при значении оси РВ от 0 до +1 выпуская по нелинейному закону. Закон выбран по условию, что при скорости полёта при которых возможен клин закрылков, положение РУСа на позволяет им выйти в положение заклинения. Кроме того, если на большой скорости постоянно делать минимальные движения РУСом, то закрылки тоже будут немного шевелиться и клина не будет. Одним словом некое подобие закрылков Накадзимы, только здесь не учитывается скорость полёта. Не очень удобен такой способ для спитов и ишаков, хотя возможен, во всяком случае есть выпуск в посадку. Для американских палубных самолётов, такой авто режим интересен, собственная автоматика убирает на них закрылки при наборе скорости. Включать их надо вручную, в нашем случае, включать будет скрипт, как только игра посчитает, что скорость полёта это позволяет.  Взлёт с закрылками в авто режиме выгоднее. Сигнализации выпуска нет, так как каждому режиму будет соответствовать голосовое сообщение и в авто режиме будут слышны звуки в кокпите, либо от пневмо, либо от электро механизмов управляющих закрылками.

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

Тормоза управляются с хатки РУСа, хатка влево-левый тормоз нажат; хатка вправо-правый тормоз нажат; Хатка на себя - обо тормоза нажаты. Опция в общем не обязательная, но удобная, можно от неё отказаться назначив удобную для себя кнопку тормоза, либо опять же повесить на колесо мыши ось (оси) тормозов.

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

 

Link to post
Share on other sites
 
 

В тексте не отметил, что для переключения шага винта на автоматический или на ручной режимы, нужен двойной клик хаткой вверх. Это к слову. Речь же пойдёт о ... кнопках. Т.е. их (кнопки), определим как некие устройства с помощью которых задаются команды управления, в основном дискретные - управляющие состоянием объекта по принципу вкл/выкл. Как часто приходилось слышать и читать о том, что кнопок много не бывает, особенно когда летают в шлеме, когда кнопки клавиатуры использовать нельзя. Приходиться обходиться тем их количеством, что есть на РУСе и РУДе. Если устройство управления используется одно (комплект типа Х52 или т.п.), в наличии может быть до 32-х кнопкок (больше винда не видит), ну плюс ещё 8-ми позиционная хатка, т.е. 40 кнопок. Все эти 40 кнопок образуют целое хозяйство. Которое "размазано" по комплекту, причём не всегда удобно для пользователя. А сколько вообще надо кнопок для покрытия потребностей оперативного управления в бою? Давайте прикинем. Только сначала вопрос переиначим, считать будем не сколько кнопок, а сколько команд необходимо. Открыл Панель управления (ПУ), посчитал, что всего назначено 43 команды, для оперативного управления можно предельно ужаться до 20, но лучше 26. Сколько понадобится кнопок? Как бы 26, а если использовать софт, тот же GlovePIE? Используя возможность софта присвоить каждой кнопке джойстика значение клавиатурной клавиши и возможностью игры назначать команды одновременным нажатием двух клавиатурных клавиш, мы переходим к управлению не кнопками, а их сочетаниями. К примеру, есть две 4-х позиционные хатки, одна под левую, вторая под правую руки. Тогда простое сочетание 4х4 даст 16 команд, а что бы "не пропали" индивидуальные нажатия на каждую кнопку, их оформим как нажатия двойным кликом, что даст ещё 8 команд, т.е. уже набралось 24, кроме того обычно в хатках (даже 4-х позиционных) при диагональном движении шляпки, включаются сразу две соседние кнопки (если не включаются то надо ножку грибка утолстить), значит ещё плюс 8 команд. Итого две хатки могут обеспечить 32 команды. Всё, как бы управляется двумя пальцами, очень удобно и оперативно. Для самодельщиков например, не надо городить регистры, травить платы, монтаж проводов упростится. Для летающих в шлемах, даже такого минимального количества реальных кнопок будет достаточно для удобного и главное полного управления. Если использовать моды, то эти две хатки обеспечат любое необходимое число команд. Т.е. один мод отвечает за взлёт и посадку, а второй за воздушный бой, меняя значения нажимаемых кнопок джойстика. Кроме того, назначение команд парными символами, практически исключает случайную подачу команды, например при написании сообщения в чат или случайного касания кнопки джоя или клавы. 

 // Эмуляция кнопок клавиатуры
 Key.1 = Joystick1.Button10
 Key.2 = Joystick1.Button11
 Key.3 = Joystick1.Button12
 Key.4 = Joystick1.Button13

 Key.5 = Joystick1.Pov1Up
 Key.6 = Joystick1.Pov1Right
 Key.7 = Joystick1.Pov1Down
 Key.8 = Joystick1.Pov1Left

 // Эмуляция кнопок клавиатуры двойным нажатием
 /* 1 способ: двойной клик назначается на кнопку джойстика */
  if (DoubleClicked(Joystick1.Button10)){
    Key.A + Key.S = true
    wait 0.1
    Key.A + Key.S  = false
}
  if (DoubleClicked(Joystick1.Button11)){
    Key.A + Key.D = true
    wait 0.1
    Key.A + Key.D  = false
}
  if (DoubleClicked(Joystick1.Button12)){
    Key.A + Key.F = true
    wait 0.1
    Key.A + Key.F  = false
}
/* Например при двойном клике на кнопку №13 джойстика №1
будут одновременно нажаты и через 0,1сек отжаты клавиши А и G */
  if (DoubleClicked(Joystick1.Button13)){
    Key.A + Key.G = true
    wait 0.1
    Key.A + Key.G  = false
}
 /* 2 способ: двойной клик назначается на клавишу клавиатуры
  эмулированную кнопкой джойстика, оба способа совместимы,
   выбирайте удобный */
  if (DoubleClicked(Key.5)){
    Key.A + Key.H = true
    wait 0.1
    Key.A + Key.H = false
}
  if (DoubleClicked(Key.6)){
    Key.A + Key.J = true
    wait 0.1
    Key.A + Key.J = false
}
  if (DoubleClicked(Key.7)){
    Key.A + Key.K = true
    wait 0.1
    Key.A + Key.K = false
}
 /* Например при двойном клике на клавишу 8, хоть с джойстика
 (Joystick1.Pov1Left), хоть напрямую с клавы,будут одновременно
  нажаты и через 0,1сек отжаты клавиши А и L */
  if (DoubleClicked(Key.8)){
    Key.A + Key.L = true
    wait 0.1
    Key.A + Key.L = false
}

  

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...