Перейти к содержанию

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


Рекомендуемые сообщения

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

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\ для удобства.
 

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

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

 

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

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

 

Ссылка на сообщение
Поделиться на другие сайты
 

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

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

Ссылка на сообщение
Поделиться на другие сайты
 
/* Управление приближением взгляда, взгляда через прицел
 и изменение кривых отклика при приближением взгляда*/

// Управление приближением взгляда всё работает при нажатии кнопки джоя № 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), должны совпадать.

Ссылка на сообщение
Поделиться на другие сайты
 

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

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

Ссылка на сообщение
Поделиться на другие сайты
 
// Управление шагом - газом совмещённое с дырчем


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%
В Панели Управления на осях шага и тяги выключить симметричность.


 

Ссылка на сообщение
Поделиться на другие сайты
 
// Управление режимами огня (Фиксированная очередь в 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 частей, из базового и определителя времени нажатия ( подобный расписан в управлении взглядом).

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

Ссылка на сообщение
Поделиться на другие сайты
 
 // Управление радиатором кнопка %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
}

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

Ссылка на сообщение
Поделиться на другие сайты
 

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

В основном скрипте обеспечивается только две установки радиатора, 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%.
 

Ссылка на сообщение
Поделиться на другие сайты
 
// Управление закрылками
   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, будет сигнал выключать.
На крафтах с автоматической уборкой закрылков, при их атоуборке,
звук не выключится, надо будет нажать на кнопку уборки, столько раз 
сколько было нажато на выпуск (для изменения значения оси сигнализации).

Ссылка на сообщение
Поделиться на другие сайты
 
// Управление уборкой и выпуском шасси в том чи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» до полного выпуска.

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

 

Ссылка на сообщение
Поделиться на другие сайты
 

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

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

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

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

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

    Key.L = true

Вместо

    Key.L = true

    wait(50 ms)

    Key.L = false

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

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

 

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

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

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

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

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

 

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

 

Ссылка на сообщение
Поделиться на другие сайты
 
 

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

Ссылка на сообщение
Поделиться на другие сайты
 
//Управление радиатором  кнопка джоя № 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.

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

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

 

Ссылка на сообщение
Поделиться на другие сайты
 
/ Управление уборкой и выпуском шасси в том чи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


}

 

Ссылка на сообщение
Поделиться на другие сайты
 

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

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

DemoGlovePIE.ntrk

Ссылка на сообщение
Поделиться на другие сайты
 

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.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...