Перейти к содержимому


Фотография

Переменные и данные в них


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 4

#1 OFFLINE   wolf2285

wolf2285

    Ефрейтор

  • Пользователи
  • 85 сообщений

Отправлено 17 January 2018 - 01:23

Доброе время суток товарищи . Столкнулся с трудностью. Есть вот такое безобразие.

                                   SpawnUnits1 = [много разных данных,"marker1"];
				   SpawnUnits2 = [много разных данных,"marker2"];
				   SpawnUnits3 = [много разных данных,"marker3"];
				   
				   [ "SpawnUnits1", "marker1" ] spawn fnc_xxxx;
				   [ "SpawnUnits2", "marker2" ] spawn fnc_xxxx;
				   [ "SpawnUnits3", "marker3" ] spawn fnc_xxxx;

В общем массивы с группами своими задачами и все такое.Спавн через функции.В таком варианте работает все как надо.Вопрос только в том ,что для моих задач это мало подходит.Получается "километры" кода.В общем я и моя лень подумали и собрали вот такое

Turn = true;
 
        _l = 0; 
        _array = [Массив маркеров];
		_markers_all = count _array;
		
while {Turn} do {	
	
		 sleep 1;
		 _marker = _array select _l; 
               
	           SpawnUnits = [много разных данных,_marker];///Здесь много данных и массивов вложенных
		       
		 [ "SpawnUnits", _marker ] spawn fnc_xxxx;
		 
		 _l = _l + 1; 
		 
		 if (_l >= _markers_all) then {Turn = false;};
						
  };

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


  • 0

#2 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1829 сообщений

Отправлено 17 January 2018 - 10:19

Можно ли как то в процессе в каждом цикле например создать новую переменную или как то разорвать эту связь?

Можно, с помощью

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

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

P. S.
Используй цикл

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

для "прохождения" по массиву маркеров _array.


  • 0

#3 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 17 January 2018 - 16:12

Когда в массиве SpawnUnits меняется значение (в данном случае подставляется маркер) то итоговый результат тоже меняется

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

[ "SpawnUnits", _marker ] spawn fnc_xxxx;

Передавайте аргументы по значению, а не по "ссылке" на переменную
[[1, 2, 3, 4, 5], "marker1"] call fnc_function;

