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

Kap

Пилоты
  • Публикаций

    55
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные Kap

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

  2. //Управление триммером элеронов,срабатывает при крайних положениях РУС по крену
    
    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).

     

  3. //Управление триммером элеронов,срабатывает при крайних положениях РУС по крену
    
    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).

     

  4. // Сигнализация оптимального положения РВ (Звуковая загрузка)
    
    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\ для удобства.
     

  5.  

     

     

    //Список задействованных и свободных осей
    
    //PPJoy1.analog0 = Joystick1.X
    //PPJoy1.analog1 = Joystick1.Y
    //PPJoy1.analog2 = Joystick1.Z
    //PPJoy1.analog3
    //PPJoy1.analog4   Шаг
    //PPJoy1.analog5   Тяга
    //PPJoy1.analog6   Опорная ось сигнализации закрылков
    //PPJoy1.analog7  Радиатор
    
    //PPJoy2.analog0   Триммер Элеронов
    //PPJoy2.analog1   Триммер РВ
    //PPJoy2.analog2   Триммер РН
    //PPJoy2.analog3
    //PPJoy2.analog4
    //PPJoy2.analog5
    //PPJoy2.analog6
    //PPJoy2.analog7
    
    // Назначаем кнопки
    
    
    PPJoy1.Digital4 = Joystick1.Button7 

    Список осей .
    Этот блок не является командным, он нужен для контроля, что и куда назначено, т.е. для удобства и без него можно обойтись.
    Назначение кнопок.
    В данном случае назначена всего одна кнопка, т.е. на реальную кн № 7( Joystick1.Button7), назначена виртуальная №4 (PPJoy1.Digital4).
    Подобным образом на реальную кнопку, можно присвоить любую виртуальную либо клавишу клавиатуры.

  6. Ну, что, поехали по-блочно.

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

    Виртуальный тумблер базируется на виртуальной же кнопке   №9 (PPJoy1.Digital9) , виртуального джоя №1.

    Имеет два состояния: включено (PPJoy1.Digital9 ==1) и выключено (это состояние подразумевается логическим оператором (else) (иначе), т.е.  включено иначе выключено.

    Виртуальным тумблером управляет кнопка №12  реального джоя (Joystick1.Button12), путем последовательных нажатий.

    Первое нажатие включает тумблер, второе выключает, ещё раз напомню по умолчанию тумблер выключен.

     

     

    // Оси джойстика и включатель осей X Y Z при нажатии кнопки джоя № 12
    
    if ( PPJoy1.Digital9== 1)  {//кн №9 виртуального джоя №1 нажата, тогда:
    PPJoy1.analog0 = false      //оси виртуальног джоя №1 отвязаны от осей 
    PPJoy1.analog1 = false      // реального джоя
    PPJoy1.analog2 =  false
    }else {   // иначе (т.е. еслиPPJoy1.Digital9) не нажата, тогда:  
    PPJoy1.analog0 = Joystick1.X // оси виртуальног джоя 
    PPJoy1.analog1 = Joystick1.Y // привязаны к осям 
    PPJoy1.analog2 = Joystick1.Z //реального (состояние по умолчанию)
    
    }
    
    if (  pressed(Joystick1.Button12) ) { // включатель осей X Y Z
    toggle( PPJoy1.Digital9 ) // работает путём последовательного нажатия кн №12 реального джоя
    }

     

  7. В 10.12.2017 в 22:19, =SPb=Electric сказал:

    Ждем дальнейшего описания.

    Интересует: как присвоить несколько осей на одну ось джойстика. По нажатию кнопки (например)

    Или как присвоить оси джойстика к виртуальному. Что то недопонимаю.

    Рассмотрим по порядку.

    Присвоение осей  реального джоя виртуальному, в этих строчках

    PPJoy1.analog0 = Joystick1.X
    PPJoy1.analog1 = Joystick1.Y
    PPJoy1.analog2 = Joystick1.Z

    Означает, что оси виртуального джоя PPJoy1.analog№№ будут исполняться осями реального джоя Joystick1.№№

    Соответственно в конфиге, что находится в папке User должно быть так;

    AXE_RX JoystickDevice1=pitch
    AXE_RY JoystickDevice1=-radiator
    AXE_RZ JoystickDevice1=-power
    AXE_X JoystickDevice1=aileron
    AXE_Y JoystickDevice1=-elevator
    AXE_Z JoystickDevice1=rudder

    AXE_Y JoystickDevice2=trimrudder
    AXE_RX JoystickDevice2=-trimelevator
    AXE_X JoystickDevice2=trimaileron

    Конкретные оси подчёркнуты.

    Обратите внимание на номера девайсов.

      JoystickDevice1 это первый виртуальный джойстик.

    JoystickDevice2 это второй виртуальный джойстик.

    А вот настоящий джойстик (он обозначался бы так:  JoystickDevice0), вообще не прописывается.

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

    Теперь как назначить несколько виртуальных осей на одну.

    Естественно, нам понадобится реальная ось к которой будут подключены виртуальные.

    В нашем случае это  Joystick1.RZ- ось тяги реального джоя.

    Она может быть как у нас, не прописана в конфиге, либо может быть прописана.

    Можно сделать вот так:

    PPJoy1.analog3 = Joystick1.RZ
    PPJoy1.analog4 = Joystick1.RZ  

    Т.е. напрямую повесить виртуальные оси на реальную.

    Либо так:

    PPJoy1.analog3 = PPJoy1.analog5

    PPJoy1.analog4 =  PPJoy1.analog5

    Т.е. назначить виртуальные оси на виртуальную же ось.

     

     

  8. И.так., продолжим.

    Я вообще то думал давать инфу по блочно, т.е. по каждой функции отдельно, но вышло вот так.

    В принципе, что в лоб, что по лбу, можно теперь скрипт разбирать на цитаты.

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

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

  9. 5 часов назад, Kap сказал:

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

     

    
     // Оси джойстика и включатель осей X Y Z при нажатии кнопки джоя № 12
    
    if ( PPJoy1.Digital9== 1)  {
    PPJoy1.analog0 = false
    PPJoy1.analog1 = false
    PPJoy1.analog2 =  false
    }else {
    PPJoy1.analog0 = Joystick1.X
    PPJoy1.analog1 = Joystick1.Y
    PPJoy1.analog2 = Joystick1.Z
    
    }
    
    if (  pressed(Joystick1.Button12) ) { // включатель осей X Y Z
    toggle( PPJoy1.Digital9 )
    }
    //Список задействованных и свободных осей
    
    //PPJoy1.analog0 = Joystick1.X
    //PPJoy1.analog1 = Joystick1.Y
    //PPJoy1.analog2 = Joystick1.Z
    //PPJoy1.analog3
    //PPJoy1.analog4   Шаг
    //PPJoy1.analog5   Тяга
    //PPJoy1.analog6   Опорная ось сигнализации закрылков
    //PPJoy1.analog7  Радиатор
    
    //PPJoy2.analog0   Триммер Элеронов
    //PPJoy2.analog1   Триммер РВ
    //PPJoy2.analog2   Триммер РН
    //PPJoy2.analog3
    //PPJoy2.analog4
    //PPJoy2.analog5
    //PPJoy2.analog6
    //PPJoy2.analog7
    
    
    // Назначаем кнопки
    
    
    PPJoy1.Digital4 = Joystick1.Button7
    
    
    
    
    
    
    // Сигнализация оптимального положения РВ (Звуковая загрузка)
    
    var.int = round(MapRange(PPJoy1.analog1, -1, 1, 0, 200))
    if ( INRANGE (var.int, 140, 160 ) ) {
    playsound "d:\sounds\Windows XP Balloon"
    wait(500 ms)
    }
    
    //Управление триммером элеронов,срабатывает при крайних положениях РУС по крену
    
    var.int = round(MapRange(PPJoy1.analog0, -1, 1, 0, 100))
    if ( INRANGE (var.int, 00, 05 ) ) {
    PPJoy2.analog0 =  -1.00
    
    }
    if ( INRANGE (var.int, 10, 90 ) ) {
    PPJoy2.analog0 =  0.00
    
    }
    if ( INRANGE (var.int, 95, 100 ) ) {
    PPJoy2.analog0 =  1.00
    }
    
    //Управление триммером РВ,срабатывает при крайних положениях РВ
    
    var.int = round(MapRange(PPJoy1.analog1, -1, 1, 0, 100))
    if ( INRANGE (var.int, 00, 05 ) ) {
    PPJoy2.analog1 =  1.00
    
    }
    if ( INRANGE (var.int, 10, 90 ) ) {
    PPJoy2.analog1 =  0.00
    
    }
    if ( INRANGE (var.int, 95, 100 ) ) {
    PPJoy2.analog1 =  -1.00
    
    }
    
    //Управление триммером РН,срабатывает при крайних положениях РН)
    var.int = round(MapRange(PPJoy1.analog2, -1, 1, 0, 100))
    if ( INRANGE (var.int, 00, 05 ) ) {
    PPJoy2.analog2 =  -1.00
    }
    if ( INRANGE (var.int, 10, 90 ) ) {
    PPJoy2.analog2 =  0.00
    }
    if ( INRANGE (var.int, 95, 100 ) ) {
    PPJoy2.analog2 =  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  /* кнопка "смотреть через прицел" отпущена,
                                 переключение произошло */
    }
    
    // Взгляд по центру при нажатии кнопки джоя № 5
    
      if ( pressed(Joystick1.Button5) ) {  /*назначить в управление фритрека на функцию центр
      клавишу "Н" без фиксации*/
        Key.H = true
        wait(200 ms)
        Key.H = false
    }
    
    
    // Управление шагом - газом совмещённое с дырчем
    var.int = round(MapRange(-Joystick1.RZ, -1, 1, 0, 220))
    if ( INRANGE (var.int, 0, 10 ) ) {
    PPJoy1.analog3 =  -1.00
    playsound "d:\sounds\chimes"
    wait(500 ms)
    }
    
    if ( INRANGE (var.int, 30, 40 ) ) {
    PPJoy1.analog3 =  1.00
    PPJoy1.analog4 =  1.00
    }
    
    if ( INRANGE (var.int, 60, 70 ) ) {
    PPJoy1.analog3 =  1.00
    PPJoy1.analog4 =  0.45
    }
    
    if ( INRANGE (var.int, 90, 100 ) ) {
    PPJoy1.analog3 =  0.00
    PPJoy1.analog4 =  0.09
    }
    
    if ( INRANGE (var.int, 120, 130 ) ) {
    PPJoy1.analog3 =  0.60
    PPJoy1.analog4 =  -0.44
    
    }
    if ( INRANGE (var.int, 150, 160 ) ) {
    PPJoy1.analog3 =  1.00
    PPJoy1.analog4 =  -0.82
    }
    
    if ( INRANGE (var.int, 180, 190  ) ) {
    PPJoy1.analog3 =  1.00
    PPJoy1.analog4 =  -1.00
    }
    
    if ( INRANGE (var.int, 210, 220 ) ) {
    PPJoy1.analog3 =  -1.00
    playsound "d:\sounds\chimes"
    wait(500 ms)
    }
    
    // Фиксированная очередь
    
    
      if ( pressed(Joystick1.Button1) ) {  //при нажатии кнопки джоя № 1
        PPJoy1.Digital0 = true
        wait(230 ms)                       //длительность очереди в мс
        PPJoy1.Digital0 = false
     }
      if ( pressed(Joystick1.Button2) ) { //при нажатии кнопки джоя № 2
    
        PPJoy1.Digital1 = true            //длительность очереди в мс
        wait(250 ms)
        PPJoy1.Digital1 = false
     }
    
     Key.NUMPAD1 = PPJoy1.Digital0
     Key.NUMPAD2 = PPJoy1.Digital1
    //в ПУ  назначить на клавиши "NUMPAD1" и "NUMPAD2" нужное оружие
    
    
    //Управление радиатором  кнопка джоя № 9
    if (!var.running) { //
    var.t = 0.235       //
    var.running = true  //
    }
    if (HeldDown(Joystick1.Button9, var.t)) {
    var.b9HeldDown = true
    PPJoy1.Digital12 = Joystick1.Button9
    }else if ( pressed(Joystick1.Button9))  {
        PPJoy1.Digital13 = true
        wait(230 ms)
        PPJoy1.Digital13 = false
     }
      if (released(Joystick1.Button9)) {
    var.b1HeldDown = false
    PPJoy1.Digital12 = false
    PPJoy1.Digital13 = false
    }
    if ( pressed(PPJoy1.Digital12) ) {
    PPJoy1.analog7 = 0.5
    }
    if ( pressed(PPJoy1.Digital13) ) {
    PPJoy1.analog7 =1.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)
    
    }
    
    // Управление уборкой и выпуском шасси в том чи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
        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
        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
        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 ( pressed(PPJoy1.Digital11) ) {
        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
    
    
    }

     

  10. Согласен с чином про религиозность. Вот только пушки в подвесах отдельно от моторной настроить не удастся. Игра их будет сводить заодно с моторной, так, что всё по 400м, тогда и пулемёты можешь использовать для пристрелки.

  11. Будем двигаться дальше.
    Предположим такой сценарий: был обычный себе джой, например Лоджитек Экстрим 3Д, который приказал долго жить, по причине износа механики и резисторов.
    Джой был использован в качестве донора, для создания комплекта управления, состоящего из напольного РУСа, педалей и РУДа.
    Использовано то, что можно, а именно, контроллер и рукоятка РУСа, на осях поставлены датчики Холла.
    В наличии оказалось 3 оси по 512 отчётов, одна на 256, хатка и 12 кнопок, задача  - увеличить функциональость, такого скудного набора элементов.
    Сразу оговорюсь, буду рассуждать исходя из того, что я считаю правильным, т.е. из своих личных предпочтений, принимать которые за аксиому, совсем не обязательно.
    Значит начну с загрузки РУСа.
    Вот цитата из учебника для лётного состава "Практическая аэродинамика маневренных самолётов." М. 1977г.
    "...Лётная практика показывает, что лётчики дают хорошую оценку управляемости маневренного самолёта, если градиент усилия по перегрузке находится в пределах - (1 - 3) кгс, а значение градиента перемещения ручки не менее - (10-15) мм."
    Перевожу на более понятный, это когда на создание перегрузки в 1 единицу необходимо приложить к ручке усилие от 1 до 3 кг, а перемещение её при этом,  должно лежать в пределах 10-15 мм.
    Т.е. для создания перегрузки 3g необходимо (возьмём нижний предел) переместить РУС на 30мм, а он в свою очередь должен оказать сопротивление в 3кг.
    Понятно, почему лётчики из боя мокрые прилетали если по верхнему пределу посчитать.
    Мне это как то не очень нравится, вечер полётов будет равен походу в спорт зал.
    Там же в учебнике написано, что меньшие (и большие) усилия уже не информативны и в принципе, если они  меньше 1кг, то тогда могут быть  равны о, разницы уже нет и самолёт считается непригодным к маневренным полётам.
    Но такой случай рассматривается при отказах систем автоматического регулирования, и тогда лётчик вынужденно, должен пилотировать, опираясь только на величину перемещения РУСа.
    Вот я с самого начала так и пилотирую, все мои джои без пружин.  
    Но ручку без загрузки, нельзя отпустить, это не мышь (где остановил - там и лежит), она сразу падает и крафт естественно идёт за ручкой.
    А если надо освободить руку, ответить в чате, что то сделать и т.п?
    Значит надо предусмотреть эту возможность
    Что ещё можно предпринять для РУСа?
    По игре получается, что наиболее эффективное положение ручки, при котором потери Е на установившемся маневре минимальны, а перегрузка оптимальна,
    находится в пределах 40-60%% хода ручки от центра.
    Значит сделаем так, что когда ручка будет в нужном диапазоне, у нас будет звучать звуковой сигнал, и будет он звучать всё время, пока ручка из этого диапозона не выйдет.
    Мне это как бы не надо, но для начинающих пилотов будет полезно, что бы ручку не перетягивали, даже если они и с загрузкой летают.
    Ещё сделаем как на продвинутых джоях (например на СН), которые могут менять кривые на лету, т.е. при нажатии на кнопку джоя или клавишу, можно кратно уменьшить кривую отклика, для более прицельной стрельбы например.
    С РУСом вроде всё, нет, ещё вот, что.
    Привяжем-ка мы к нему триммера.
    Но не совместим, а именно привяжем, поясню зачем.
    Тут два фактора, на некоторых крафтах, МиГ-3 или Р-38, на большой скорости, поток зажимает руль высоты, РУС полностью выбран на себя, а руль не двигается, крафт нос не поднимает, тогда выкручивают триммер в помощь РВ.
    Второй случай, когда пилот в блеке, рули не действуют, а триммера действуют и многие этим пользуются.
    Для нашего случая это не подходит, нет под это физических осей, если создать виртуальные, то надо привлечь хотя бы 3 кнопки джоя для их управления.
    Да и сомнительное это дело, в блеке кнопки нажимать.
    Но и совмещать оси триммеров с основными осям не хорошо.
    Триммера инертны, отклоняются не мгновенно, а с определённой скоростью, это будет мешать пилотированию и стрельбе.
    И ещё, коль скоро джой без загрузки, то корректировочное триммирование не нужно, и триммера можно использовать только в том случае, если рули в крайних положениях.
    Вот теперь с РУСом всё.
    РУД сделаем по вышеизложенным принципам, на семь режимов ВМГ.
    Причём режимы шаг 0 - тяга 0, и шаг 0 -тяга 100, будут озвучены.
    Теперь обзор, предполагается использание Фритрека (дешево и сердито), но необходимо организовать ещё 3 функции, "смотреть через прицел",  "прильнуть к прицелу" и "широкоугольный обзор".
    Для удобства и экономии кнопок джоя, эти функции будет выполнять одна кнопка.
    Вот по такому алгоритму: кратковременное нажатие-"смотреть, через прицел"; удержание-"прильнуть к прицелу", после отпускания "широкоугольный обзор".
    У меня так уже давно, довольно комфортно.
    Ну и когда взгляд "прильнёт к прицелу", автоматически уменьшатся кривые отклика основных осей, например в 2раза, всё таки отсчётов то у нас маловато, так, что скомпенсируем откликом.
    Ещё нам понадобится кнопка, для функции "взгляд по центру", эта функция задаётся во Фритреке назначением клавиши, кнопкой джоя её назначить нельзя, а нам надо время от временя "центровать" взгляд и кнопка должна быть под рукой, т.е. на джое, что мы и сделаем.
    Теперь оружие, конкретно режимы огня, будем стрелять фиксированной очередью, одно нажатие гашетки - 3-5 выстрелов на ствол, как из пистолета, обосновывать почему так, не буду, много займёт места, если кому интересно, можете посмотреть в советском руководстве по стрельбе, главы "корректирование огня по трассе", "режимы огня" и "стрелковые расчёты" (лежит у нас на сервере в разделе "Учись студент" тема "пособия по которым учили стрелять...").
    Далее уборка и выпуск шасси в том числе вручную и аварийно, повесив на одну кнопку, нажали кратковременно, шасси убрались, в том числе и вручную, нажали и подержали-выпустились.
    Так же организуем управление закылками, и попробуем озвучить выпущеное положение (как у месса).
    Сделаем как на Сайтеке или СН, переключатель модов, там правда можно три мода переключеть, и для определения какой именно включён  есть цветовая подсветка.
    Нам, для удобства достаточно будет двух, а то можно запутаться.
    Ну вот вроде всё, если ещё чего в голову придет, упомяну в описании.
    Всё ожидаем скрипт, что то есть готовое, а что то надо придумывать, так, что займёт некоторое время.
    Вот кстати наш предполагаемый девас из фитингов , труб ПВХ , и Лоджитека, человек утверждает, что обошлось это ему (с джоем), в 1500р. и один вечер работы.

     

     

     

    222.jpg.14334098efcd5d7369e9318bfcca4145.jpg

  12. Полностью расписать тему не успел, поэтому закончу сейчас.

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

     if (Mouse1.present) {

    if (var.Mouse1_in = false) {

    var.Mouse1_Wheel = 5  //На сколько щелчков колеса мыши разбить ось джойстика

    var.Mouse1_mapZ = var.Mouse1_Wheel*120

    var.Mouse1_Z = var.Mouse1_mapZ/1

    var.Mouse1_in = true

    }

    var.Mouse1=1_deltaz = Delta(Mouse1.DirectInputZ)

    var.Mouse1_Z = var.Mouse1_Z + (var.Mouse1_deltaz)

    if var.Mouse1_Z < 0 then var.Mouse1_Z = 0

    if var.Mouse1_Z > var.Mouse1_mapZ then var.Mouse1_Z = var.Mouse1_mapZ

    Var.Mouse1_JZ = MapRange(var.Mouse1_Z, 0, var.Mouse1_mapZ, -1 ,1)

    }

     
    //Управление тягой и шагом совместно

     
    var.int = round(MapRange(PPJoy1.analog0, -1, 1, 0, 50)) // диапазон управляющей шкалы от 0 до 50 у.е. 

     
    if ( INRANGE (var.int, 00, 09 ) ) {  // нулевое положение колеса 

    PPJoy1.analog1 =  1.00  // шаг 100

    PPJoy1.analog2 =  -1.00  // тяга 0

    }

    if ( INRANGE (var.int, 10, 19 ) ) {  // первые шелчок 

    PPJoy1.analog1 =  1.00  // шаг 100

    PPJoy1.analog2 =  -0.44  // тяга 30

    }

    if ( INRANGE (var.int, 20, 29 ) ) {  // второй щелчок

    PPJoy1.analog1 =  0.00    // шаг 50

    PPJoy1.analog2 =  -0.08   // тяга 50

    }

    if ( INRANGE (var.int, 30, 39 ) ) { //  третий щелчок

    PPJoy1.analog1 =  0.60 //  шаг 80

    PPJoy1.analog2 =  0.45  // тяга 80

    }

    if ( INRANGE (var.int, 40, 49 ) ) {  // четвёртый щелчок

    PPJoy1.analog1 =  1.00  // шаг 100

    PPJoy1.analog2 =  0.83  // тяга 100

    }


     

    if ( INRANGE (var.int, 50, 60 ) ) {  // пятый (последий) щелчок

    PPJoy1.analog1 =  1.00  // шаг 100 (в данном случае эта строка не обязательна)

    PPJoy1.analog2 =  1.00  // тяга 110ги 110

    }

    PPJoy1.analog0 = Var.Mouse1_JZ       // Опорная ось управления Тяги и Шага, присвоена колесу мыши


    ************************************************************************************************************
    Как выглядит такое управление в игре?
    Например старт с земли, перед запуском двигателя, крутим колесо к себе, неважно на сколько щелчков, главное, что бы их было не меньше 5.
    Игра напишет "Тяга 0", далее действуем как обычным РУДом.
    При старте в воздухе, наоборот, крутим колесо вперёд до тяги 110, далее как обычно. 
    Для резкого увеличения или уменьшения тяги, просто крутим колесо в соответствующюю сторону, не заботясь о количестве щелчков.
    Ось будет управляться сразу, без мёртвых щелчков, например при сбросе тяги сделано 15 щелчков, но всё равно при добавлении тяги значения будет изменятся сразу с первого щелчка . 
    В общем имеем пульт управления по принципу обычного РУДа,  последовательно и сразу, задающего оптимальные значения для ВМГ..

    Вышеприведенный скрипт, является адаптированной к колесу мыши версией скрипта, который я использую для управления ВМГ при помощи Сайтековского РУДа.
    В принципе любой РУД может так работать. 


     

  13. Вот наконец то добрался до компа, много написать не смогу, вставать то в 6.00. посему планирую писать на работе. Ну как вижу реакция уже есть, отрицательная (скорее насмешливая) в том числе, это славно, это лакмусовая бумажка. Критика того, чего ещё не видел, это здорово, как там: «не читал, но осуждаю». Ничего, каждый имеет право на собственное мнение и каждый может ошибаться, это нормально, в конце концов, кто не без греха? Я в том числе.

    Теперь по сути, вджой и фрипи не в моей компетенции, т.е. я ими не занимался, но не думаю, что там очень уж большая разница.

    Немного о том откуда ноги растут (у меня).

    Первый раз столкнулся с софтом когда купил лоджитек зд.

    Был он там примитивный, но кнопки шифт, альт и контрол, там назначить было можно, что автоматически увеличивало количество кнопок на джое почти в три раза!

    Джой погиб (резюки), на замену был куплен Сайтек Х52, переделана механика и я познакомился с его софтом.

    Было шикарно!

    Можно было всё настроить под себя.

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

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

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

    Потом был куплен СН файтерстик, там роскошная скриптовая база, масса виртуальных осей и кнопок, сказка!

    Но опять «НО», копм мой, в упор не видел этого софта, слюни капали не клаву, т.е. глаз видит, да зуб неймёт, по точности стрельбы он похуже Х52, в два раза меньше отсчётов на осях.

    Однако бацилла уже проникла, хотелось комфорта, знаете, мозги тогда разгружены, летается легче.

    И вот, лет наверное 6 назад, на тогда ещё живой корбине (песочнице) попался товарищ, ник не помню точно, толи кекс, то ли кокс или что то в этом роде.

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

    Так вот от него я узнал про Гловпай, ну а дальше интернет, УХУ и т.д.

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

    Замечу, для чистоты эксперимента, об использовании мышей, речь не шла, ибо джоев имею (рабочих), аж три (Х52, СН, МСФФБ), плюс сайтековские педали (как то накопились с 2004 года).

     

     

    Теперь приступим помолясь.

     

    Из недавнего, простенького.

    Как то, в начале года, меня спросили совета как помочь человеку, он летает кстати и на Алексе.

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

    Но мышка за один щелчок изменяет тягу на 2 (или 3) %.

    Представляете , от 0, до 110%% тяги …55 щелчков, постоянный перегрев или недобор мощности, а об оперативном сбросе газа вообще речи нет, дуэль-пытка, а хочется…

    Как не помочь человеку, быстренько сделал скриптик.

    Товарищ пожелал, что бы за один щелчок тяга изменялась на 20%, т.е. от 0 до 110 за 6 щелчков.

    Надо сказать, что гловпай и ппджой у него уже был установлен.

    Вот скрипт:

     

    //Прямое управление  тягой с помощью колёсика мыши

     

     if ( Mouse.WheelDown ) {

      Key.NumpadMinus = true

      wait(50 ms)

      Key.NumpadMinus = false

      Key.NumpadMinus = true

      wait(50 ms)

      Key.NumpadMinus = false

      Key.NumpadMinus = true

      wait(50 ms)

      Key.NumpadMinus = false

      Key.NumpadMinus = true

      wait(50 ms)

      Key.NumpadMinus = false

      }

     if ( Mouse.WheelUp ) {

      Key.NumpadPlus = true

      wait(50 ms)

      Key.NumpadPlus = false

      Key.NumpadPlus = true

      wait(50 ms)

      Key.NumpadPlus = false

      Key.NumpadPlus = true

      wait(50 ms)

      Key.NumpadPlus = false

      Key.NumpadPlus = true

      wait(50 ms)

      Key.NumpadPlus = false

      }

     

    Это конечно примитив, но очень простой и надёжный.

    Алгоритм работы следующий: в Управлении игры на значении уменьшить тягу назначается клавиша NumpadMinus цифровой панели и соответственно на значение увеличить тягу назначается NumpadPlus.

    Однако однократное нажатие этих клавиш изменяет тягу всего на 5%, следовательно, надо заставить программу делать за один щелчок мыши, 4 нажатия клавиш, что она и выполняет с интервалом между нажатиями в 50 миллисекунд.

     

    Но после пошёл немного дальше, чем требовалось.

    Обещал всё подробно обьяснять, значит выполняю, тут небольшое отступление.

     

    Какой вообще принцип управления ВинтоМоторной Группой?

    Зависит от задачи, на маршрутном полёте шаг должен соответствовать тяге, причём при тяге 80% и таком же шаге, радиатор можно открывать всего на 20% (управление радиатором отдельная тема, даст Бог, и до этого доберёмся), при этих же значениях и полностью открытом радиаторе, лучше всего остужать двигатель во время боя без большой потери тяги.

    Для экономного полёта на дальность или с повреждённым двигателем, лучше 50 на 50.

    Для устойчивого управления на глиссаде, в том числе и для посадки на авианосец, достаточно 30% тяги, но шаг должен быть 100%, потому, что при меньшем его значении ( опираюсь на определение шага, как его даёт игра), крафт будет очень летучий, даже с закрылками в посадку.

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

    Ну и при тяге 100-110%, шаг тоже должен быть 100%, что бы можно было снять с мотора полную мощность.

    Что у нас получилось?

    На всё про всё (исключая полёты строем), нам необходимы такие параметры для ВМГ:

    Тяга     0 – Шаг 100; (пропуск противника при торможении, касание и пробег при посадке)

    Тяга   30 – Шаг 100; (посадочная глиссада)

    Тяга   50 – Шаг 50;   (полёт на максимальную дальность, мало топлива, повреждённый двиг)

    Тяга   80 – Шаг 80;   (полёт с максимальной мощностью мотора, без риска перегрева)

    Тяга 100 – Шаг 100; (воздушный бой, плановый климб)

    Тяга 110 – Шаг 110; ( здесь всё и взлёт, и бой, и климб на вторых режимах, и догон, и выход из боя)

    Это на все случаи жизни и всего пять шелчков мыши.

    Для гурманов можно добавить по одной позиции сверху и снизу списка:

    Тяга 0 – Шаг 0; (для зуммером, для точного доворота перед стрельбой, тогда не возникает ощутимых реактивного и гироскопического моментов винта, которые этому довороту мешают, а так же для безмоторного планирования на максимальную дальность).

    Тяга 110 – Шаг 0; ( кратковременный режим для любителей дырча, при догоне или отрыве, при необходимости ещё чуть чуть подпрыгнуть не вертикали, и для создания отрицательной перегрузки на самолётах с поплавковыми карбюраторами типа Ишаки и Спиты).

    Правда в описываемом случае такая задача не стояла, об этом позже.

    Здесь задача посложнее.

    Колёсико одно, а управлять должно двумя осями, причём управлять специфичиски, изменяя шаг в противоположные стороны.

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

    Итак напомню, что глопай и ппджой уже стояли.

    Для осуществления задуманного понадобилось 3 оси ппджоя (их там можно 8 поставить).

    Перво наперво, нужно отвязать колесо мыши от мыши (простите за тавтологию), вот скрипт:

     

     

     if (Mouse1.present) {

    if (var.Mouse1_in = false) {

     

    var.Mouse1_Wheel = 5  //На сколько щелчков колеса мыши разбить ось джойстика

    var.Mouse1_mapZ = var.Mouse1_Wheel*120

    var.Mouse1_Z = var.Mouse1_mapZ/1

    var.Mouse1_in = true

    }

    var.Mouse1=1_deltaz = Delta(Mouse1.DirectInputZ)

    var.Mouse1_Z = var.Mouse1_Z + (var.Mouse1_deltaz)

    if var.Mouse1_Z < 0 then var.Mouse1_Z = 0

    if var.Mouse1_Z > var.Mouse1_mapZ then var.Mouse1_Z = var.Mouse1_mapZ

    Var.Mouse1_JZ = MapRange(var.Mouse1_Z, 0, var.Mouse1_mapZ, -1 ,1)

     

    }

     

    Всё мышь отвязана и при включенном скрипте ,вращение колеса, это вращение оси.

    Далее нам понадобятся три оси, почему три, а не две?

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

     

     

    PPJoy1.analog0 = Var.Mouse2_JZ       // Опорная ось управления Тяги и Шага

     

    //Управление тягой и шагом совместно

     

    var.int = round(MapRange(PPJoy1.analog0, -1, 1, 0, 50))

     

    if ( INRANGE (var.int, 00, 09 ) ) {

    PPJoy1.analog1 =  1.00

    PPJoy1.analog2 =  -1.00

    }

    if ( INRANGE (var.int, 10, 19 ) ) {

    PPJoy1.analog1 =  1.00

    PPJoy1.analog2 =  -0.44

    }

    if ( INRANGE (var.int, 20, 29 ) ) {

    PPJoy1.analog1 =  0.00

    PPJoy1.analog2 =  -0.08

    }

    if ( INRANGE (var.int, 30, 39 ) ) {

    PPJoy1.analog1 =  0.60

    PPJoy1.analog2 =  0.45

    }

    if ( INRANGE (var.int, 40, 49 ) ) {

    PPJoy1.analog1 =  1.00

    PPJoy1.analog2 =  0.83

    }

     

    if ( INRANGE (var.int, 50, 60 ) ) {

    PPJoy1.analog1 =  1.00

    PPJoy1.analog2 =  1.00

    }

     

     

    Вот собственно и всё со скриптом, ось PPJoy1.analog1 будет осью шага, а ось PPJoy1.analog2 – осью тяги.

    Ещё один момент, если в скрипте, оси поменять местами, ну вот так

     

    if ( INRANGE (var.int, 50, 60 ) ) {

    PPJoy1.analog2 =  1.00

    PPJoy1.analog1 =  1.00

     

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

    Теперь надо всё это хозяйство засунуть в игру через конфиг. Через Тим вивер открыл конфиг, там в секции осей, была такая расфасовка девайсов:

    Джойстик определялся как  JoystickDevice0;

    Авто педали как                    JoystickDevice1

    Вручную пришлось прописать оси ппджоя, т.е. добавить 2 строчки:

     

    AXE_Y JoystickDevice2= pitch

    AXE_Z JoystickDevice2=power

     

    И на этом всё!

     

     

  14. Однако, здравствуйте!(с):hi:
    Начну издалека.
    Да здравствует Свобода, Равенство и Братство! 

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

    Равенство. 
    Надо всё же признать, что полного равенства между дешёвым джоем и ядрёным напольником от ВКБ (к примеру), всё равно не будет, но её ( разницу), можно минимизировать, путём расширения функциональности более простого джоя. 
    Кроме того, у многих продвинутых джоев,  есть Софт от производителя, как к примеру на Сайтеках, СН-ах и других. 
    Это удобно, можно настроить любую функцию управления по свому вкусу.
    Но владельцы джоев попроще, в основном не имеют этих  удобств, которые кстати не являются читами, но очень помогают в полёте и в бою.
    В конце концов, пусть уж будет некоторая разница в конструкциях, в кривых отклика,  в количестве отсчётов, но пусть её не будет (ну почти) в удобстве управления.
    Для этого я и собираюсь написать цикл (скорее микст), посвящённый программе GlovePIE, которая позволят улучшить функциональность ЛЮБОГО  устройства управления.
    Буду делать это исключительно для того ( 2 недели на работе сидеть, надо же чем то заняться), что бы создать условия для наступления

    Братства.
    Когда уважается любой, на чём бы он не летал, лишь бы в удовольствие.
    Хоть я не настолько наивен, что бы всерьёз на это надеятся, вспомнить хотя бы перепирательства джоеводов и мышеводов.
    До сих пор сентенции первых вызывают улыбку, по поводу их, якобы правдоподобия, настоящему управлению.
    Как будто способ хвата и наличие загрузочных пружин, педалей, это чуть ли не реал, а их отсутствие, чуть ли не чит. 
    Джойстик с обратной связью, ещё хоть как то можно считать похожим на реал (некое подобие взаимосвязи нагрузки на РУС от скорости полёта , угла атаки крыла и величины отклонения рулевых поверхностей ), но по опыту использования (MSWFFB), летать то можно и даже интересно, но воевать очень тяжело, особенно стрелять на критических режимах.
    Так что, по большому счёту, даже то, что с обратной связью, имеет к реальному управлению такое же отношение, как пластилиновый макет к оригиналу, а уж без неё и вовсе, вроде рисунка (или фото).
    Спорить же о том, чем "правильный" рисунок должен быть нарисован,карандашём или фломастером, извините, не серьёзно.
    Поэтому, мне  всё равно, при помощи чего управляет человек, было бы ему удобно.
    Это мой базовый принцип, оспаривать его БЕСПОЛЕЗНО, так как это вопрос веры.:ca:

    Чего не будет.
    Не буду рассказывать где взять и как установить гловпай и ппджой, в инете этого навалом, тем более, что у меня ХР, а не семёрка или десятка.
    Не буду давать уроки написания скриптов, это скучно, да и не всем интересно., 
    Не будет какой либо системы изложения, это не научный труд или пособие, можно считать подобием эссе, что в голову пришло, то и написал.
    Не будет споров на предмет нужно не нужно, по принципу, не нравится - не читай.

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


     

    • Upvote 1
  15. Не совсем понятно, что ты хочешь улучшить, то ли процент попаданий, то ли хочешь с большой дистанции попадать. То ли "то и другое и можно без хлеба." (с). Сначала по тексту, у лавок, а тем более спитов, баллистика пушек лучше чем у мессера, тем более если спрелять не в горизонте, а вверх или вниз. Тебя скорее всего достают снизу, коль ты на мессере, потому климбяший месс, на дистанции 500-700м (про ближе вообще молчу), достаточно лакомая мишень. Это раз, второе, пушка у месса по упреждениям всё же ближе к кобриной м4, правда в отличие от последней имеет рассеивание. Причём лента снаряжается тремя видами боеприпасов и каждый имеет свой вес, и баллистику.  В реале месс пристреливали на 400м. Так что, попасть на дальней дистанции, можно при соблюдении двух условии (предполагается, что прицеливание произведено правильно), нужно иметь малый ракурс ( не более 1/4) и достаточно длинную очередь, что бы компенсировать рассеивание.  Заградительный огонь рассматривать  не буду. Как ты догадался, что процент попаданий будет низкий. Если хочешь его улучшить, то тогда стреляй по другому. Дистанция начала стрельбы должна быть не более 200м, длительность очереди (даже при ракурсе 0/4), не более 0,5 сек. Три короткие очереди по 3-5 выстрела на ствол, дадут процент попаданий в три раза выше, чем одна длинная на 15 выстрелов. Вообще то тема объёмная, но коротенько так.

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

    • Upvote 1
  16. Добрался до компа наконец. Итак, по честному, летать я начал ещё до того как АЛЕКС появился, поэтому свой моральный кодекс у меня тоже давно устоялся, в тоже время, как говорится, "в чужой монастырь со своим уставом..." Рассуждать ведь можно до бесконечности и всё равно к консенсусу не прийти. Поэтому мне проще поставить конкретный вопрос и получить конкретный ответ, которым я, и буду руководствоваться. Всегда лучше иметь чёткое понимание правил игры, чем додумывать их самому. Для себя же я оставляю право на милосердие, а в остальном, должен знать, что можно, и что нельзя. Если же мои рассуждения могут как то изменить некоторые правила, тогда - да, можно поговорить, но так по моему, вопрос не стоит. Посему, жалательно получить ответ, причём безо всяких обьяснений. Просто:  "да можно" или "нет нельзя".

    П.С. Вообще то я и думать не мог, что такие прописные истины (во всяком случае для меня), у меня вызовут вопросы, но вот последний случай (=ES7= vs bull) меня поставил в тупик. Поясню, я в таких ситуациях не атакую и считаю, что атака всего, что там летает (или летит к ) возле своего филда с АНО, да ещё с дымом, это не спортивно, но получается, что я ошибался. Поэтому ошибаться больше не хочу, хочу знать точно.

    • Upvote 2
  17. Каюсь, действительно не прочёл, теперь вот относительно угла захода на посадку всё стало понятно, т.е. если  не в створе полосы, то ничего садящегося (кроме порядочности атакующего) не спасает, жаль, что я раньше не сообразил прочитать этот пункт. И всё же вопрос один имею, не разъяснено а на какой дистанции от филда, садящийся самолёт будет считаться на глиссаде? Ну вот к примеру: можно выпустить шасси и закрылки и лететь на посадочной скорости, за 1-2-3-4-5 и т.д. кмот филда и это всё будет глиссада или нет? Чётких указаний я не нашёл. Ещё вариант - неудачный заход, например полоса занята или не правильный расчёт, или повреждено управление, садящийся уходит на второй круг, тогда согласно определению его можно сбивать, правильно я понимаю?  Так как ситуация скользкая, вот он идет на посадку, и я его не трогаю, но вот он не смог сесть и как только пролетел полосу и начал разворот, я его могу атаковать, всё я правильно понял? Прошу ответить.

    • Upvote 1
  18. Посмотрел и я ролик, вот что думаю, если первую атаку ещё можно трактовать двояко, то вторая (на 27сек), однозначно нарушение. В момент атаки, расстояние атакуемого от посадочной полосы, всего два километра. Ссылка на несоосность направлений полёта и посадочной полосы, несерьёзна, посадка произведена в границах лётного поля, как раз соосно полосе (впрочем можно было и поперёк сажать при такой то ширине, да на брюхо). Между началом второй атаки и полной остановкой садящегося самолёта, прошло всего 49 сек (1мин 16 сек ролика). интересно, а была бы ещё одна атака, если бы крыло не отбила зена и как бы она трактовалась?  Резюме: Первая атака может считатся правомерной, вторая нет. Я надеюсь высказывание собственного мнения приветствуется?

    • Upvote 1
×
×
  • Создать...