From a5e1aff99bf362a3ebef2d4559e7529a36d935f3 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Sat, 28 Mar 2020 18:36:30 +0100 Subject: [PATCH] [example] Integrate virtual mouse in main example --- examples/core/core_window_letterbox.c | 24 +++- examples/core/core_window_letterbox.png | Bin 17967 -> 23608 bytes .../core_window_letterbox_virtual_mouse.c | 113 ------------------ 3 files changed, 23 insertions(+), 114 deletions(-) delete mode 100644 examples/core/core_window_letterbox_virtual_mouse.c diff --git a/examples/core/core_window_letterbox.c b/examples/core/core_window_letterbox.c index fe67fe0a0..4402dd2a3 100644 --- a/examples/core/core_window_letterbox.c +++ b/examples/core/core_window_letterbox.c @@ -1,6 +1,6 @@ /******************************************************************************************* * -* raylib [core] example - window scale letterbox +* raylib [core] example - window scale letterbox (and virtual mouse) * * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) @@ -16,6 +16,18 @@ #define max(a, b) ((a)>(b)? (a) : (b)) #define min(a, b) ((a)<(b)? (a) : (b)) +// Clamp Vector2 value with min and max and return a new vector2 +// NOTE: Required for virtual mouse, to clamp inside virtual game size +Vector2 ClampValue(Vector2 value, Vector2 min, Vector2 max) +{ + Vector2 result = value; + result.x = (result.x > max.x)? max.x : result.x; + result.x = (result.x < min.x)? min.x : result.x; + result.y = (result.y > max.y)? max.y : result.y; + result.y = (result.y < min.y)? min.y : result.y; + return result; +} + int main(void) { const int windowWidth = 800; @@ -52,6 +64,13 @@ int main(void) // Recalculate random colors for the bars for (int i = 0; i < 10; i++) colors[i] = (Color){ GetRandomValue(100, 250), GetRandomValue(50, 150), GetRandomValue(10, 100), 255 }; } + + // Update virtual mouse (clamped mouse value behind game screen) + Vector2 mouse = GetMousePosition(); + Vector2 virtualMouse = { 0 }; + virtualMouse.x = (mouse.x - (GetScreenWidth() - (gameScreenWidth*scale))*0.5f)/scale; + virtualMouse.y = (mouse.y - (GetScreenHeight() - (gameScreenHeight*scale))*0.5f)/scale; + virtualMouse = ClampValue(virtualMouse, (Vector2){ 0, 0 }, (Vector2){ gameScreenWidth, gameScreenHeight }); //---------------------------------------------------------------------------------- // Draw @@ -67,6 +86,9 @@ int main(void) for (int i = 0; i < 10; i++) DrawRectangle(0, (gameScreenHeight/10)*i, gameScreenWidth, gameScreenHeight/10, colors[i]); DrawText("If executed inside a window,\nyou can resize the window,\nand see the screen scaling!", 10, 25, 20, WHITE); + + DrawText(TextFormat("Default Mouse: [%i , %i]", (int)mouse.x, (int)mouse.y), 350, 25, 20, GREEN); + DrawText(TextFormat("Virtual Mouse: [%i , %i]", (int)virtualMouse.x, (int)virtualMouse.y), 350, 55, 20, YELLOW); EndTextureMode(); diff --git a/examples/core/core_window_letterbox.png b/examples/core/core_window_letterbox.png index 5acf2d7cc28aa8c2c465f71cf748b755fd8b042e..fbdbb8646d5f3db6317ed1e48d35b783be8c771b 100644 GIT binary patch literal 23608 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 (a) : (b)) -#define min(a, b) ((a)<(b)? (a) : (b)) - -// Clamp Vector2 value with min and max and return a new vector2 -Vector2 ClampValue(Vector2 value, Vector2 min, Vector2 max) -{ - Vector2 result = value; - result.x = (result.x > max.x)? max.x : result.x; - result.x = (result.x < min.x)? min.x : result.x; - result.y = (result.y > max.y)? max.y : result.y; - result.y = (result.y < min.y)? min.y : result.y; - return result; -} - -int main(void) -{ - const int windowWidth = 800; - const int windowHeight = 450; - - // Enable config flags for resizable window and vertical synchro - SetConfigFlags(FLAG_WINDOW_RESIZABLE | FLAG_VSYNC_HINT); - InitWindow(windowWidth, windowHeight, "raylib [core] example - window scale letterbox"); - SetWindowMinSize(320, 240); - - int gameScreenWidth = 640; - int gameScreenHeight = 480; - - // Render texture initialization, used to hold the rendering result so we can easily resize it - RenderTexture2D target = LoadRenderTexture(gameScreenWidth, gameScreenHeight); - SetTextureFilter(target.texture, FILTER_BILINEAR); // Texture scale filter to use - - Color colors[10] = { 0 }; - for (int i = 0; i < 10; i++) colors[i] = (Color){ GetRandomValue(100, 250), GetRandomValue(50, 150), GetRandomValue(10, 100), 255 }; - - SetTargetFPS(60); // Set our game to run at 60 frames-per-second - //-------------------------------------------------------------------------------------- - - // Main game loop - while (!WindowShouldClose()) // Detect window close button or ESC key - { - // Update - //---------------------------------------------------------------------------------- - // Compute required framebuffer scaling - float scale = min((float)GetScreenWidth()/gameScreenWidth, (float)GetScreenHeight()/gameScreenHeight); - - // Update virtual mouse - //---------------------------------------------------------------------------------- - Vector2 mouse = GetMousePosition(); - - mouse.x = (mouse.x - (GetScreenWidth() - (gameScreenWidth*scale))*0.5f)/scale; - mouse.y = (mouse.y - (GetScreenHeight() - (gameScreenHeight*scale))*0.5f)/scale; - - // Clamp mouse value behind gamescreen - mouse = ClampValue(mouse, (Vector2){ 0, 0 }, (Vector2){ gameScreenWidth, gameScreenHeight }); - //---------------------------------------------------------------------------------- - - if (IsKeyPressed(KEY_SPACE)) - { - // Recalculate random colors for the bars - for (int i = 0; i < 10; i++) colors[i] = (Color){ GetRandomValue(100, 250), GetRandomValue(50, 150), GetRandomValue(10, 100), 255 }; - } - //---------------------------------------------------------------------------------- - - // Draw - //---------------------------------------------------------------------------------- - BeginDrawing(); - ClearBackground(BLACK); - - // Draw everything in the render texture, note this will not be rendered on screen, yet - BeginTextureMode(target); - - ClearBackground(RAYWHITE); // Clear render texture background color - - for (int i = 0; i < 10; i++) DrawRectangle(0, (gameScreenHeight/10)*i, gameScreenWidth, gameScreenHeight/10, colors[i]); - - DrawText("If executed inside a window,\nyou can resize the window,\nand see the screen scaling!", 10, 25, 20, WHITE); - DrawText( TextFormat("Virtual Mouse : %.0f , %.0f", mouse.x, mouse.y), 350, 25, 20, YELLOW); - - EndTextureMode(); - - // Draw RenderTexture2D to window, properly scaled - DrawTexturePro(target.texture, (Rectangle){ 0.0f, 0.0f, (float)target.texture.width, (float)-target.texture.height }, - (Rectangle){ (GetScreenWidth() - ((float)gameScreenWidth*scale))*0.5, (GetScreenHeight() - ((float)gameScreenHeight*scale))*0.5, - (float)gameScreenWidth*scale, (float)gameScreenHeight*scale }, (Vector2){ 0, 0 }, 0.0f, WHITE); - - EndDrawing(); - //-------------------------------------------------------------------------------------- - } - - // De-Initialization - //-------------------------------------------------------------------------------------- - UnloadRenderTexture(target); // Unload render texture - - CloseWindow(); // Close window and OpenGL context - //-------------------------------------------------------------------------------------- - - return 0; -}