From 50048a56651297876e476d6d6f81db9eca9af2eb Mon Sep 17 00:00:00 2001 From: Srdan Lukovic Date: Tue, 2 Apr 2024 18:44:21 +0200 Subject: [PATCH 1/2] Round zoom level to avoid upscale/downscale artefacts. --- eepers.adb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/eepers.adb b/eepers.adb index 205d666..a268eed 100644 --- a/eepers.adb +++ b/eepers.adb @@ -1029,6 +1029,8 @@ procedure Eepers is Camera_Target: constant Vector2 := To_Vector2(Game.Player.Position)*Cell_Size; Camera_Offset: constant Vector2 := Screen_Size*0.5 - Cell_Size*0.5; Camera_Velocity: constant Vector2 := (Camera_Target - Game.Camera.target)*2.0; + -- set the zoom level to the ratio of the current and the reference screen size (FHD) and round it to the first decimal + Camera_Zoom: constant C_Float := C_Float'Rounding(C_Float'Max(Screen_Size.x/1920.0, Screen_Size.y/1080.0) * 10.0) / 10.0; begin Game.Camera.offset := Camera_Offset; Game.Camera.target := Game.Camera.target + Camera_Velocity*Get_Frame_Time; @@ -1036,7 +1038,7 @@ procedure Eepers is -- So it looks cool when you resize the game in the window mode. -- TODO: The tutorial signs look gross on bigger screens. -- We need to do something with the fonts - Game.Camera.zoom := C_Float'Max(Screen_Size.x/1920.0, Screen_Size.y/1080.0); + Game.Camera.zoom := Camera_Zoom; end; function Interpolate_Positions(IPrev_Position, IPosition: IVector2; T: Float) return Vector2 is From dd8c39984d87a5f8b9444f9b0120e4d7f02dfcea Mon Sep 17 00:00:00 2001 From: Srdan Lukovic Date: Tue, 2 Apr 2024 18:44:43 +0200 Subject: [PATCH 2/2] Animate zoom level changes --- eepers.adb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/eepers.adb b/eepers.adb index a268eed..3d963dd 100644 --- a/eepers.adb +++ b/eepers.adb @@ -1029,16 +1029,17 @@ procedure Eepers is Camera_Target: constant Vector2 := To_Vector2(Game.Player.Position)*Cell_Size; Camera_Offset: constant Vector2 := Screen_Size*0.5 - Cell_Size*0.5; Camera_Velocity: constant Vector2 := (Camera_Target - Game.Camera.target)*2.0; + -- set the zoom level to the ratio of the current and the reference screen size (FHD) and round it to the first decimal Camera_Zoom: constant C_Float := C_Float'Rounding(C_Float'Max(Screen_Size.x/1920.0, Screen_Size.y/1080.0) * 10.0) / 10.0; + Camera_Zoom_Velocity: constant C_Float := (Camera_Zoom - Game.Camera.zoom)*4.0; begin Game.Camera.offset := Camera_Offset; Game.Camera.target := Game.Camera.target + Camera_Velocity*Get_Frame_Time; - -- TODO: animate zoom similarly to Game.Camera.target - -- So it looks cool when you resize the game in the window mode. -- TODO: The tutorial signs look gross on bigger screens. -- We need to do something with the fonts Game.Camera.zoom := Camera_Zoom; + Game.Camera.zoom := Game.Camera.zoom + Camera_Zoom_Velocity*Get_Frame_Time; end; function Interpolate_Positions(IPrev_Position, IPosition: IVector2; T: Float) return Vector2 is