Jump to content
sizraide

Keep createDisplay open

Recommended Posts

Hello, I'm creating a singleplayer scenario.

I created a GUI to choose difficulty for a singleplayer mission at the beginning of the mission.
 

But the GUI can be closed by pressing ESC, I wonder if there's any countermeasures to avoid that? So the player can't close it until he chooses a difficulty.


controls.hpp

Spoiler

class chooseDifficulty
{
    idd = 1234;
    
    class controls
    {

        class baseFrame: RscFrame
        {
            idc = 1800;
            x = 0.386445 * safezoneW + safezoneX;
            y = 0.279 * safezoneH + safezoneY;
            w = 0.215156 * safezoneW;
            h = 0.476 * safezoneH;
        };
        class textDifficulty: RscText
        {
            idc = 1000;
            text = "Choose difficulty"; //--- ToDo: Localize;
            x = 0.452187 * safezoneW + safezoneX;
            y = 0.313 * safezoneH + safezoneY;
            w = 0.0836719 * safezoneW;
            h = 0.034 * safezoneH;
        };
        class easyDiff: RscButton
        {
            idc = 1600;
            text = "Easy peasy, lemon squeezy."; //--- ToDo: Localize;
            x = 0.416328 * safezoneW + safezoneX;
            y = 0.381 * safezoneH + safezoneY;
            w = 0.155391 * safezoneW;
            h = 0.068 * safezoneH;
            colorBackground[] = {0.5,0.7,0.5,0.8};
            action = "diff = 1";
        };
        class mediumDiff: RscButton
        {
            idc = 1601;
            text = "Adventure Mode"; //--- ToDo: Localize;
            x = 0.416328 * safezoneW + safezoneX;
            y = 0.466 * safezoneH + safezoneY;
            w = 0.155391 * safezoneW;
            h = 0.068 * safezoneH;
            colorBackground[] = {0.5,0.7,0.5,0.8};
            action = "diff = 2";
        };
        class hardDiff: RscButton
        {
            idc = 1602;
            text = "Hard as hell."; //--- ToDo: Localize;
            x = 0.416328 * safezoneW + safezoneX;
            y = 0.551 * safezoneH + safezoneY;
            w = 0.155391 * safezoneW;
            h = 0.068 * safezoneH;
            colorBackground[] = {0.5,0.7,0.5,0.8};
            action = "diff = 3";
        };
        class confirmDiff: RscButton
        {
            idc = 1603;
            text = "Confirm"; //--- ToDo: Localize;
            x = 0.452187 * safezoneW + safezoneX;
            y = 0.67 * safezoneH + safezoneY;
            w = 0.0836719 * safezoneW;
            h = 0.051 * safezoneH;
            colorActive[] = {0.5,0.7,0.5,0.8};
            action = "ok = true";
        };
    };
};


menuDiff.sqf

Spoiler

_menuLayer = ["difficultyFade"] call BIS_fnc_rscLayer;
_menuLayer cutText ["", "BLACK FADED", 999];

    // Enable borders
    [0, 0, false, true ] spawn BIS_fnc_cinemaBorder;
    // Create menu background
    private _camera = "camera" camCreate getPosATL screen;
    _camera cameraEffect ["internal", "back"];
    _camera camPrepareTarget getPosATL screen;
    _camera camPrepareFOV 0.5;
    _camera camCommitPrepared 0;
    camCommitted _camera;

    sleep 3;
    
_menuLayer cutText ["", "BLACK IN", 3];

sleep 3;

// Open menu difficulty
diff = 0; // Declare difficulty
ok = false;

// Open GUI
_display = findDisplay 46 createDisplay "chooseDifficulty";

waitUntil{ok};
_display closeDisplay 1;
execVM "sections\1.sqf";

_camera cameraEffect ["terminate", "back"];
camDestroy _camera;

 

Share this post


Link to post
Share on other sites
9 hours ago, killzone_kid said:

displayAddEventHandler ["keydown" .....] override escape key https://community.bistudio.com/wiki/User_Interface_Event_Handlers#onKeyDown

 

// Open GUI
_display = findDisplay 46 createDisplay "chooseDifficulty";

// Add UI EventHandler
_displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{
	params ["_display","_key"];
	if (_key == 1) exitWith {true};
	false
}];

waitUntil{ok};

// Remove displayHandler
(findDisplay 46) displayRemoveEventHandler ["KeyDown", _displayHandler];

I made an displayEventHandler, this doesn't seem to be working? Any clues?


When I press ESC, it still closes the display. But no error pops up.

Share this post


Link to post
Share on other sites

Hi @sizraide
Try this with your original code:
 

// Add UI EventHandler
_displayHandler = _display displayAddEventhandler["KeyDown",{
	params ["_displayOrControl", "_key", "_shift", "_ctrl", "_alt"];
	private _rewriteKey = FALSE;
	if (_key == 1) then {systemChat "button esc clicked";_rewriteKey = TRUE;};
	_rewriteKey
}];
// Remove displayHandler
_display displayRemoveEventHandler ["KeyDown", _displayHandler];

I´ve added eventhandler to your created display instead of mission display for the clarity purposes. Just to be sure you might also consider using disableSerialization. I´m not sure if this is actually needed but i personally use it every time i work with scripts that are using UI elements. Let me know if that helped 🙂

Share this post


Link to post
Share on other sites
5 hours ago, sizraide said:

 


// Open GUI
_display = findDisplay 46 createDisplay "chooseDifficulty";

// Add UI EventHandler
_displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{
	params ["_display","_key"];
	if (_key == 1) exitWith {true};
	false
}];

waitUntil{ok};

// Remove displayHandler
(findDisplay 46) displayRemoveEventHandler ["KeyDown", _displayHandler];

I made an displayEventHandler, this doesn't seem to be working? Any clues?


When I press ESC, it still closes the display. But no error pops up.

For some reason exitWith will not overwrite the event. try if else instead:

_displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{
	params ["_display","_key"];
	if (_key == 1) then {
		true
	} else {
		false
	};
}];

// or even more simple:
_displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{
	params ["_display","_key"];
	_key == 1
}];

 

Share this post


Link to post
Share on other sites
17 hours ago, 7erra said:

For some reason exitWith will not overwrite the event. try if else instead:


_displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{
	params ["_display","_key"];
	if (_key == 1) then {
		true
	} else {
		false
	};
}];

// or even more simple:
_displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{
	params ["_display","_key"];
	_key == 1
}];
 

 

Appreciate the help!

I managed to fix it here:

// Open GUI
_display = findDisplay 46 createDisplay "chooseDifficulty";

// Add UI EventHandler
_display displayAddEventhandler["KeyDown",{
	params ["", "_key"];
	_key == 1
}];

// Wait for confirmation
waitUntil{ok};

// Enable borders
[0, 0, false, true ] spawn BIS_fnc_cinemaBorder;

// Remove displayHandler
findDisplay 46 displayRemoveAllEventHandlers "KeyDown";

// Close display finally
_display closeDisplay 1;


 

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×