2
0
Эх сурвалжийг харах

Add Android physic buttons input detection

- Added functions for detect when pressed, during down and when
released.
- Added defines for back, menu, volume up and down button numbers.
victorfisac 9 жил өмнө
parent
commit
ea50092356
2 өөрчлөгдсөн 55 нэмэгдсэн , 3 устгасан
  1. 46 3
      src/core.c
  2. 9 0
      src/raylib.h

+ 46 - 3
src/core.c

@@ -122,6 +122,8 @@ static int ident, events;
 static bool windowReady = false;                // Used to detect display initialization
 static bool appEnabled = true;                  // Used to detec if app is active
 static bool contextRebindRequired = false;      // Used to know context rebind required
+static int previousButtonState[512] = { 1 };   // Required to check if button pressed/released once
+static int currentButtonState[512] = { 1 };    // Required to check if button pressed/released once
 #elif defined(PLATFORM_RPI)
 static EGL_DISPMANX_WINDOW_T nativeWindow;      // Native window (graphic device)
 
@@ -365,6 +367,13 @@ void InitWindow(int width, int height, struct android_app *state)
 
     TraceLog(INFO, "Android app initialized successfully");
 
+    // Init button states values (default up)
+    for(int i = 0; i < 512; i++)
+    {
+        currentButtonState[i] = 1;
+        previousButtonState[i] = 1;
+    }
+
     // Wait for window to be initialized (display and context)
     while (!windowReady)
     {
@@ -1101,6 +1110,34 @@ Vector2 GetTouchPosition(void)
 
     return position;
 }
+
+bool IsButtonPressed(int button)
+{
+    bool pressed = false;
+
+    if ((currentButtonState[button] != previousButtonState[button]) && (currentButtonState[button] == 0)) pressed = true;
+    else pressed = false;
+
+    return pressed;
+}
+
+// Detect if a button is being pressed (button held down)
+bool IsButtonDown(int button)
+{
+    if (currentButtonState[button] == 0) return true;
+    else return false;
+}
+
+// Detect if a button has been released once
+bool IsButtonReleased(int button)
+{
+    bool released = false;
+
+    if ((currentButtonState[button] != previousButtonState[button]) && (currentButtonState[button] == 1)) released = true;
+    else released = false;
+
+    return released;
+}
 #endif
 
 //----------------------------------------------------------------------------------
@@ -1648,12 +1685,14 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
     {
         int32_t keycode = AKeyEvent_getKeyCode(event);
         //int32_t AKeyEvent_getMetaState(event);
+        
+        currentButtonState[keycode] = AKeyEvent_getAction (event);  // Down = 0, Up = 1
 
         //if (keycode == AKEYCODE_HOME) { }
-        //if (keycode == AKEYCODE_POWER) { }
-        if (keycode == AKEYCODE_BACK)
+        if (keycode == AKEYCODE_POWER) { return 1; }
+        if ((keycode == AKEYCODE_BACK) || (keycode == AKEYCODE_MENU))
         {
-            // Eat BACK_BUTTON, just do nothing... and don't let to be handled by OS!
+            // Eat BACK_BUTTON and AKEYCODE_MENU, just do nothing... and don't let to be handled by OS!
             return 1;
         }
         else if ((keycode == AKEYCODE_VOLUME_UP) || (keycode == AKEYCODE_VOLUME_DOWN))
@@ -1778,6 +1817,7 @@ static void PollInputEvents(void)
 
     // TODO: Remove this requirement...
     UpdateGestures();
+    
 #endif
     
 #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
@@ -1806,6 +1846,9 @@ static void PollInputEvents(void)
     glfwPollEvents();       // Register keyboard/mouse events... and window events!
 #elif defined(PLATFORM_ANDROID)
 
+    // Register previous keys states
+    for (int i = 0; i < 512; i++) previousButtonState[i] = currentButtonState[i];
+
     // Poll Events (registered events)
     // NOTE: Activity is paused if not enabled (appEnabled)
     while ((ident = ALooper_pollAll(appEnabled ? 0 : -1, NULL, &events,(void**)&source)) >= 0)

+ 9 - 0
src/raylib.h

@@ -186,6 +186,12 @@
 
 // TODO: Review Xbox360 USB Controller Buttons
 
+// Android Physic Buttons
+#define ANDROID_BACK            4
+#define ANDROID_MENU            82
+#define ANDROID_VOLUME_UP       24
+#define ANDROID_VOLUME_DOWN     25
+
 // Some Basic Colors
 // NOTE: Custom raylib color palette for amazing visuals on WHITE background
 #define LIGHTGRAY  (Color){ 200, 200, 200, 255 }   // Light Gray
@@ -581,6 +587,9 @@ bool IsGamepadButtonUp(int gamepad, int button);        // Detect if a gamepad b
 int GetTouchX(void);                                    // Returns touch position X (relative to screen size)
 int GetTouchY(void);                                    // Returns touch position Y (relative to screen size)
 Vector2 GetTouchPosition(void);                         // Returns touch position XY (relative to screen size)
+bool IsButtonPressed(int button);                       // Detect if an android physic button has been pressed
+bool IsButtonDown(int button);                          // Detect if an android physic button is being pressed
+bool IsButtonReleased(int button);                      // Detect if an android physic button has been released    
 
 //------------------------------------------------------------------------------------
 // Gestures and Touch Handling Functions (Module: gestures)