From 9a6288455f840e50c69a1dc240658b95747d4ff2 Mon Sep 17 00:00:00 2001 From: Maicon Santana Date: Fri, 1 Aug 2025 15:37:21 +0100 Subject: [PATCH] Add simple side to side ui controller example --- examples/core/core_input_ui.c | 113 ++++++++++++++++++++++++++++++++ examples/core/core_input_ui.png | Bin 0 -> 6740 bytes 2 files changed, 113 insertions(+) create mode 100644 examples/core/core_input_ui.c create mode 100644 examples/core/core_input_ui.png diff --git a/examples/core/core_input_ui.c b/examples/core/core_input_ui.c new file mode 100644 index 000000000..c2b71aa5b --- /dev/null +++ b/examples/core/core_input_ui.c @@ -0,0 +1,113 @@ +/******************************************************************************************* +* +* raylib [core] example - UI input +* +* Example complexity rating: [★☆☆☆] 1/4 +* +* Example originally created with raylib 5.6, last time updated with raylib 5.6 +* +* Example contributed by Maicon Santana (@maiconpintoabreu) and reviewed by Ramon Santamaria (@raysan5) +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2018-2025 Maicon Santana (@maiconpintoabreu) +* +********************************************************************************************/ + +#include "raylib.h" + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- +static bool UIButtomIcon(Vector2 position, Texture2D icon); // Check if button clicked + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - ui input"); + Image arrowImage = GenImageColor(64, 64, BLANK); + ImageDrawTriangle(&arrowImage, (Vector2){4, 31}, (Vector2){37, 4}, (Vector2){37, 59}, GRAY); + Texture2D leftArrow = LoadTextureFromImage(arrowImage); + ImageRotate(&arrowImage, 180); + Texture2D rightArrow = LoadTextureFromImage(arrowImage); + UnloadImage(arrowImage); + + Vector2 ballPosition = { (float)screenWidth/2, (float)screenHeight/3 }; + + 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 + //---------------------------------------------------------------------------------- + if (IsKeyDown(KEY_RIGHT)) ballPosition.x += 2.0f; + if (IsKeyDown(KEY_LEFT)) ballPosition.x -= 2.0f; + if (IsKeyDown(KEY_UP)) ballPosition.y -= 2.0f; + if (IsKeyDown(KEY_DOWN)) ballPosition.y += 2.0f; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText("move the ball with ui buttons", 10, 10, 20, DARKGRAY); + + if (UIButtomIcon((Vector2){250, screenHeight - 120}, rightArrow)) ballPosition.x += 2.0f; + if (UIButtomIcon((Vector2){100, screenHeight - 120}, leftArrow)) ballPosition.x -= 2.0f; + + DrawCircleV(ballPosition, 50, MAROON); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + + UnloadTexture(rightArrow); + UnloadTexture(leftArrow); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +static bool UIButtomIcon(Vector2 position, Texture2D icon) { + // Check for Houver and Draw the button + //-------------------------------------------------------------------------------------- + bool checkHouver = CheckCollisionPointCircle(GetMousePosition(), position, icon.width); + DrawCircle(position.x, position.y, icon.width, checkHouver ? LIGHTGRAY : DARKGRAY); + DrawTexture(icon, position.x - icon.width / 2, position.y - icon.width / 2, WHITE); + //-------------------------------------------------------------------------------------- + + // Check Mouse Left Button + //-------------------------------------------------------------------------------------- + if (checkHouver && IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + return true; + } + //-------------------------------------------------------------------------------------- + + // Check All Current Touch Points + //-------------------------------------------------------------------------------------- + int touchCount = GetTouchPointCount(); + for (int i = 0; i < touchCount; i++) { + if (CheckCollisionPointCircle(GetTouchPosition(i), position, icon.width)) { + return true; + } + } + //-------------------------------------------------------------------------------------- + return false; +} \ No newline at end of file diff --git a/examples/core/core_input_ui.png b/examples/core/core_input_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..497265f74dc7ee22cad76a10c14919bf0b311f87 GIT binary patch literal 6740 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 E0QofKfdBvi literal 0 HcmV?d00001