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


Фотография

Функции BIS


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

#1 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 November 2018 - 22:55

Здравствуйте, такой вопрос, функции бисов не требуют своего вызова через spawn когда имеют в себе команды uiSleep/sleep/waitUntil ?
Пример: Команда 

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

имеет в себе waitUntil(Line #211: waituntil {!isnil {uinamespace getvariable "BIS_fnc_guiMessage_status"}}), но вызывается через call.
Или что это за аномалия такая ?


Сообщение отредактировал nIkRon: 19 November 2018 - 22:56

  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 19 November 2018 - 23:05

Во-первых, большинство функций БИСов, в начале, имеют код проверки на возможность применения данных команд, и если код был вызван не так как нужно, то происходит повторный вызов функции уже так как нужно.
Во-вторых, call не запрещает использование команд задержки, в данном случае у вас неправилньое представление о работе планировщика -

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

. Если коротко, то call не меняет "Пространство" работы скрипта, поэтому если в "родительском" коде можно использовать sleep, то и в "дочернем" можно, и наоборот
  • 0

#3 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1791 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 19 November 2018 - 23:10

nIkRon, не важно, содержит ли вызывающая с помощью call функция sleep, waitUntil... Важно, чтобы она вызывалась в scheduled-окружении. Например, такой код не будет работать:

player addEventHandler [
    "Killed",
    {
        sleep 1;

        hint "You has been killed";
    }
];

Это потому что обработчики событий выполняются в unscheduled-окружении. А вот такой будет:

player addEventHandler [
    "Killed",
    {
        [] spawn {
            sleep 1;

            hint "You has been killed";
        };
    }
];

Это потому что код, вызванный с помощью spawn, работает в scheduled-окружении, где задержки разрешены.


Сообщение отредактировал Schatten: 19 November 2018 - 23:15

  • 0

#4 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 November 2018 - 23:12

vlad333000,Тогда еще один вопрос, я взял команду bis_fnc_guiMessage, и переделал под свои нужны(в ctrlseteventhandler`ах заменил на MouseButtonClick вместо ButtonClick), но при вызове через call, он мне выдает еррор, почему тогда если использовать не измененную функцию, этого нет ?

Schatten,Это я знаю, но в этой функции, ничего подобного нет. Или обработка верности вызова(как выше написал Влад) используется не в самом коде функции ?


Сообщение отредактировал nIkRon: 19 November 2018 - 23:12

  • 0

#5 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 November 2018 - 23:24

Вызов функции: ["Are you sure?", "Confirm", true, true] call BIS_fnc_guiMessage;
Сама функция:
 

/*
	Author: Karel Moricky

	Description:
	Displays message window

	Parameter(s):
		0: STRING or STRUCTURED TEXT - message body
		1: STRING - message header
		2:
			BOOL - enable/disable "OK" button
			TEXT - set "OK" button's text (enabling it automatically)
		3:
			BOOL - enable/disable "Cancel" button
			TEXT - set "Cancel" button's text (enabling it automatically)
		4: DISPLAY - parent display
		5: BOOL - when true, function will try to use control inherited from 'RscMessageBox' in display instead of creating a new one
		6: BOOL - true to pause the game, false to let it running

	Returns:
		BOOL - true if "OK" button was activated, false if "Cancel" was activated or user pressed "Escape" key.
*/
private ["_textMessage","_textHeader","_textOK","_textCancel","_parent","_useParentBox","_isPause","_display","_ctrlRscMessageBox","_ctrlBcgCommonTop",
"_ctrlBcgCommon","_ctrlText","_ctrlBackgroundButtonOK","_ctrlBackgroundButtonMiddle","_ctrlBackgroundButtonCancel","_ctrlButtonOK","_ctrlButtonCancel",
"_allControls","_positions","_ctrlButtonOKPos","_ctrlBcgCommonPos","_bottomSpaceY","_marginX","_marginY","_ctrlTextPosH","_bottomPosY",
"_ctrlRscMessageBoxPos","_ctrlRscMessageBoxPosH","_focus","_ehKeyDown","_status"];

#define DISPLAY_DEFAULT	(uinamespace getvariable "RscDisplayCommonMessage_display")

disableserialization;
_textMessage =	_this param [0,"",["",parsetext "",[]]];
_textHeader =	_this param [1,"",[""]];
_textOK =	_this param [2,true,["",false]];
_textCancel =	_this param [3,false,["",false]];
_parent =	_this param [4,[] call bis_fnc_displayMission,[displaynull]];
_useParentBox = _this param [5,false,[false]];
_isPause = 	_this param [6,true,[false]];
_canDelete = false;

//--- Show message box and terminate if it failed
if !(_useParentBox) then {
	_displayClass = if (_isPause) then {"RscDisplayCommonMessagePause"} else {"RscDisplayCommonMessage"};
	_parent createdisplay _displayClass;
};
if (!_useParentBox && isnil {DISPLAY_DEFAULT}) exitwith {["Unable to create message box"] call bis_fnc_error; false};
if (!_useParentBox && isnull (DISPLAY_DEFAULT)) exitwith {["Unable to create message box."] call bis_fnc_error; false};
if (_useParentBox && isnull (_parent)) exitwith {["Parent display does not exist."] call bis_fnc_error; false};
//if (_useParentBox && isnull (_parent displayctrl 2351)) exitwith {["Control inheriting from 'RscMessageBox' not found in display %1.",_parent] call bis_fnc_error; false};
if (_useParentBox && isnull (_parent displayctrl 2351)) then {
	_parent ctrlcreate ["RscMessageBox",2351];
	_canDelete = true;
};

if (typename _textMessage == typename "") then {_textMessage = parsetext _textMessage;};

//--- Declare UI controls
_display = if (_useParentBox) then {_parent} else {DISPLAY_DEFAULT;};
_ctrlRscMessageBox =		_display displayctrl 2351;
_ctrlBcgCommonTop =		_display displayctrl 235100;
_ctrlBcgCommon =		_display displayctrl 235101;
_ctrlText =			_display displayctrl 235102;
_ctrlBackgroundButtonOK =	_display displayctrl 235103;
_ctrlBackgroundButtonMiddle =	_display displayctrl 235104;
_ctrlBackgroundButtonCancel =	_display displayctrl 235105;
_ctrlButtonOK =			_display displayctrl 235106;
_ctrlButtonCancel =		_display displayctrl 235107;
_allControls = [_ctrlBcgCommonTop,_ctrlBcgCommon,_ctrlText,_ctrlBackgroundButtonOK,_ctrlBackgroundButtonMiddle,_ctrlBackgroundButtonCancel,_ctrlButtonOK,_ctrlButtonCancel];

//--- Default control positions
if (_useParentBox) then {
	_positions = uinamespace getvariable "BIS_fnc_guiMessage_defaultPositions";
	if (isnil "_positions") then {
		_positions = [];
		{
			_xPos = ctrlposition _x;
			_positions set [count _positions,_xPos];
		} foreach _allControls;
		uinamespace setvariable ["BIS_fnc_guiMessage_defaultPositions",_positions];
		_display displayaddeventhandler ["unload","uinamespace setvariable ['BIS_fnc_guiMessage_defaultPositions',nil];"];
	} else {
		{
			_x ctrlsetposition (_positions select _foreachindex);
			_x ctrlcommit 0;
		} foreach _allControls;
	};
};

//--- Apply header text
_ctrlBcgCommonTop ctrlsettext _textHeader;

//--- Calculate spacing
_ctrlButtonOKPos = ctrlposition _ctrlButtonOK;
_ctrlBcgCommonPos = ctrlposition _ctrlBcgCommon;
_bottomSpaceY = (_ctrlButtonOKPos select 1) - ((_ctrlBcgCommonPos select 1) + (_ctrlBcgCommonPos select 3));

//--- Calculate text padding
_ctrlTextPos = ctrlposition _ctrlText;
_marginX = (_ctrlTextPos select 0) - (_ctrlBcgCommonPos select 0);
_marginY = (_ctrlTextPos select 1) - (_ctrlBcgCommonPos select 1);

//--- Apply text and get its height
_ctrlText ctrlsetstructuredtext _textMessage;
_ctrlTextPosH = ctrltextheight _ctrlText;

//--- Move text area
_ctrlBcgCommon ctrlsetposition [
	(_ctrlBcgCommonPos select 0),
	(_ctrlBcgCommonPos select 1),
	(_ctrlBcgCommonPos select 2),
	_ctrlTextPosH + (_marginY * 2)
];
_ctrlBcgCommon ctrlcommit 0;

_ctrlText ctrlsetposition [
	(_ctrlBcgCommonPos select 0) + _marginX,
	(_ctrlBcgCommonPos select 1) + _marginY,
	(_ctrlBcgCommonPos select 2) - _marginX * 2,
	_ctrlTextPosH
];
_ctrlText ctrlcommit 0;

//--- Move bottom bar
_bottomPosY = (_ctrlBcgCommonPos select 1) + _ctrlTextPosH + (_marginY * 2) + _bottomSpaceY;
{
	_xPos = ctrlposition _x;
	_xPos set [1,_bottomPosY];
	_x ctrlsetposition _xPos;
	_x ctrlcommit 0;
} foreach [
	_ctrlBackgroundButtonOK,
	_ctrlBackgroundButtonMiddle,
	_ctrlBackgroundButtonCancel,
	_ctrlButtonOK,
	_ctrlButtonCancel
];

//--- Move the whole group
_ctrlRscMessageBoxPos = ctrlposition _ctrlRscMessageBox;
_ctrlRscMessageBoxPosH = _bottomPosY + (_ctrlButtonOKPos select 3);
_ctrlRscMessageBox ctrlsetposition [
	0.5 - (_ctrlBcgCommonPos select 2) / 2,
	0.5 - _ctrlRscMessageBoxPosH / 2,
	(_ctrlBcgCommonPos select 2) + 0.5,
	_ctrlRscMessageBoxPosH
];
_ctrlRscMessageBox ctrlenable true;
_ctrlRscMessageBox ctrlcommit 0;


//--- Increase the size of controls group to cover (and disable) everything below
if (_useParentBox) then {
	_ctrlRscMessageBoxPos = ctrlPosition _ctrlRscMessageBox;
	_ctrlRscMessageBoxPos = [
		(_ctrlRscMessageBoxPos select 0) - 2,
		(_ctrlRscMessageBoxPos select 1) - 2,
		(_ctrlRscMessageBoxPos select 2) + 4,
		(_ctrlRscMessageBoxPos select 3) + 4
	];
	_ctrlRscMessageBox ctrlsetposition _ctrlRscMessageBoxPos;
	_ctrlRscMessageBox ctrlcommit 0;
	{
		_xPos = ctrlposition _x;
		_xPos set [0,(_xPos select 0) + 2];
		_xPos set [1,(_xPos select 1) + 2];
		_x ctrlsetposition _xPos;
		_x ctrlcommit 0;
	} foreach _allCOntrols;
};

//--- Set buttons visibility and text
_focus = _ctrlButtonOK;
_ctrlButtonOK ctrlenable true;
_ctrlButtonOK ctrlsetfade 0;
_ctrlButtonOK ctrlsettext localize "STR_DISP_OK";
if (typename _textOK == typename false) then {
	if !(_textOK) then {
		_ctrlButtonOK ctrlenable false;
		_ctrlButtonOK ctrlsetfade 1;
		_focus = _ctrlButtonCancel;
	};
} else {
	_ctrlButtonOK ctrlsettext _textOK;
};
_ctrlButtonOK ctrlcommit 0;

_ctrlButtonCancel ctrlenable true;
_ctrlButtonCancel ctrlsetfade 0;
_ctrlButtonCancel ctrlsettext localize "STR_DISP_CANCEL";
if (typename _textCancel == typename false) then {
	if !(_textCancel) then {
		_ctrlButtonCancel ctrlenable false;
		_ctrlButtonCancel ctrlsetfade 1;
	};
} else {
	_ctrlButtonCancel ctrlsettext _textCancel;
};
_ctrlButtonCancel ctrlcommit 0;
ctrlsetfocus _focus;


//--- Assign button actions
uinamespace setvariable ["BIS_fnc_guiMessage_status",nil];
_ctrlButtonOK ctrlseteventhandler ["buttonclick","uinamespace setvariable ['BIS_fnc_guiMessage_status',true]; true"];
_ctrlButtonCancel ctrlseteventhandler ["buttonclick","uinamespace setvariable ['BIS_fnc_guiMessage_status',false]; true"];
_display displayaddeventhandler ["unload","uinamespace setvariable ['BIS_fnc_guiMessage_status',false];"];
_ehKeyDown = _display displayaddeventhandler ["keydown","if ((_this select 1) == 1) then {uinamespace setvariable ['BIS_fnc_guiMessage_status',false]; true} else {false}"];


//--- Clicked
waituntil {!isnil {uinamespace getvariable "BIS_fnc_guiMessage_status"}};

_display displayremoveeventhandler ["keydown",_ehKeyDown];

if (_useParentBox) then {
	_ctrlRscMessageBox ctrlenable false;
	_ctrlRscMessageBox ctrlsetposition [0,0,0,0];
	_ctrlRscMessageBox ctrlcommit 0;
	if (_canDelete) then {ctrldelete _ctrlRscMessageBox;};
} else {
	_display closedisplay 2;
};


_status = uinamespace getvariable "BIS_fnc_guiMessage_status";
uinamespace setvariable ["BIS_fnc_guiMessage_status",nil];
_status

Никакого упоминания spawn нету...


  • 0

#6 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 19 November 2018 - 23:26

nIkRon, ну значит не так реализовали свои правки, да и ошибка может быть на, что угодно (Тут нужен текст ошибки). К сожалению из-за установки армы на новенький SSD временно не имею возможности даже код этих функций посмотреть
  • 0

#7 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 November 2018 - 23:29

vlad333000, В том то и дело, что все правильно реализовано, и в ошибках сказано об waitUntil, и при вызове через spawn, все работает.
 

22:25:52 Error in expression <e]; true} else {false}"];



waituntil {!isnil {uinamespace getvariable "BIS_fnc>
22:25:52   Error position: <!isnil {uinamespace getvariable "BIS_fnc>
22:25:52   Error Общая ошибка в выражении
22:25:52 File temp_client\replaceBis\fn_guiMessage.sqf [BIS_fnc_guiMessage], line 211

  • 0

#8 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 19 November 2018 - 23:36

nIkRon, а откуда код вызывается?
  • 0

#9 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1791 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 19 November 2018 - 23:37

nIkRon, нельзя эту функцию вызывать из unscheduled-окружения. Попробуй запустить из консоли и убедись!

Так что оборачивай в spawn.


Сообщение отредактировал Schatten: 19 November 2018 - 23:37

  • 0

#10 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 November 2018 - 23:38

vlad333000,Вручную, через call ошибка, через spawn работает. Но щас вырубил свой мод, проверил в обычно арме через call, и там тоже ошибка. В итоге это бисы неправильный пример в команде предоставили: 


Example 4:

_result = ["Are you sure?", "Confirm", true, true] call BIS_fnc_guiMessage; // Arma 3

  • 0

#11 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1791 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 19 November 2018 - 23:39

nIkRon, просто они не уточнили, из какого окружения происходит вызов.


  • 0

#12 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 November 2018 - 23:41

Schatten,Ну для take on helicopter они указали spawn, но да ладно. 


  • 0

#13 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 19 November 2018 - 23:42

nIkRon, ну пример правильный, но он нацелен на то, что программист понимает, что делает. Эту функцию нужно вызывать с помощью call, но в запланированноц среде, т. к. эта функция возвращает true/false в зависимости от того, какая кнопка была нажата

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

Сообщение отредактировал vlad333000: 19 November 2018 - 23:44

  • 0

#14 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 November 2018 - 23:46

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


  • 0

#15 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1791 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 19 November 2018 - 23:46

Schatten,Ну для take on helicopter они указали spawn, но да ладно.

Похоже, неправильно указали (правильнее было бы обернуть в spawn) или им не нужен был результат функции.


Сообщение отредактировал Schatten: 19 November 2018 - 23:50

  • 0

#16 OFFLINE   nIkRon

nIkRon

    Сержант

  • Пользователи
  • 195 сообщений
  • Откуда:Донецк

Отправлено 19 November 2018 - 23:52

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


  • 0

#17 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 20 November 2018 - 17:36

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

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


  • 0




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