diff -r b2beb784e4b5 -r 9443dc6663ba hedgewars/uCursor.pas --- 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);