while {Turn} do {

{
  _x call fnc_function;
} forEach array;

Сообщение отредактировал vlad333000: 17 January 2018 - 16:13

  • 0

#4 OFFLINE   wolf2285

wolf2285

    Ефрейтор

  • Пользователи
  • 85 сообщений

Отправлено 18 January 2018 - 01:25


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

  Да я понимаю как она работает. Я на эксперименты с этой штукой потратил  часов 10 в редакторе .В цикле пробовал ставить задержку 60 сек.не помогло.Потом написал сюда только.В данном случае я использую скрипты T8_units . И сам автор в демо миссии  через spawn запускает. Естественно я менял на call и разницы не заметил.В первом сообщении первый пример отработал как надо на 15 маркерах.Буду на выходных через 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

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


SpawnThisUnits = 
[
[ [ "fireteam", [ "Marker08_01", "Marker08_02" ], "T8u_fnc_rmNVG_TEST" ], [ "PATROL" ]],
[ [ "squad", "Marker03_occupy" ], [ "OCCUPY" ]],
[ [ "squad", "Marker03_garrison" ], [ "GARRISON" ]],

[ [ "squad", "Marker05" ], [ "LOITER" ]],
[ [ "squad", "Marker06" ], [ "PATROL_GARRISON" ]],
[ [ "squad", "Marker09" ], [ "PATROL_AROUND", 150, 135 ], [], [ true ]],
[ [ "platoon", "MarkerRED" ], [ "DEFEND_BASE" ]],

[ [ _groupArrayFullTeam + _groupArrayFullTeam + _groupArrayFullTeam, "Marker02_02" ], [ "OCCUPY", true ], [ true, false, false ]],
[ [ _groupArrayW_APC + _groupArrayFireTeam, "Marker07", false ], [ "PATROL_URBAN" ], [ false, false, false ]],
[ [ _groupArrayW_APC + _groupArrayFireTeam, [ "marker_urban_01", "marker_urban_02" ], false ], [ "PATROL_URBAN" ]],
[ [ _groupArrayFullTeam, "ip" ], [ "PATROL_MARKER", [ "ip1", "ip2", "ip3" ] ] ],
[ [ _groupArrayIfritPat + _groupArrayFullTeam, "vp", false ], [ "PATROL_MARKER", [ "vp1", "vp2", "vp3" ], false ]],
[ [ _groupArraySniperTeam, "spawnSnipers" ], [ "OVERWATCH", "overwatchTHIS" ]],

[ [ "squad", "MarkerGUR", true, "T8u_fnc_rmNVG_TEST", RESISTANCE ], [ "PATROL" ]],
[ [ "squad", "MarkerGUR", RESISTANCE, "T8u_fnc_rmNVG_TEST" ], [ "PATROL" ]],

[ [ "squad", "MarkerBLU", WEST ], [ "PATROL" ]],
[ [ "squad", "MarkerBLU", WEST ], [ "PATROL" ]],

[ [ _groupArrayCIV, "MarkerCIV", CIVILIAN ], [ "GARRISON" ]]
];

 

Это для примера накидал.Этот массив будет собираться рандомно где то больше будет гдето меньше.Каждой группе будет прописываться свой определенный маркер и разные какие то дополнительные параметры.А это сама вызываемая функция 

#include <..\MACRO.hpp>
__allowEXEC(__FILE__);

private [ "_unitsArray", "_marker", "_owner", "_distance", "_actSide", "_actType", "_onAct", "_onDeAct", "_condition", "_trigger", "_onActCompiled", "_onDeactCompiled", "_onActDebug", "_onDeActDebug" ];

_unitsArray		= param [ 0, "NO-UNITS-SET", [ "" ]];
_marker			= param [ 1, "NO-MARKER-SET", [ "" ]];
_owner			= param [ 2, "NO-SIDE-SET", [ "" ]];
_actSide		= param [ 3, "ANY", [ "" ]];
_distance		= param [ 4, 1000, [ 123 ]];
_condition		= param [ 5, "this", [ "" ]];
_onAct			= param [ 6, "", [ "" ]];
_onDeAct		= param [ 7, "", [ "" ]];

_owner			= toUpper _owner;

_actType = "PRESENT";
_actRepeat = true;

if ( _unitsArray == "NO-UNITS-SET" OR { _marker == "NO-MARKER-SET" } OR { _owner == "NO-SIDE-SET" } OR { ! ( _owner in [ "WEST", "EAST", "CIV", "GUER" ] ) } ) exitWith 
{
	private [ "_msg" ]; 
	_msg = format [ "There is a serious error in your T8U_fnc_Zone call!<br /><br />%1", _this ];
	[ _msg ] call T8U_fnc_BroadcastHint;
	false 
};

if ( T8U_var_DEBUG_hints ) then
{
	_onActDebug = format [ '[ "Zone um [ %1 ] aktiviert" ] call T8U_fnc_BroadcastHint;', _marker ];
	_onDeActDebug = format [ '[ "Zone um [ %1 ] deaktiviert" ] call T8U_fnc_BroadcastHint;', _marker ];
} else {
	_onActDebug = "";
	_onDeActDebug = "";
};

_onCreateActCompiled = format [ '[ %1, "%1" ] spawn T8U_fnc_ZoneCreate; %2 %3', _unitsArray, _onAct, _onActDebug ];
_onCreateDeactCompiled = format [ '[ "%1" ] spawn T8U_fnc_ZoneNotAktiv;', _unitsArray ];
_onDeactCompiled = format ['[] spawn { sleep %6; [ "%1", "%2", "%3" ] spawn T8U_fnc_Cache; }; %4 %5', _unitsArray, _marker, _owner, _onDeAct, _onDeActDebug, T8U_var_CacheTime ];

if ( T8U_var_DEBUG ) then { [ "fn_zone.sqf", "INIT", _this ] spawn T8U_fnc_DebugLog; };
if ( T8U_var_DEBUG ) then { [ "fn_zone.sqf", "_onCreateActCompiled, _onDeactCompiled", [ _onCreateActCompiled, _onDeactCompiled ] ] spawn T8U_fnc_DebugLog; };

_trigger = createTrigger [ "EmptyDetector", ( getMarkerPos _marker ) ];
// _trigger = createTrigger [ "EmptyDetector", ( getMarkerPos _marker ), false ];
_trigger setTriggerActivation [ _actSide, _actType, _actRepeat ];
_trigger setTriggerArea [ _distance, _distance, 0, false ];
_trigger setTriggerStatements [ _condition, _onCreateActCompiled, _onCreateDeactCompiled ];

_trigger = createTrigger [ "EmptyDetector", ( getMarkerPos _marker ) ];
// _trigger = createTrigger [ "EmptyDetector", ( getMarkerPos _marker ), false ];
_trigger setTriggerActivation [ _actSide, _actType, _actRepeat ];
_trigger setTriggerArea [ _distance + ( _distance / 4 ), _distance + ( _distance / 4 ), 0, false ];
_trigger setTriggerStatements [ _condition, "", _onDeactCompiled ];

по сути скрипт с циклом отработает только один раз при запуске миссии.Во время брифинга.


Сообщение отредактировал wolf2285: 18 January 2018 - 01:31

  • 0

#5 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 18 January 2018 - 12:24

Да я понимаю как она работает. Я на эксперименты с этой штукой потратил  часов 10 в редакторе

Написать код №2 в первом сообщении можно только в двух случаях:
1. Не знание того как работает spawn
2. В состоянии, в котором вы не отдаете отчет своим действиям (Пьяным)
Поэтому я вам советую еще 10 часов посидеть в редакторе, а что бы было легче просто сравните два этих кода (Значения массивов "a" и "b"):
a = [];
func1 = {
  for "_i" from 0 to 3 do
  {
    a pushBack [1, _i];
    [] spawn func2;
  };
};
func2 = {
  for "_i" from 0 to 1 do
  {
    a pushBack [2, _i];
  };
};
[] call func1;
b = [];
func1 = {
  for "_i" from 0 to 3 do
  {
    b pushBack [1, _i];
    [] call func2;
  };
};
func2 = {
  for "_i" from 0 to 1 do
  {
    b pushBack [2, _i];
  };
};
[] call func1;
То, что кто-то другой использует spawn для вызова своих функций и скриптов, еще не говорит о том, что вы должны использовать его для своих функций и скриптов

PS Мало того что эти два скрипта создадут два разных массива, так первый скрипт еще завершит работу на 1 кадр позже (Что можно будет увидеть во вкладке "Watch" в дебаг-консоли (В строку 1 ставите "a", в 2 - "b"), если вы не из людей, которые видят только 25 кадров в секунду)

Сообщение отредактировал vlad333000: 18 January 2018 - 12:28

  • 0




Яндекс.Метрика