Получение значения 0..255 от своих минимальных и максимальных значений

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
91
Реакции
141
Помог
1 раз(а)
Всех приветствую, не думал что буду спрашивать помощь на форуме, но все же пришлось.
Впервые работаю с контроллерами и столкнулся с такой проблемой, что мне для плагина Sentry Guns нужно регулировать контроллеры в зависимости от того, куда смотрит сама пушка. В модели есть для этого контроллеры и вроде бы все окей, но, прочитав, как работает var_controller, я узнал, что туда можно вписывать значения от 0 до 255

Проблема в чем, в модели есть 3-4 контроллера, которые регулируются по осям но со значениями не 0-255, а например от -50 до 50. Значит мне нужно сделать так, чтобы -50 это было бы 0, а 50 это было бы 255. Значение 0 из модели, по коду это будет 127 (ну или 128, кому как удобнее), повозившись в калькуляторе, пришел к реализации такого кода.

C-like:
bool: CSentryGun__SetController( const pEntity, const iController, iValue = 0, const iMinMaxValue[ 2 ] = { 0, 255 } )
{
    if ( is_nullent( pEntity ) )
        return false;

    iValue = clamp( iValue, iMinMaxValue[ 0 ], iMinMaxValue[ 1 ] );

    new Float: flAverage = ( iMinMaxValue[ 0 ] ) < 0 ? 127.5 : 255.0;
    new Float: flNewValue = Float: ( flAverage / iMinMaxValue[ 1 ] * iValue );

    if ( flAverage != 255.0 )
        flNewValue += flAverage;

    set_entvar( pEntity, var_controller, floatround( flNewValue ), iController );
    return true;
}

// Use
CSentryGun__SetController( pEntity, 1, 0, { -50, 50 } );
Уважаемые знатоки, может быть есть какой либо другой вариант реализации данного кода, который на много легче/удобнее?
 
Последнее редактирование:
  • Не нравится
Реакции: Arni
Сообщения
855
Реакции
532
Помог
13 раз(а)
Faktor

давай кидай приваты 👋
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Тебе через пропорцию нужно высчитывать процент для одного случая (-50..50) в зависимости от текущего значения, а потом для 2 случая (0..255) этот процент применить и получить значение. Ну или наоборот, смотря как стоит задача.
Такое соотношение регуляции по оси будет наиболее точным и эквивалентным друг другу при корреляции этих двух случаев.
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
434
Реакции
296
Помог
5 раз(а)
C-like:
floatround((iVal / 256 * 101) - 50)
256 - длина исходного отрезка
101 - длина конечного отрезка
50 - сдвиг отрезка (чтобы от -50 начиналось)

P.S. не совсем уверен что норм, но вроде должно быть норм)
 
Последнее редактирование:
Сообщения
91
Реакции
141
Помог
1 раз(а)
ArKaNeMaN, твой код получает от значения 0..255 число в контроллере (из модели, то есть от -50 до 50), а нужно наоборот, чтобы я от -50 до 50 получал бы число от 0 до 255 и уже устанавливал бы в var_controller.
Теперь мне нужно думать, как из этой формулы сделать действие наоборот :scratch_one-s_head:
 
Сообщения
106
Реакции
222
Помог
1 раз(а)
Проще всего рекомендую переделать модель и сделать 0 360 контроллер
В итоге у себя я так и сделал))
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
434
Реакции
296
Помог
5 раз(а)
t3rkecorejz, поменять местами длины отрезков. И сдвиг делать от исходного в обратную сторону
 
Сообщения
106
Реакции
222
Помог
1 раз(а)
t3rkecorejz, Не сможешь модель в лс дать? Глянуть интересно, кто делает по 3-4 контроллера
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
434
Реакции
296
Помог
5 раз(а)
C-like:
(iVal + 50) / 100 * 256
 
Сообщения
91
Реакции
141
Помог
1 раз(а)
Итоговый код
C-like:
bool: CSentryGun__SetController( const pEntity, const iController, Float: flValue = 0.0, const Float: flMinMaxValue[ 2 ] = { 0.0, 255.0 } )
{
    if ( is_nullent( pEntity ) )
        return false;

    // Чтобы входное значение не вышло за пределы
    flValue = floatclamp( flValue, flMinMaxValue[ 0 ], flMinMaxValue[ 1 ] );

    new Float: flLength = floatabs( flMinMaxValue[ 0 ] ) + flMinMaxValue[ 1 ];
    flValue = ( ( flLength / 2.0 + flValue ) / flLength ) * 255.0;

    set_entvar( pEntity, var_controller, floatround( flValue ), iController );
    return true;
}
Спасибо всем и особенно ArKaNeMaN , можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу