From bb47dcc9f9b4231d891d068b8e31fa17ebdfab33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Ortega=20Froysa?= Date: Mon, 16 Mar 2026 21:17:23 +0100 Subject: [PATCH] Implement zoom. --- src/event_manager.c | 7 +++++++ src/event_manager.h | 4 +++- src/globals.h | 10 ++++++++++ src/main.c | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/event_manager.c b/src/event_manager.c index a4d1294..fb31900 100644 --- a/src/event_manager.c +++ b/src/event_manager.c @@ -104,6 +104,13 @@ void set_key(int keycode, int value) { case ALLEGRO_KEY_P: keys[KEY_PAUSE] = value; break; + case ALLEGRO_KEY_LSHIFT: + case ALLEGRO_KEY_RSHIFT: + keys[KEY_SHIFT] = value; + break; + case ALLEGRO_KEY_Z: + keys[KEY_ZOOM] = value; + break; default: break; } diff --git a/src/event_manager.h b/src/event_manager.h index f4dbfa1..7d86c38 100644 --- a/src/event_manager.h +++ b/src/event_manager.h @@ -28,7 +28,9 @@ enum { KEY_RESET = 0x4, KEY_FULLSCREEN = 0x5, KEY_PAUSE = 0x6, - KEY_MAX = 0x7 + KEY_ZOOM = 0x7, + KEY_SHIFT = 0x8, + KEY_MAX = 0x9 }; /** diff --git a/src/globals.h b/src/globals.h index f2d568b..218dbba 100644 --- a/src/globals.h +++ b/src/globals.h @@ -39,6 +39,16 @@ # define WINDOW_HEIGHT 600 #endif +#ifndef ZOOM_MIN +# define ZOOM_MIN 0.25f +#endif +#ifndef ZOOM_MAX +# define ZOOM_MAX 4.0f +#endif +#ifndef ZOOM_STEP +# define ZOOM_STEP 0.1f +#endif + #include #ifndef M_PI # define M_PI 3.14159265f diff --git a/src/main.c b/src/main.c index a4915b7..3b34bc9 100644 --- a/src/main.c +++ b/src/main.c @@ -39,6 +39,8 @@ const char *help = "I - show/hide simulation information\n" "H - show/hide this help information\n" "F - toggle fullscreen\n" + "Z - zoom in\n" + "SHIFT+Z - zoom out\n" "Q/ESC - quit"; const char *info_format = @@ -51,6 +53,7 @@ const char *info_format = int main() { char title[32]; + float zoom = 1.0f; sprintf(title, "SpaceShipSim v%s", VERSION); puts(title); @@ -109,6 +112,7 @@ int main() { int paused = 0; int old_paused = 0; int just_toggled_fullscreen = 0; + int zoom_pressed = 0; while(run) { handle_event(); @@ -146,8 +150,39 @@ int main() { just_toggled_fullscreen = 0; } + if(key_is_down(KEY_SHIFT) && key_is_down(KEY_ZOOM) && !zoom_pressed) + { + zoom -= ZOOM_STEP; + if(zoom < ZOOM_MIN) + zoom = ZOOM_MIN; + zoom_pressed = 1; + } + else if(key_is_down(KEY_ZOOM) && !zoom_pressed) + { + zoom += ZOOM_STEP; + if(zoom > ZOOM_MAX) + zoom = ZOOM_MAX; + zoom_pressed = 1; + } + else if(!key_is_down(KEY_ZOOM) && zoom_pressed) + { + zoom_pressed = 0; + } + al_clear_to_color(al_map_rgb(0, 0, 0)); + + ALLEGRO_TRANSFORM transform; + al_identity_transform(&transform); + al_scale_transform(&transform, zoom, zoom); + al_translate_transform(&transform, (WINDOW_WIDTH / 2.0f) * (1.0f - 1.0f / zoom), + (WINDOW_HEIGHT / 2.0f) * (1.0f - 1.0f / zoom)); + al_use_transform(&transform); + ship_draw(&ship); + + al_identity_transform(&transform); + al_use_transform(&transform); + if(show_info) { char info[256];