Модератор форума: Slon |
Форум РЕДАКТОР - ArmA 2 Скрипты Вопросы по скриптописанию (Тонкости написания скриптов) |
Вопросы по скриптописанию |
› Понедельник
› 06.05.2013
› 07:01
› Сообщение #
Цитата бот задирает орудие вверх unit doWatch position http://community.bistudio.com/wiki/doWatch Цитата начинает им мотылять как шлагбаумом, при этом паля из пушки. тут можеш посмотрет способ наведения http://arma.at.ua/forum/46-3085-1 для гаубицы Д30 нармально попадает на дистанции дальше 2 Км гаубица - Gb1 мишень - tg1 _pg = getPosASL Gb1; _pt = getPosASL tg1; _h = (_pt select 2) - (_pg select 2); _l = _pg distance _pt; _a1 = 0.5 * asin (_l /(260 ^ 2 / 10)); _h2 = _h + _l * tg _a1; hint str _l; (gunner Gb1) doWatch [_pt select 0, _pt select 1, _h2]; sleep 4; Gb1 Fire "d30"; |
› Понедельник
› 13.05.2013
› 21:31
› Сообщение #
Наверное так и было. Исправил. Вроде работает. Вот скрипт, может пригодится кому-нибудь (все-таки столько дней ум наизнанку выворачивал).
// наведение и выстрел из орудия M119 по неподвижной цели // Параметры, активация: at = [имя корректировщика, имя орудия] execVM "fire.sqf" _eye = _this select 0; _Gb1 = _this select 1; // координаты орудия _pg = getPosASL _Gb1; // корректировщик увидел цель _Array =_Gb1 nearTargets 5000; // для выявленных целей _n = 0; { // цель обстрела _unit = _Array select _n; _n = _n + 1; sleep 1; // координаты цели _pt = _unit select 0; // сторона цели _side = _unit select 2; // если сторона цели - ВОСТОК, то if ( _side == EAST ) then { // разность высот _h = (_pt select 2) - (_pg select 2); // расстояние до цели _l = _pg distance _pt; // начальная скорость снаряда _Vo = 248; // угол возвышения, относительно расстояния _a1 = 0.5 * asin (_l /(_Vo ^ 2 / 9.81)); // коэффициент поправки на разность высот if ( 4100 > _l ) then {_C = 3}; if (( 4100 < _l ) && ( _l <= 4400 )) then { _C = 4 }; if (( 4400 < _l ) && ( _l <= 4800 )) then { _C = 5 }; if (( 4800 < _l ) && ( _l <= 5000 )) then { _C = 6 }; if (( 5000 < _l ) && ( _l <= 5300 )) then { _C = 7 }; if (( 5300 < _l ) && ( _l <= 5400 )) then { _C = 8 }; if (( 5400 < _l ) && ( _l <= 5600 )) then { _C = 9 }; if (( 5600 < _l ) && ( _l <= 5700 )) then { _C = 11 }; if (( 5700 < _l ) && ( _l <= 5800 )) then { _C = 12 }; if (( 5800 < _l ) && ( _l <= 5900 )) then { _C = 14 }; if (( 5900 < _l ) && ( _l <= 6000 )) then { _C = 16 }; if (( 6000 < _l ) && ( _l <= 6100 )) then { _C = 24 }; if (( 6100 < _l ) && ( _l <= 6200 )) then { _C = 36 }; // поправка на разность высот _a2 = 0,001 * _C * (_h/100); // угол возвышения ствола _a = _a1 + _a2; // поправка по вертикали _h2 = _l * tg _a + 1; // наведение (gunner _Gb1) doWatch [_pt select 0, _pt select 1, _h2]; sleep 2; // выстрел _a = 0; While {_a < 10} do { _Gb1 fire "M119"; sleep 4; _a = _a + 1; }; }; } forEach _Array; Добавлено (13.05.2013, 21:18) --------------------------------------------- Меня вновь торкнуло. Раз уж помощь получал от Slonа, вопрос пожалуй к нему. На этот раз вопрос по упреждению. Т.е. выстрелить по предполагаемому положению цели. Принимаем движение цели как прямолинейное, равномерное, на однойвысоте, иначе предсказать положение цели невозможно. Тогда изменение координаты X будет равномерным, а значит зависимость изменения X от t (времени) будет линейной и будетописываться уравнением: F(X)=Axt+Bx Аналогично находим уравнение изменения координаты Y:F(Y)=Ayt+By Для нахождения необходимых членов уравнений определим координаты цели вначальный момент времени: Затем, через фиксированный отрезоквремени (например, через 3с) определим координаты еще раз: _t0 = time; _pt0 = getPos tg1; Sleep 3; _t1 = time; _pt1 = getPos tg1;Теперь у нас есть две точки скоординатами: A(X0;Y0;Z0) и B(X1;Y1;Z1). Пренебрегаем координатой Z (т.к. мы приняли перемещение цели на одной высоте).Тогда начальные и конечные координаты цели: _x0 = (_pt0select 0); _y0 = (_pt0select 1); _x1 = (_pt1 select 0); _y1 = (_pt1 select 1); _z2 = (_pt1 select 2);Найдем зависимость X(t): Ax = (X1-X0)/(t1-t0); Bx= X0-((X1-X0)/(t1-t0))*t0; Или: _Ax = (x1-_x0)/(_t1-_t0); _Bx = _x0 – ((_x1 – x0) / (_t1 -_t0))*_t0; _x2 = _Ax*_t2 + _Bx;Зависимость Y(t) будет иметь вид: _Ay = (y1-_y0)/(_t1-_t0); _By = _y0– ((_y1 – y0) / (_t1 -_t0))*_t0; _y2 = _Ay*_t 2 + _By; Здесь _t 2 –время от начального момента до предполагаемого поражения цели , а _x2 , _y2, _z2 - предполагаемые координаты цели через время _t2. _t2 = _t + (_t1-_t0); Время _tзадается вручную и должно учитывать одно из больших: · время на доворот орудия (пусть 2с); · время на перезарядку (я насчитал до 8с); Сварганил скрипт, но не работает. Как так? Добавлено (13.05.2013, 21:31) --------------------------------------------- Что-то у меня с абзацами не то! |
› Вторник
› 14.05.2013
› 08:22
› Сообщение #
Это в реале нужны две точки чтобы определить скорость и направление. В АА для этого есть спец команды
перемещение за 1 сек http://community.bistudio.com/wiki/velocity скорость км/ч http://community.bistudio.com/wiki/speed направление http://community.bistudio.com/wiki/getDir остаётся вычислить току пересечения Формула такая параметры C - стрелок M - мишень V1 - скорость полёта снаряда V2 - скорость движения мишени L - расстояние от стрелка до мишени a - угол меж прямой СМ и направлением движения М (V1 - V2) * 2 cos a * (L / V1) = T (время до точки встречи) далее, используем вектор мишени для получения координат точки _c0 = velocity M; _ps = getPosASL M; _cM = [ (_ps select 0) + (_c0 select 0) * T, (_ps select 1) + (_c0 select 1) * T, (_ps select 2) + (_c0 select 2) * T ]; в этой точке мишень будет через время Т можно наводить |
› Вторник
› 14.05.2013
› 14:17
› Сообщение #
|
› Вторник
› 14.05.2013
› 14:28
› Сообщение #
alex70-03, попробуй так, сейчас нет времени проверять, но у меня работает.
Просто скопировал из миссии. |
› Вторник
› 14.05.2013
› 14:42
› Сообщение #
|
› Среда
› 15.05.2013
› 13:34
› Сообщение #
Сразу сообщу: скрипт работает. Попадания не так точны как при стрельбе по неподвижным целям, но по машинам, танкам попадает с 4-5 раз (при режиме скорости "ограничено"). По катерам - при любом режиме. Эффективность небольшая, но динамизма добавляет. Сначала завязался с расчетом времени до точки встречи снаряда и цели, но потом от этой идеи отказался (не смог увязать все варианты движения цели относительно орудия); просто задал время вручную - 10с. Возможно кто-то решит еще поколдовать, тогда сам скрипт:
// наведение и выстрел из орудия M119 по подвижной цели // Параметры, активация: at = [имя цели, имя орудия, время между выстрелами] execVM "M119upr.sqf" _tg1 = _this select 0; _Gb1 = _this select 1; _T = _this select 2; while {alive _tg1} do { // координаты стрелка и цели _pg = getPosASL _Gb1; _pt = getPosASL _tg1; // скорость цели _Vt = velocity _tg1; // предполагаемая позиция цели _cM = [ (_pt select 0) + (_Vt select 0) * _T, (_pt select 1) + (_Vt select 1) * _T, (_pt select 2) + (_Vt select 2) * _T ]; // разность высот _h = (_cM select 2) - (_pg select 2); // расстояние до цели _l = _pg distance _cM; // начальная скорость снаряда _Vo = 248; // угол возвышения, относительно расстояния _a1 = 0.5 * asin (_l /(_Vo ^ 2 / 9.81)); // коэффициент поправки на разность высот if ( 4100 > _l ) then {_C = 3}; if (( 4100 < _l ) && ( _l <= 4400 )) then { _C = 4 }; if (( 4400 < _l ) && ( _l <= 4800 )) then { _C = 5 }; if (( 4800 < _l ) && ( _l <= 5000 )) then { _C = 6 }; if (( 5000 < _l ) && ( _l <= 5300 )) then { _C = 7 }; if (( 5300 < _l ) && ( _l <= 5400 )) then { _C = 8 }; if (( 5400 < _l ) && ( _l <= 5600 )) then { _C = 9 }; if (( 5600 < _l ) && ( _l <= 5700 )) then { _C = 11 }; if (( 5700 < _l ) && ( _l <= 5800 )) then { _C = 12 }; if (( 5800 < _l ) && ( _l <= 5900 )) then { _C = 14 }; if (( 5900 < _l ) && ( _l <= 6000 )) then { _C = 16 }; if (( 6000 < _l ) && ( _l <= 6100 )) then { _C = 24 }; if (( 6100 < _l ) && ( _l <= 6200 )) then { _C = 36 }; // поправка на разность высот _a2 = 0,001 * _C * (_h/100); // угол возвышения ствола _a = _a1 + _a2; // поправка по вертикали _h2 = _l * tg _a + 1; // наведение (gunner _Gb1) doWatch [_cM select 0, _cM select 1, _h2]; sleep 4; // выстрел _Gb1 Fire "M119"; }; if (true) exitWith {}; Slon, СПАСИБО. alex70-03, может ты вписал вместо корректировщика имя своей цели? В сообщении #709 пример скрипта, при котором орудие (имя 2) уничтожает цели, которые видит корректировщик (имя 1), т.е. ставишь наблюдателя, где-то орудие и, как только срабатывает скрипт, орудие М119 уничтожает неподвижные цели (сторона - ВОСТОК), которые видит наблюдатель. |
› Среда
› 15.05.2013
› 20:43
› Сообщение #
|
› Среда
› 15.05.2013
› 21:30
› Сообщение #
alex70-03,
_Gb1 Fire "M119"; тут надо указать название орудия. |
› Среда
› 15.05.2013
› 22:31
› Сообщение #
Что-то у меня тоже не то. Разбираюсь. Работал же!!!!
Добавлено (15.05.2013, 22:31) |
› Четверг
› 16.05.2013
› 08:31
› Сообщение #
|
› Четверг
› 23.05.2013
› 16:06
› Сообщение #
Slon, помоги с условием. Дело вот в чем:
при создании модулем гражданских в селениях, необходимо условие на проверку в триггере вот какое, если в данном селении будет убит один или три гражданских. |
› Четверг
› 23.05.2013
› 21:25
› Сообщение #
одним тригером не отделаешься. Надо на каждого вешать ЕХ.
|
› Пятница
› 24.05.2013
› 06:04
› Сообщение #
Slon, и все же по поводу убийства гражданских в модуле, объясни пожалуйста толком, реально это сделать или настолько заморочено что уж проще их вручную расставлять на карте?
|
› Пятница
› 24.05.2013
› 13:34
› Сообщение #
|
| |||
Чат сайта |