Procházet zdrojové kódy

Reviewed multitouch example #1988

raysan5 před 3 roky
rodič
revize
dd6e006d78
2 změnil soubory, kde provedl 15 přidání a 31 odebrání
  1. 9 30
      examples/core/core_input_multitouch.c
  2. 6 1
      src/rcore.c

+ 9 - 30
examples/core/core_input_multitouch.c

@@ -24,11 +24,7 @@ int main(void)
 
     InitWindow(screenWidth, screenHeight, "raylib [core] example - input multitouch");
 
-    Vector2 ballPosition = { -100.0f, -100.0f };
-    Color ballColor = BEIGE;
-
-    int touchCounter = 0;
-    Vector2 touchPosition = { 0 };
+    Vector2 touchPositions[MAX_TOUCH_POINTS] = { 0 };
 
     SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
     //---------------------------------------------------------------------------------------
@@ -38,19 +34,8 @@ int main(void)
     {
         // Update
         //----------------------------------------------------------------------------------
-        ballPosition = GetMousePosition();
-
-        ballColor = BEIGE;
-
-        if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) ballColor = MAROON;
-        if (IsMouseButtonDown(MOUSE_BUTTON_MIDDLE)) ballColor = LIME;
-        if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) ballColor = DARKBLUE;
-
-        if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) touchCounter = 10;
-        if (IsMouseButtonPressed(MOUSE_BUTTON_MIDDLE)) touchCounter = 10;
-        if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) touchCounter = 10;
-
-        if (touchCounter > 0) touchCounter--;
+        // Get multiple touchpoints
+        for (int i = 0; i < MAX_TOUCH_POINTS; ++i) touchPositions[i] = GetTouchPosition(i);
         //----------------------------------------------------------------------------------
 
         // Draw
@@ -58,25 +43,19 @@ int main(void)
         BeginDrawing();
 
             ClearBackground(RAYWHITE);
-
-            // Multitouch
+            
             for (int i = 0; i < MAX_TOUCH_POINTS; ++i)
             {
-                touchPosition = GetTouchPosition(i);                    // Get the touch point
-
-                if ((touchPosition.x >= 0) && (touchPosition.y >= 0))   // Make sure point is not (-1,-1) as this means there is no touch for it
+                // Make sure point is not (0, 0) as this means there is no touch for it
+                if ((touchPositions[i].x > 0) && (touchPositions[i].y > 0))
                 {
                     // Draw circle and touch index number
-                    DrawCircleV(touchPosition, 34, ORANGE);
-                    DrawText(TextFormat("%d", i), (int)touchPosition.x - 10, (int)touchPosition.y - 70, 40, BLACK);
+                    DrawCircleV(touchPositions[i], 34, ORANGE);
+                    DrawText(TextFormat("%d", i), (int)touchPositions[i].x - 10, (int)touchPositions[i].y - 70, 40, BLACK);
                 }
             }
 
-            // Draw the normal mouse location
-            DrawCircleV(ballPosition, 30 + (touchCounter*3.0f), ballColor);
-
-            DrawText("move ball with mouse and click mouse button to change color", 10, 10, 20, DARKGRAY);
-            DrawText("touch the screen at multiple locations to get multiple balls", 10, 30, 20, DARKGRAY);
+            DrawText("touch the screen at multiple locations to get multiple balls", 10, 10, 20, DARKGRAY);
 
         EndDrawing();
         //----------------------------------------------------------------------------------

+ 6 - 1
src/rcore.c

@@ -3876,7 +3876,7 @@ static bool InitGraphicsDevice(int width, int height)
 
 #if defined(PLATFORM_DESKTOP)
     // NOTE: GLFW 3.4+ defers initialization of the Joystick subsystem on the first call to any Joystick related functions.
-    // Forcing this initialization here avoids doing it on `PollInputEvents` called by `EndDrawing` after first frame has been just drawn.
+    // Forcing this initialization here avoids doing it on PollInputEvents() called by EndDrawing() after first frame has been just drawn.
     // The initialization will still happen and possible delays still occur, but before the window is shown, which is a nicer experience.
     // REF: https://github.com/raysan5/raylib/issues/1554
     if (MAX_GAMEPADS > 0) glfwSetJoystickCallback(NULL);
@@ -4765,6 +4765,11 @@ void PollInputEvents(void)
 
     // Register previous touch states
     for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.previousTouchState[i] = CORE.Input.Touch.currentTouchState[i];
+    
+    // Reset touch positions
+    // TODO: It resets on PLATFORM_WEB the mouse position and not filled again until a move-event,
+    // so, if mouse is not moved it returns a (0, 0) position... this behaviour should be reviewed!
+    //for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.position[i] = (Vector2){ 0, 0 };
 
 #if defined(PLATFORM_DESKTOP)
     // Check if gamepads are ready