瀏覽代碼

Lock cursor on first person camera

Ray 8 年之前
父節點
當前提交
fd1fe3ac14
共有 2 個文件被更改,包括 31 次插入42 次删除
  1. 15 37
      src/camera.h
  2. 16 5
      src/core.c

+ 15 - 37
src/camera.h

@@ -203,15 +203,14 @@ static int cameraMode = CAMERA_CUSTOM;                // Current camera mode
 #if defined(CAMERA_STANDALONE)
 // NOTE: Camera controls depend on some raylib input functions
 // TODO: Set your own input functions (used in UpdateCamera())
-static Vector2 GetMousePosition() { return (Vector2){ 0.0f, 0.0f }; }
-static void SetMousePosition(Vector2 pos) {} 
+static void EnableCursor() {}       // Unlock cursor
+static void DisableCursor() {}      // Lock cursor
+
+static int IsKeyDown(int key) { return 0; }
+
 static int IsMouseButtonDown(int button) { return 0;}
 static int GetMouseWheelMove() { return 0; }
-static int GetScreenWidth() { return 1280; }
-static int GetScreenHeight() { return 720; }
-static void ShowCursor() {}
-static void HideCursor() {}
-static int IsKeyDown(int key) { return 0; }
+static Vector2 GetMousePosition() { return (Vector2){ 0.0f, 0.0f }; }
 #endif
 
 //----------------------------------------------------------------------------------
@@ -246,14 +245,19 @@ void SetCameraMode(Camera camera, int mode)
     //cameraAngle.y = -60.0f*DEG2RAD;     // Camera angle in plane XY (0 aligned with X, move positive CW)
     
     playerEyesPosition = camera.position.y;
+    
+    // Lock cursor for first person and third person cameras
+    if ((mode == CAMERA_FIRST_PERSON) || 
+        (mode == CAMERA_THIRD_PERSON)) DisableCursor();
+    else EnableCursor(); 
 
     cameraMode = mode;
 }
 
 // Update camera depending on selected mode
 // NOTE: Camera controls depend on some raylib functions:
+//       System: EnableCursor(), DisableCursor()
 //       Mouse: GetMousePosition(), SetMousePosition(), IsMouseButtonDown(), GetMouseWheelMove()
-//       System: GetScreenWidth(), GetScreenHeight(), ShowCursor(), HideCursor()
 //       Keys:  IsKeyDown()
 // TODO: Port to quaternion-based camera
 void UpdateCamera(Camera *camera)
@@ -284,36 +288,10 @@ void UpdateCamera(Camera *camera)
 
     if (cameraMode != CAMERA_CUSTOM)
     {
-        // Get screen size
-        int screenWidth = GetScreenWidth();
-        int screenHeight = GetScreenHeight();
-        
-        if ((cameraMode == CAMERA_FIRST_PERSON) || 
-            (cameraMode == CAMERA_THIRD_PERSON))
-        {
-            HideCursor();
-
-            if (mousePosition.x < (float)screenHeight/3.0f) SetMousePosition((Vector2){ screenWidth - screenHeight/3, mousePosition.y });
-            else if (mousePosition.y < (float)screenHeight/3.0f) SetMousePosition((Vector2){ mousePosition.x, screenHeight - screenHeight/3 });
-            else if (mousePosition.x > (screenWidth - (float)screenHeight/3.0f)) SetMousePosition((Vector2){ screenHeight/3, mousePosition.y });
-            else if (mousePosition.y > (screenHeight - (float)screenHeight/3.0f)) SetMousePosition((Vector2){ mousePosition.x, screenHeight/3 });
-            else
-            {
-                mousePositionDelta.x = mousePosition.x - previousMousePosition.x;
-                mousePositionDelta.y = mousePosition.y - previousMousePosition.y;
-            }
-        }
-        else    // CAMERA_FREE, CAMERA_ORBITAL
-        {
-            ShowCursor();
-
-            mousePositionDelta.x = mousePosition.x - previousMousePosition.x;
-            mousePositionDelta.y = mousePosition.y - previousMousePosition.y;
-        }
+        mousePositionDelta.x = mousePosition.x - previousMousePosition.x;
+        mousePositionDelta.y = mousePosition.y - previousMousePosition.y;
 
-        // NOTE: We GetMousePosition() again because it can be modified by a previous SetMousePosition() call
-        // If using directly mousePosition variable we have problems on CAMERA_FIRST_PERSON and CAMERA_THIRD_PERSON
-        previousMousePosition = GetMousePosition();
+        previousMousePosition = mousePosition;
     }
 
     // Support for multiple automatic camera modes

