Selaa lähdekoodia

[examples] Added `shapes_lines_drawing` (#5283)

* Added shapes_lines_drawing Example

* store result of clamp

* conventions

* fixed more brackets

* buffer comments
Robin ❤️ 1 kuukausi sitten
vanhempi
sitoutus
3c5b3f1c17

+ 146 - 0
examples/shapes/shapes_lines_drawing.c

@@ -0,0 +1,146 @@
+/*******************************************************************************************
+*
+*   raylib [shapes] example - lines drawing
+*
+*   Example complexity rating: [★☆☆☆] 1/4
+*
+*   Example originally created with raylib 5.6-dev, last time updated with raylib 5.6
+*
+*   Example contributed by Robin (@RobinsAviary) 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) 2025-2025 Robin (@RobinsAviary)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "raymath.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+	// Initialization
+	//--------------------------------------------------------------------------------------
+	const int screenWidth = 800;
+	const int screenHeight = 450;
+
+	InitWindow(screenWidth, screenHeight, "raylib [shapes] example - lines drawing");
+
+	// Hint text that shows before you click the screen
+	bool startText = true;
+
+	// The mouse's position on the previous frame
+	Vector2 mousePositionPrevious = GetMousePosition();
+
+	// The canvas to draw lines on
+	RenderTexture canvas = LoadRenderTexture(screenWidth, screenHeight);
+
+	// The background color of the canvas
+	const Color backgroundColor = RAYWHITE;
+
+	// The line's thickness
+	float lineThickness = 8.0f;
+	// The lines hue (in HSV, from 0-360)
+	float lineHue = 0.0f;
+
+	// Clear the canvas to the background color
+	BeginTextureMode(canvas);
+		ClearBackground(backgroundColor);
+	EndTextureMode();
+	//--------------------------------------------------------------------------------------
+
+	// Main game loop
+	while (!WindowShouldClose())    // Detect window close button or ESC key
+	{
+		// Update
+		//----------------------------------------------------------------------------------
+		// Disable the hint text once the user clicks
+		if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && startText)
+		{
+			startText = false;
+		}
+
+		// Clear the canvas when the user middle-clicks
+		if (IsMouseButtonPressed(MOUSE_BUTTON_MIDDLE))
+		{
+			BeginTextureMode(canvas);
+				ClearBackground(backgroundColor);
+			EndTextureMode();
+		}
+
+		// Store whether the left and right buttons are down
+		bool leftButtonDown = IsMouseButtonDown(MOUSE_BUTTON_LEFT);
+		bool rightButtonDown = IsMouseButtonDown(MOUSE_BUTTON_RIGHT);
+
+		if (leftButtonDown || rightButtonDown)
+		{
+			// The color for the line
+			Color drawColor;
+
+			if (leftButtonDown)
+			{
+				// Increase the hue value by the distance our cursor has moved since the last frame (divided by 3)
+				lineHue += Vector2Distance(mousePositionPrevious, GetMousePosition())/3.0f;
+
+				// While the hue is >=360, subtract it to bring it down into the range 0-360
+				// This is more visually accurate than resetting to zero
+				while (lineHue >= 360.0f)
+				{
+					lineHue -= 360.0f;
+				}
+
+				// Create the final color
+				drawColor = ColorFromHSV(lineHue, 1.0f, 1.0f);
+			}
+			else if (rightButtonDown) 
+			{
+				// Use the background color as an "eraser"
+				drawColor = backgroundColor;
+			}
+
+			// Draw the line onto the canvas
+			BeginTextureMode(canvas);
+				// Circles act as "caps", smoothing corners
+				DrawCircleV(mousePositionPrevious, lineThickness/2.0f, drawColor);
+				DrawCircleV(GetMousePosition(), lineThickness/2.0f, drawColor);
+				DrawLineEx(mousePositionPrevious, GetMousePosition(), lineThickness, drawColor);
+			EndTextureMode();
+		}
+
+		// Update line thickness based on mousewheel
+		lineThickness += GetMouseWheelMove();
+		lineThickness = Clamp(lineThickness, 1.0, 500.0f);
+
+		// Update mouse's previous position
+		mousePositionPrevious = GetMousePosition();
+		//----------------------------------------------------------------------------------
+
+		// Draw
+		//----------------------------------------------------------------------------------
+		BeginDrawing();
+			// Draw the render texture to the screen, flipped vertically to make it appear top-side up
+			DrawTextureRec(canvas.texture, (Rectangle){ 0.0f, 0.0f, (float)canvas.texture.width,(float)-canvas.texture.height }, Vector2Zero(), WHITE);
+
+			// Draw the preview circle
+			if (!leftButtonDown) DrawCircleLinesV(GetMousePosition(), lineThickness/2.0f, (Color){ 127, 127, 127, 127 });
+
+			// Draw the hint text
+			if (startText) DrawText("try clicking and dragging!", 275, 215, 20, LIGHTGRAY);
+		EndDrawing();
+		//----------------------------------------------------------------------------------
+	}
+
+	// De-Initialization
+	//--------------------------------------------------------------------------------------
+	// Unload the canvas render texture
+	UnloadRenderTexture(canvas);
+
+	CloseWindow();        // Close window and OpenGL context
+	//--------------------------------------------------------------------------------------
+
+	return 0;
+}

BIN
examples/shapes/shapes_lines_drawing.png