hedgewars/uCursor.pas
changeset 14813 9443dc6663ba
parent 14289 a3531b520efb
child 14814 c2793ff4e887
--- a/hedgewars/uCursor.pas	Tue Apr 16 00:07:15 2019 +0300
+++ b/hedgewars/uCursor.pas	Thu Apr 18 19:44:25 2019 +0200
@@ -4,7 +4,9 @@
 
 procedure init;
 procedure resetPosition;
-procedure updatePosition;
+procedure resetPositionDelta();
+procedure updatePositionDelta(xrel, yrel: LongInt);
+procedure updatePosition();
 procedure handlePositionUpdate(x, y: LongInt);
 
 implementation
@@ -13,38 +15,35 @@
 
 procedure init;
 begin
+    SDL_ShowCursor(SDL_DISABLE);
     resetPosition();
+    SDL_SetRelativeMouseMode(SDL_TRUE);
 end;
 
 procedure resetPosition;
 begin
     if GameType = gmtRecord then
         exit;
-    // Move curser by 1px in case it's already centered.
-    // The game camera in the Alpha for 0.9.23 screwed up if
-    // the game started with the mouse already being centered.
-    // This fixes it, but we might have overlooked a related
-    // bug somewhere else.
-    // No big deal since this function is (so far) only called once.
-    SDL_WarpMouse((cScreenWidth div 2) + 1, cScreenHeight div 2);
     SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2);
+    resetPositionDelta();
+end;
+
+procedure resetPositionDelta();
+begin
+    CursorPointDelta.X:= 0;
+    CursorPointDelta.Y:= 0;
 end;
 
-procedure updatePosition;
-var x, y: LongInt;
+procedure updatePositionDelta(xrel, yrel: LongInt);
 begin
-	x:= cScreenWidth div 2;
-	y:= cScreenHeight div 2;
-    if GameType <> gmtRecord then
-        SDL_GetMouseState(@x, @y);
+    CursorPointDelta.X:= CursorPointDelta.X + xrel;
+    CursorPointDelta.Y:= CursorPointDelta.Y + yrel;
+end;
 
-    if(x <> cScreenWidth div 2) or (y <> cScreenHeight div 2) then
-    begin
-        handlePositionUpdate(x - cScreenWidth div 2, y - cScreenHeight div 2);
-
-        if cHasFocus and (GameType <> gmtRecord) then
-            SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2);
-    end
+procedure updatePosition();
+begin
+    handlePositionUpdate(CursorPointDelta.X, CursorPointDelta.Y);
+    resetPositionDelta();
 end;
 
 procedure handlePositionUpdate(x, y: LongInt);