|  | /******************************************************************************************* | 
						
						
							|  | * | 
						
						
							|  | *   raylib [core] example - input actions | 
						
						
							|  | * | 
						
						
							|  | *   Example complexity rating: [★★☆☆] 2/4 | 
						
						
							|  | * | 
						
						
							|  | *   Example originally created with raylib 5.5, last time updated with raylib 5.6 | 
						
						
							|  | * | 
						
						
							|  | *   Example contributed by Jett (@JettMonstersGoBoom) and reviewed by Ramon Santamaria (@raysan5) | 
						
						
							|  | * | 
						
						
							|  | *   Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, | 
						
						
							|  | *   BSD-like license that allows static linking with closed source software | 
						
						
							|  | * | 
						
						
							|  | *   Copyright (c) 2025 Jett (@JettMonstersGoBoom) | 
						
						
							|  | * | 
						
						
							|  | ********************************************************************************************/ | 
						
						
							|  | 
 | 
						
						
							|  | // Simple example for decoding input as actions, allowing remapping of input to different keys or gamepad buttons | 
						
						
							|  | // For example instead of using `IsKeyDown(KEY_LEFT)`, you can use `IsActionDown(ACTION_LEFT)` | 
						
						
							|  | // which can be reassigned to e.g. KEY_A and also assigned to a gamepad button. the action will trigger with either gamepad or keys  | 
						
						
							|  |  | 
						
						
							|  | #include "raylib.h" | 
						
						
							|  |  | 
						
						
							|  | //---------------------------------------------------------------------------------- | 
						
						
							|  | // Types and Structures Definition | 
						
						
							|  | //---------------------------------------------------------------------------------- | 
						
						
							|  | typedef enum ActionType { | 
						
						
							|  |     NO_ACTION = 0, | 
						
						
							|  |     ACTION_UP, | 
						
						
							|  |     ACTION_DOWN, | 
						
						
							|  |     ACTION_LEFT, | 
						
						
							|  |     ACTION_RIGHT, | 
						
						
							|  |     ACTION_FIRE, | 
						
						
							|  |     MAX_ACTION | 
						
						
							|  | } ActionType; | 
						
						
							|  | 
 | 
						
						
							|  | // Key and button inputs | 
						
						
							|  | typedef struct ActionInput { | 
						
						
							|  |     int key; | 
						
						
							|  |     int button; | 
						
						
							|  | } ActionInput; | 
						
						
							|  | 
 | 
						
						
							|  | //---------------------------------------------------------------------------------- | 
						
						
							|  | // Global Variables Definition | 
						
						
							|  | //---------------------------------------------------------------------------------- | 
						
						
							|  | static int gamepadIndex = 0; // Gamepad default index | 
						
						
							|  | static ActionInput actionInputs[MAX_ACTION] = { 0 };  | 
						
						
							|  | 
 | 
						
						
							|  | //---------------------------------------------------------------------------------- | 
						
						
							|  | // Module Functions Declaration | 
						
						
							|  | //---------------------------------------------------------------------------------- | 
						
						
							|  | static bool IsActionPressed(int action);    // Check action key/button pressed | 
						
						
							|  | static bool IsActionReleased(int action);   // Check action key/button released | 
						
						
							|  | static bool IsActionDown(int action);       // Check action key/button down | 
						
						
							|  |  | 
						
						
							|  | static void SetActionsDefault(void);        // Set the "default" keyset | 
						
						
							|  | static void SetActionsCursor(void);         // Set the "alternate" keyset | 
						
						
							|  |  | 
						
						
							|  | //------------------------------------------------------------------------------------ | 
						
						
							|  | // Program main entry point | 
						
						
							|  | //------------------------------------------------------------------------------------ | 
						
						
							|  | int main(void) | 
						
						
							|  | { | 
						
						
							|  |     // Initialization | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |     const int screenWidth = 800; | 
						
						
							|  |     const int screenHeight = 450; | 
						
						
							|  | 
 | 
						
						
							|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - input actions"); | 
						
						
							|  |      | 
						
						
							|  |     // Set default actions  | 
						
						
							|  |     char actionSet = 0; | 
						
						
							|  |     SetActionsDefault(); | 
						
						
							|  | 
 | 
						
						
							|  |     Vector2 position = (Vector2){ 400.0f, 200.0f }; | 
						
						
							|  |     Vector2 size = (Vector2){ 40.0f, 40.0f }; | 
						
						
							|  |      | 
						
						
							|  |     SetTargetFPS(60); | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |     // Main game loop | 
						
						
							|  |     while (!WindowShouldClose()) // Detect window close button or ESC key | 
						
						
							|  |     { | 
						
						
							|  |         // Update | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |         gamepadIndex = 0; //  set this to gamepad being checked | 
						
						
							|  |         if (IsActionDown(ACTION_UP)) position.y -= 2; | 
						
						
							|  |         if (IsActionDown(ACTION_DOWN)) position.y += 2; | 
						
						
							|  |         if (IsActionDown(ACTION_LEFT)) position.x -= 2; | 
						
						
							|  |         if (IsActionDown(ACTION_RIGHT)) position.x += 2; | 
						
						
							|  |         if (IsActionPressed(ACTION_FIRE)) | 
						
						
							|  |         { | 
						
						
							|  |             position.x = (screenWidth-size.x)/2; | 
						
						
							|  |             position.y = (screenHeight-size.y)/2; | 
						
						
							|  |         } | 
						
						
							|  | 
 | 
						
						
							|  |         // Switch control scheme by pressing TAB  | 
						
						
							|  |         if (IsKeyPressed(KEY_TAB)) | 
						
						
							|  |         { | 
						
						
							|  |             actionSet = !actionSet; | 
						
						
							|  |             if (actionSet == 0) SetActionsDefault(); | 
						
						
							|  |             else SetActionsCursor(); | 
						
						
							|  |         } | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |         // Draw | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |         BeginDrawing(); | 
						
						
							|  | 
 | 
						
						
							|  |             ClearBackground(GRAY); | 
						
						
							|  | 
 | 
						
						
							|  |             DrawRectangleV(position, size, RED); | 
						
						
							|  |              | 
						
						
							|  |             DrawText((actionSet == 0)? "Current input set: WASD (default)" : "Current input set: Cursor", 10, 10, 20, WHITE); | 
						
						
							|  |             DrawText("Use TAB key to toggles Actions keyset", 10, 50, 20, GREEN); | 
						
						
							|  | 
 | 
						
						
							|  |         EndDrawing(); | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |     } | 
						
						
							|  | 
 | 
						
						
							|  |     // De-Initialization | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |     CloseWindow();        // Close window and OpenGL context | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |     return 0; | 
						
						
							|  | } | 
						
						
							|  | 
 | 
						
						
							|  | //---------------------------------------------------------------------------------- | 
						
						
							|  | // Module Functions Definition | 
						
						
							|  | //---------------------------------------------------------------------------------- | 
						
						
							|  | // Check action key/button pressed | 
						
						
							|  | // NOTE: Combines key pressed and gamepad button pressed in one action | 
						
						
							|  | static bool IsActionPressed(int action) | 
						
						
							|  | { | 
						
						
							|  |     bool result = false; | 
						
						
							|  |      | 
						
						
							|  |     if (action < MAX_ACTION) result = (IsKeyPressed(actionInputs[action].key) || IsGamepadButtonPressed(gamepadIndex, actionInputs[action].button)); | 
						
						
							|  |      | 
						
						
							|  |     return result; | 
						
						
							|  | } | 
						
						
							|  | 
 | 
						
						
							|  | // Check action key/button released | 
						
						
							|  | // NOTE: Combines key released and gamepad button released in one action | 
						
						
							|  | static bool IsActionReleased(int action) | 
						
						
							|  | { | 
						
						
							|  |     bool result = false; | 
						
						
							|  |      | 
						
						
							|  |     if (action < MAX_ACTION) result = (IsKeyReleased(actionInputs[action].key) || IsGamepadButtonReleased(gamepadIndex, actionInputs[action].button)); | 
						
						
							|  |      | 
						
						
							|  |     return result; | 
						
						
							|  | } | 
						
						
							|  | 
 | 
						
						
							|  | // Check action key/button down | 
						
						
							|  | // NOTE: Combines key down and gamepad button down in one action | 
						
						
							|  | static bool IsActionDown(int action)  | 
						
						
							|  | { | 
						
						
							|  |     bool result = false; | 
						
						
							|  |      | 
						
						
							|  |     if (action < MAX_ACTION) result = (IsKeyDown(actionInputs[action].key) || IsGamepadButtonDown(gamepadIndex, actionInputs[action].button)); | 
						
						
							|  |      | 
						
						
							|  |     return result; | 
						
						
							|  | } | 
						
						
							|  | 
 | 
						
						
							|  | // Set the "default" keyset | 
						
						
							|  | // NOTE: Here WASD and gamepad buttons on the left side for movement | 
						
						
							|  | static void SetActionsDefault(void) | 
						
						
							|  | { | 
						
						
							|  |     actionInputs[ACTION_UP].key = KEY_W; | 
						
						
							|  |     actionInputs[ACTION_DOWN].key = KEY_S; | 
						
						
							|  |     actionInputs[ACTION_LEFT].key = KEY_A; | 
						
						
							|  |     actionInputs[ACTION_RIGHT].key = KEY_D; | 
						
						
							|  |     actionInputs[ACTION_FIRE].key = KEY_SPACE; | 
						
						
							|  | 
 | 
						
						
							|  |     actionInputs[ACTION_UP].button = GAMEPAD_BUTTON_LEFT_FACE_UP; | 
						
						
							|  |     actionInputs[ACTION_DOWN].button = GAMEPAD_BUTTON_LEFT_FACE_DOWN; | 
						
						
							|  |     actionInputs[ACTION_LEFT].button = GAMEPAD_BUTTON_LEFT_FACE_LEFT; | 
						
						
							|  |     actionInputs[ACTION_RIGHT].button = GAMEPAD_BUTTON_LEFT_FACE_RIGHT; | 
						
						
							|  |     actionInputs[ACTION_FIRE].button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN; | 
						
						
							|  | } | 
						
						
							|  | 
 | 
						
						
							|  | // Set the "alternate" keyset | 
						
						
							|  | // NOTE: Here cursor keys and gamepad buttons on the right side for movement | 
						
						
							|  | static void SetActionsCursor(void) | 
						
						
							|  | { | 
						
						
							|  |     actionInputs[ACTION_UP].key = KEY_UP; | 
						
						
							|  |     actionInputs[ACTION_DOWN].key = KEY_DOWN; | 
						
						
							|  |     actionInputs[ACTION_LEFT].key = KEY_LEFT; | 
						
						
							|  |     actionInputs[ACTION_RIGHT].key = KEY_RIGHT; | 
						
						
							|  |     actionInputs[ACTION_FIRE].key = KEY_SPACE; | 
						
						
							|  | 
 | 
						
						
							|  |     actionInputs[ACTION_UP].button = GAMEPAD_BUTTON_RIGHT_FACE_UP; | 
						
						
							|  |     actionInputs[ACTION_DOWN].button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN; | 
						
						
							|  |     actionInputs[ACTION_LEFT].button = GAMEPAD_BUTTON_RIGHT_FACE_LEFT; | 
						
						
							|  |     actionInputs[ACTION_RIGHT].button = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT; | 
						
						
							|  |     actionInputs[ACTION_FIRE].button = GAMEPAD_BUTTON_LEFT_FACE_DOWN; | 
						
						
							|  | }
 |