Jump to content

Window->KeyDown/Hit() Gone For Good!

reepblue

309 views

I think I've finally finished my approach in input for my project. This is the final result.

//========= Copyright Reep Softworks, All rights reserved. ============//
//
// Purpose: 
//
//=====================================================================//
#include "stdafx.h"
#include "gamewindow.h"
#include "gameworld.h"

int main(int argc, const char* argv[])
{
	App::ParseCommandLine(argc, argv);

	auto window = CreateGameWindow("GameTemplate");
	auto world = CreateGameWorld(window);
	if (App::GetArgument("vr") != "") App::EnableVR();

	auto camera = Camera::Create();
	camera->SetPosition(0, 0, -1);

	ActionConfig::SetActiveSet("Walking");

	while (App::Running())
	{
		if (GetActionHit("jump"))
		{
			DMsg("jump!");
		}

		if (GetActionHit("interact"))
		{
			DMsg("interact!");
		}

		world->Render();
	}

	return 0;
}

We no longer care what key or button is pressed, we are now concerned what action is being sent to us.Two json files are auto generated in "CreateGameWindow()". One for the mouse and keyboard, and the other for a gamepad with SDL2. These files can be modified by the user (hard) or an app when I actually write it (easier).

{
    "keyBindings": {
        "actionStates": {
            "Menu": {
                "pause": 27,
                "selectActive": 13,
                "selectDown": 40,
                "selectLeft": 37,
                "selectRight": 39,
                "selectUp": 38
            },
            "Walking": {
                "crouch": 17,
                "firePrimary": 1,
                "fireSecondary": 2,
                "flashLight": 70,
                "interact": 69,
                "jump": 32,
                "moveBackward": 83,
                "moveForward": 87,
                "moveLeft": 65,
                "moveRight": 68,
                "pause": 27,
                "reloadWeapon": 82
            }
        }
    }
}
{
    "joyBindings": {
        "actionStates": {
            "Menu": {
                "joySelect": 0,
                "pause": 6,
                "selectActive": 0,
                "selectDown": 12,
                "selectLeft": 13,
                "selectRight": 14,
                "selectUp": 11
            },
            "Walking": {
                "crouch": 7,
                "firePrimary": 16,
                "fireSecondary": 15,
                "flashLight": 3,
                "interact": 2,
                "joyLook": 1,
                "joyMovement": 0,
                "jump": 0,
                "pause": 6,
                "reloadWeapon": 1
            }
        }
    }
}

You may notice that "jump" and "joyMovement" are both 0, but they get treated differently. I've added a GetActionValue() function which returns a Vec2 for analog sticks and triggers. Triggers are both read as buttons and analog values. You still have to write code in how you want to treat the sticks, but the question of the left stick or right stick is bindable now.

There are also Action Sets a collection of buttons can be set based on what state the game is at. Driving is not the same as walking, nor it's the same as flying a plane.

VR can also have it's own entry, but I feel you should use SteamInput for that since the Engine is dependent on SteamVR for it's VR implementation. I've could have just used SteamInput at the start, but then my binding code would only work if the game is on Steam.

My code was compiled on Leadwerks 4.6 beta, but thanks to my wrapper functions and back and forth compiling, it should just work in the new engine.

  • Like 1


0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...