--- 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);