+ 16 - 5
src/core.c

@@ -286,6 +286,10 @@ static int gamepadAxisCount = 0;            // Register number of available game
 
 static Vector2 mousePosition;               // Mouse position on screen
 
+#if defined(PLATFORM_WEB)
+static bool toggleCursorLock = false;       // Ask for cursor pointer lock on next click
+#endif
+
 #if defined(SUPPORT_GESTURES_SYSTEM)
 static Vector2 touchPosition[MAX_TOUCH_POINTS]; // Touch position on screen
 #endif
@@ -708,6 +712,9 @@ void EnableCursor()
 {
 #if defined(PLATFORM_DESKTOP)
     glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
+#endif
+#if defined(PLATFORM_WEB)
+    toggleCursorLock = true;
 #endif
     cursorHidden = false;
 }
@@ -717,6 +724,9 @@ void DisableCursor()
 {
 #if defined(PLATFORM_DESKTOP)
     glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
+#endif
+#if defined(PLATFORM_WEB)
+    toggleCursorLock = true;
 #endif
     cursorHidden = true;
 }
@@ -1821,12 +1831,13 @@ static void InitGraphicsDevice(int width, int height)
 
     const EGLint framebufferAttribs[] =
     {
-        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,    // Type of context support -> Required on RPI?
-        //EGL_SURFACE_TYPE, EGL_WINDOW_BIT,         // Don't use it on Android!
+        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,     // Type of context support -> Required on RPI?
+        //EGL_SURFACE_TYPE, EGL_WINDOW_BIT,          // Don't use it on Android!
         EGL_RED_SIZE, 8,            // RED color bit depth (alternative: 5)
         EGL_GREEN_SIZE, 8,          // GREEN color bit depth (alternative: 6)
         EGL_BLUE_SIZE, 8,           // BLUE color bit depth (alternative: 5)
         //EGL_ALPHA_SIZE, 8,        // ALPHA bit depth
+        //EGL_TRANSPARENT_TYPE, EGL_TRANSPARENT_RGB, // Request transparent framebuffer
         EGL_DEPTH_SIZE, 16,         // Depth buffer size (Required to use Depth testing!)
         //EGL_STENCIL_SIZE, 8,      // Stencil buffer size
         EGL_SAMPLE_BUFFERS, sampleBuffer,    // Activate MSAA
@@ -2744,9 +2755,8 @@ static EM_BOOL EmscriptenKeyboardCallback(int eventType, const EmscriptenKeyboar
 // Register mouse input events
 static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
 {
-    /*
     // Lock mouse pointer when click on screen
-    if (eventType == EMSCRIPTEN_EVENT_CLICK)
+    if ((eventType == EMSCRIPTEN_EVENT_CLICK) && toggleCursorLock)
     {
         EmscriptenPointerlockChangeEvent plce;
         emscripten_get_pointerlock_status(&plce);
@@ -2758,8 +2768,9 @@ static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent
             emscripten_get_pointerlock_status(&plce);
             //if (plce.isActive) TraceLog(WARNING, "Pointer lock exit did not work!");
         }
+        
+        toggleCursorLock = false;
     }
-    */
     
     return 0;
 }