From 274a0b58548fddff11a5ef29adcb17a1e290e645 Mon Sep 17 00:00:00 2001 From: Per Hultqvist Date: Thu, 17 Oct 2024 11:54:12 +0200 Subject: [PATCH 1/5] New example : Textures/npatch_drawing --- examples/textures/npatch_drawing/main.go | 134 ++++++++++++++++++ .../npatch_drawing/ninepatch_button.png | Bin 0 -> 5902 bytes 2 files changed, 134 insertions(+) create mode 100644 examples/textures/npatch_drawing/main.go create mode 100644 examples/textures/npatch_drawing/ninepatch_button.png diff --git a/examples/textures/npatch_drawing/main.go b/examples/textures/npatch_drawing/main.go new file mode 100644 index 0000000..84048c0 --- /dev/null +++ b/examples/textures/npatch_drawing/main.go @@ -0,0 +1,134 @@ +/******************************************************************************************* +* +* raylib [textures] example - N-patch drawing +* +* NOTE: Images are loaded in CPU memory (RAM); textures are loaded in GPU memory (VRAM) +* +* Example originally created with raylib 2.0, last time updated with raylib 2.5 +* +* Example contributed by Jorge A. Gomes (@overdev) 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-2024 Jorge A. Gomes (@overdev) and Ramon Santamaria (@raysan5) +* +********************************************************************************************/ +package main + +import rl "github.com/gen2brain/raylib-go/raylib" + +const ( + screenWidth = 800 + screenHeight = 450 +) + +func main() { + rl.InitWindow(screenWidth, screenHeight, "raylib [textures] example - N-patch drawing") + + // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) + nPatchTexture := rl.LoadTexture("ninepatch_button.png") + + var mousePosition rl.Vector2 + var origin rl.Vector2 + + // Position and size of the n-patches + dstRec1 := rl.Rectangle{X: 480.0, Y: 160.0, Width: 32.0, Height: 32.0} + dstRec2 := rl.Rectangle{X: 160.0, Y: 160.0, Width: 32.0, Height: 32.0} + dstRecH := rl.Rectangle{X: 160.0, Y: 93.0, Width: 32.0, Height: 32.0} + dstRecV := rl.Rectangle{X: 92.0, Y: 160.0, Width: 32.0, Height: 32.0} + + // A 9-patch (NPatchNinePatch) changes its sizes in both axis + ninePatchInfo1 := rl.NPatchInfo{ + Source: rl.Rectangle{Width: 64.0, Height: 64.0}, + Left: 12, + Top: 40, + Right: 12, + Bottom: 12, + Layout: rl.NPatchNinePatch, + } + ninePatchInfo2 := rl.NPatchInfo{ + Source: rl.Rectangle{Y: 128.0, Width: 64.0, Height: 64.0}, + Left: 16, + Top: 16, + Right: 16, + Bottom: 16, + Layout: rl.NPatchNinePatch, + } + + // A horizontal 3-patch (NPatchThreePatchHorizontal) changes its sizes along the x-axis only + h3PatchInfo := rl.NPatchInfo{ + Source: rl.Rectangle{Y: 64.0, Width: 64.0, Height: 64.0}, + Left: 8, + Top: 8, + Right: 8, + Bottom: 8, + Layout: rl.NPatchThreePatchHorizontal, + } + + // A vertical 3-patch (NPatchThreePatchVertical) changes its sizes along the y-axis only + v3PatchInfo := rl.NPatchInfo{ + Source: rl.Rectangle{Y: 192.0, Width: 64.0, Height: 64.0}, + Left: 6, + Top: 6, + Right: 6, + Bottom: 6, + Layout: rl.NPatchThreePatchVertical, + } + + rl.SetTargetFPS(60) + + // Main game loop + for !rl.WindowShouldClose() { // Detect window close button or ESC key + mousePosition = rl.GetMousePosition() + + // Resize the n-patches based on mouse position + dstRec1.Width = mousePosition.X - dstRec1.X + dstRec1.Height = mousePosition.Y - dstRec1.Y + dstRec2.Width = mousePosition.X - dstRec2.X + dstRec2.Height = mousePosition.Y - dstRec2.Y + dstRecH.Width = mousePosition.X - dstRecH.X + dstRecV.Height = mousePosition.Y - dstRecV.Y + + // Set a minimum Width and/or Height + dstRec1.Width = clamp(dstRec1.Width, 1, 300) + dstRec1.Height = clamp(dstRec1.Height, 1, screenHeight) + dstRec2.Width = clamp(dstRec2.Width, 1, 300) + dstRec2.Height = clamp(dstRec2.Height, 1, screenHeight) + dstRecH.Width = clamp(dstRecH.Width, 1, screenWidth) + dstRecV.Height = clamp(dstRecV.Height, 1, screenHeight) + + // Draw + rl.BeginDrawing() + rl.ClearBackground(rl.RayWhite) + + // Draw the n-patches + rl.DrawTextureNPatch(nPatchTexture, ninePatchInfo2, dstRec2, origin, 0.0, rl.White) + rl.DrawTextureNPatch(nPatchTexture, ninePatchInfo1, dstRec1, origin, 0.0, rl.White) + rl.DrawTextureNPatch(nPatchTexture, h3PatchInfo, dstRecH, origin, 0.0, rl.White) + rl.DrawTextureNPatch(nPatchTexture, v3PatchInfo, dstRecV, origin, 0.0, rl.White) + + // Draw the source texture + rl.DrawRectangleLines(5, 88, 74, 266, rl.Blue) + rl.DrawTexture(nPatchTexture, 10, 93, rl.White) + rl.DrawText("TEXTURE", 15, 360, 10, rl.DarkGray) + + rl.DrawText("Move the mouse to stretch or shrink the n-patches", 10, 20, 20, rl.DarkGray) + + rl.EndDrawing() + } + + // De-Initialization + rl.UnloadTexture(nPatchTexture) // Texture unloading + rl.CloseWindow() // Close window and OpenGL context +} + +func clamp(value, min, max float32) float32 { + if value < min { + return min + } + if value > max { + return max + } + return value +} diff --git a/examples/textures/npatch_drawing/ninepatch_button.png b/examples/textures/npatch_drawing/ninepatch_button.png new file mode 100644 index 0000000000000000000000000000000000000000..f10037a0fc1664dcbdcc027ec3cdbb5757098835 GIT binary patch literal 5902 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 literal 0 HcmV?d00001 From cf5c9f8b9ad62a69a1e7a53a518cc033593687d2 Mon Sep 17 00:00:00 2001 From: Per Hultqvist Date: Thu, 17 Oct 2024 12:25:19 +0200 Subject: [PATCH 2/5] New example : Textures/sprite_anim --- examples/textures/sprite_anim/main.go | 98 +++++++++++++++++++++++ examples/textures/sprite_anim/scarfy.png | Bin 0 -> 10394 bytes 2 files changed, 98 insertions(+) create mode 100644 examples/textures/sprite_anim/main.go create mode 100644 examples/textures/sprite_anim/scarfy.png diff --git a/examples/textures/sprite_anim/main.go b/examples/textures/sprite_anim/main.go new file mode 100644 index 0000000..10e5383 --- /dev/null +++ b/examples/textures/sprite_anim/main.go @@ -0,0 +1,98 @@ +/******************************************************************************************* +* +* raylib [textures] example - Sprite animation +* +* Example originally created with raylib 1.3, last time updated with raylib 1.3 +* +* 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) 2014-2024 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ +package main + +import ( + "fmt" + + rl "github.com/gen2brain/raylib-go/raylib" +) + +const ( + screenWidth = 800 + screenHeight = 450 + maxFramesSpeed = 15 + minFramesSpeed = 1 +) + +func main() { + rl.InitWindow(screenWidth, screenHeight, "raylib [texture] example - sprite anim") + + // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) + scarfy := rl.LoadTexture("scarfy.png") // Texture loading + + position := rl.Vector2{X: 350.0, Y: 280.0} + frameRec := rl.Rectangle{Width: float32(scarfy.Width / 6), Height: float32(scarfy.Height)} + var currentFrame, framesCounter, framesSpeed int32 = 0, 0, 8 + + rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second + + // Main game loop + for !rl.WindowShouldClose() { // Detect window close button or ESC key + framesCounter++ + + if framesCounter >= (60 / framesSpeed) { + framesCounter = 0 + currentFrame++ + + if currentFrame > 5 { + currentFrame = 0 + } + + frameRec.X = float32(currentFrame*scarfy.Width) / 6 + } + + // Control frames speed + if rl.IsKeyPressed(rl.KeyRight) { + framesSpeed++ + } else if rl.IsKeyPressed(rl.KeyLeft) { + framesSpeed-- + } + + // Make sure that framesSpeed is between minFramesSpeed and maxFramesSpeed + framesSpeed = clamp(framesSpeed, minFramesSpeed, maxFramesSpeed) + + // Draw + rl.BeginDrawing() + rl.ClearBackground(rl.RayWhite) + + rl.DrawTexture(scarfy, 15, 40, rl.White) + rl.DrawRectangleLines(15, 40, scarfy.Width, scarfy.Height, rl.Lime) + rl.DrawRectangleLines(15+int32(frameRec.X), 40+int32(frameRec.Y), int32(frameRec.Width), int32(frameRec.Height), rl.Red) + + rl.DrawText("FRAME SPEED: ", 165, 210, 10, rl.DarkGray) + rl.DrawText(fmt.Sprintf("%02d FPS", framesSpeed), 575, 210, 10, rl.DarkGray) + rl.DrawText("PRESS RIGHT/LEFT KEYS to CHANGE SPEED!", 290, 240, 10, rl.DarkGray) + + for i := int32(0); i < maxFramesSpeed; i++ { + if i < framesSpeed { + rl.DrawRectangle(250+21*i, 205, 20, 20, rl.Red) + } + rl.DrawRectangleLines(250+21*i, 205, 20, 20, rl.Maroon) + } + + rl.DrawTextureRec(scarfy, frameRec, position, rl.White) // Draw part of the texture + + rl.DrawText("(c) Scarfy sprite by Eiden Marsal", screenWidth-200, screenHeight-20, 10, rl.Gray) + + rl.EndDrawing() + } + + // De-Initialization + rl.UnloadTexture(scarfy) // Texture unloading + rl.CloseWindow() // Close window and OpenGL context +} + +func clamp(value, minValue, maxValue int32) int32 { + return max(minValue, min(value, maxValue)) +} diff --git a/examples/textures/sprite_anim/scarfy.png b/examples/textures/sprite_anim/scarfy.png new file mode 100644 index 0000000000000000000000000000000000000000..be3b83d0e7f523e2cf80da19e274a8479e33fe13 GIT binary patch literal 10394 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 E4?57ykpKVy literal 0 HcmV?d00001 From f1236640f94ffb9051762d89174c31c0c38256d6 Mon Sep 17 00:00:00 2001 From: Per Hultqvist Date: Thu, 17 Oct 2024 12:44:25 +0200 Subject: [PATCH 3/5] New example : Textures/sprite_button --- examples/textures/sprite_button/button.png | Bin 0 -> 23459 bytes examples/textures/sprite_button/buttonfx.wav | Bin 0 -> 88244 bytes examples/textures/sprite_button/main.go | 94 +++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 examples/textures/sprite_button/button.png create mode 100644 examples/textures/sprite_button/buttonfx.wav create mode 100644 examples/textures/sprite_button/main.go diff --git a/examples/textures/sprite_button/button.png b/examples/textures/sprite_button/button.png new file mode 100644 index 0000000000000000000000000000000000000000..99a383b697b4ab5d794f93f6a7c28eb89b791e28 GIT binary patch literal 23459 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 literal 0 HcmV?d00001 diff --git a/examples/textures/sprite_button/buttonfx.wav b/examples/textures/sprite_button/buttonfx.wav new file mode 100644 index 0000000000000000000000000000000000000000..b93b0ca0b5f4dbdac2e7eb0a279ff925b813afbc GIT binary patch literal 88244 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 Date: Thu, 17 Oct 2024 14:58:47 +0200 Subject: [PATCH 4/5] New example : Textures/draw_tiled --- examples/textures/draw_tiled/main.go | 302 ++++++++++++++++++++++ examples/textures/draw_tiled/patterns.png | Bin 0 -> 7387 bytes 2 files changed, 302 insertions(+) create mode 100644 examples/textures/draw_tiled/main.go create mode 100644 examples/textures/draw_tiled/patterns.png diff --git a/examples/textures/draw_tiled/main.go b/examples/textures/draw_tiled/main.go new file mode 100644 index 0000000..9d38c18 --- /dev/null +++ b/examples/textures/draw_tiled/main.go @@ -0,0 +1,302 @@ +/******************************************************************************************* + * + * raylib [textures] example - Draw part of the texture tiled + * + * Example originally created with raylib 3.0, last time updated with raylib 4.2 + * + * Example contributed by Vlad Adrian (@demizdor) 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) 2020-2024 Vlad Adrian (@demizdor) and Ramon Santamaria (@raysan5) + * + ********************************************************************************************/ +package main + +import ( + "fmt" + + rl "github.com/gen2brain/raylib-go/raylib" +) + +const ( + screenWidth = 800 + screenHeight = 450 + optWidth = 220 // Max width for the options container + marginSize = 8 // Size for the margins + colorSize = 16 // Size of the color select buttons +) + +func main() { + rl.SetConfigFlags(rl.FlagWindowResizable) // Make the window resizable + rl.InitWindow(screenWidth, screenHeight, "raylib [textures] example - Draw part of a texture tiled") + + // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) + texPattern := rl.LoadTexture("patterns.png") + rl.SetTextureFilter(texPattern, rl.TextureFilterNearestMipLinear) // Makes the texture smoother when upscaled + + // Coordinates for all patterns inside the texture + recPattern := []rl.Rectangle{ + {3, 3, 66, 66}, + {75, 3, 100, 100}, + {3, 75, 66, 66}, + {7, 156, 50, 50}, + {85, 106, 90, 45}, + {75, 154, 100, 60}, + } + + // Setup colors + colors := []rl.Color{rl.Black, rl.Maroon, rl.Orange, rl.Blue, rl.Purple, + rl.Beige, rl.Lime, rl.Red, rl.DarkGray, rl.SkyBlue} + var maxColors = len(colors) + colorRec := make([]rl.Rectangle, maxColors) + + // Calculate rectangle for each color + var x, y float32 + for i := 0; i < maxColors; i++ { + colorRec[i].X = 2.0 + marginSize + x + colorRec[i].Y = 22.0 + 256.0 + marginSize + y + colorRec[i].Width = colorSize * 2.0 + colorRec[i].Height = colorSize + + if i == (maxColors/2 - 1) { + x = 0 + y += colorSize + marginSize + } else { + x += colorSize*2 + marginSize + } + } + + activePattern := 0 + activeCol := 0 + scale := float32(1.0) + rotation := float32(0.0) + + rl.SetTargetFPS(60) + + // Main game loop + for !rl.WindowShouldClose() { // Detect window close button or ESC key + // Handle mouse + if rl.IsMouseButtonPressed(rl.MouseButtonLeft) { + mouse := rl.GetMousePosition() + + // Check which pattern was clicked and set it as the active pattern + for i := 0; i < len(recPattern); i++ { + r := rl.Rectangle{ + X: 2 + marginSize + recPattern[i].X, + Y: 40 + marginSize + recPattern[i].Y, + Width: recPattern[i].Width, + Height: recPattern[i].Height, + } + if rl.CheckCollisionPointRec(mouse, r) { + activePattern = i + break + } + } + + // Check to see which color was clicked and set it as the active color + for i := 0; i < maxColors; i++ { + if rl.CheckCollisionPointRec(mouse, colorRec[i]) { + activeCol = i + break + } + } + } + + // Handle keys + + // Change scale + if rl.IsKeyPressed(rl.KeyUp) { + scale += 0.25 + } + if rl.IsKeyPressed(rl.KeyDown) { + scale -= 0.25 + } + scale = clamp(scale, 0.25, 10) + + // Change rotation + if rl.IsKeyPressed(rl.KeyLeft) { + rotation -= 25.0 + } + if rl.IsKeyPressed(rl.KeyRight) { + rotation += 25.0 + } + + // Reset + if rl.IsKeyPressed(rl.KeySpace) { + rotation = 0.0 + scale = 1.0 + } + + // Draw + rl.BeginDrawing() + rl.ClearBackground(rl.RayWhite) + + // Draw the tiled area + src := rl.Rectangle{ + X: optWidth + marginSize, + Y: marginSize, + Width: float32(rl.GetScreenWidth()) - optWidth - 2.0*marginSize, + Height: float32(rl.GetScreenHeight()) - 2.0*marginSize, + } + DrawTextureTiled(texPattern, recPattern[activePattern], src, rl.Vector2{}, rotation, scale, colors[activeCol]) + + // Draw options + rl.DrawRectangle(marginSize, marginSize, optWidth-marginSize, int32(rl.GetScreenHeight())-2*marginSize, + rl.ColorAlpha(rl.LightGray, 0.5)) + + rl.DrawText("Select Pattern", 2+marginSize, 30+marginSize, 10, rl.Black) + rl.DrawTexture(texPattern, 2+marginSize, 40+marginSize, rl.Black) + rl.DrawRectangle(int32(2+marginSize+recPattern[activePattern].X), + int32(40+marginSize+recPattern[activePattern].Y), + int32(recPattern[activePattern].Width), + int32(recPattern[activePattern].Height), rl.ColorAlpha(rl.DarkBlue, 0.3)) + + rl.DrawText("Select Color", 2+marginSize, 10+256+marginSize, 10, rl.Black) + for i := 0; i < maxColors; i++ { + rl.DrawRectangleRec(colorRec[i], colors[i]) + if activeCol == i { + rl.DrawRectangleLinesEx(colorRec[i], 3, rl.ColorAlpha(rl.White, 0.5)) + } + } + + rl.DrawText("Scale (UP/DOWN to change)", 2+marginSize, 80+256+marginSize, 10, rl.Black) + rl.DrawText(fmt.Sprintf("%.2fx", scale), 2+marginSize, 92+256+marginSize, 20, rl.Black) + + rl.DrawText("Rotation (LEFT/RIGHT to change)", 2+marginSize, 122+256+marginSize, 10, rl.Black) + rl.DrawText(fmt.Sprintf("%.0f degrees", rotation), 2+marginSize, 134+256+marginSize, 20, rl.Black) + + rl.DrawText("Press [SPACE] to reset", 2+marginSize, 164+256+marginSize, 10, rl.DarkBlue) + + // Draw FPS + rl.DrawText(fmt.Sprintf("%d FPS", rl.GetFPS()), 2+marginSize, 2+marginSize, 20, rl.Black) + rl.EndDrawing() + } + + // De-Initialization + rl.UnloadTexture(texPattern) // Unload texture + + rl.CloseWindow() // Close window and OpenGL context +} + +// DrawTextureTiled draws a part of a texture (defined by a rectangle) with rotation and scale tiled into dest. +func DrawTextureTiled(texture rl.Texture2D, source, dest rl.Rectangle, origin rl.Vector2, rotation, scale float32, + tint rl.Color) { + + if (texture.ID <= 0) || (scale <= 0.0) { // Want see an infinite loop?!...just delete this line! + return + } + if (source.Width == 0) || (source.Height == 0) { + return + } + + tileWidth := source.Width * scale + tileHeight := source.Height * scale + if (dest.Width < tileWidth) && (dest.Height < tileHeight) { + // Can fit only one tile + src := rl.Rectangle{ + X: source.X, + Y: source.Y, + Width: dest.Width / tileWidth * source.Width, + Height: dest.Height / tileHeight * source.Height, + } + dst := rl.Rectangle{X: dest.X, Y: dest.Y, Width: dest.Width, Height: dest.Height} + rl.DrawTexturePro(texture, src, dst, origin, rotation, tint) + } else if dest.Width <= tileWidth { + // Tiled vertically (one column) + var dy float32 + for ; dy+tileHeight < dest.Height; dy += tileHeight { + src := rl.Rectangle{ + X: source.X, + Y: source.Y, + Width: dest.Width / tileWidth * source.Width, + Height: source.Height, + } + dst := rl.Rectangle{X: dest.X, Y: dest.Y + dy, Width: dest.Width, Height: tileHeight} + rl.DrawTexturePro(texture, src, dst, origin, rotation, tint) + } + + // Fit last tile + if dy < dest.Height { + src := rl.Rectangle{X: source.X, Y: source.Y, + Width: (dest.Width / tileWidth) * source.Width, + Height: ((dest.Height - dy) / tileHeight) * source.Height, + } + dst := rl.Rectangle{X: dest.X, Y: dest.Y + dy, Width: dest.Width, Height: dest.Height - dy} + rl.DrawTexturePro(texture, src, dst, origin, rotation, tint) + } + } else if dest.Height <= tileHeight { + // Tiled horizontally (one row) + var dx float32 + for ; dx+tileWidth < dest.Width; dx += tileWidth { + src := rl.Rectangle{ + X: source.X, Y: source.Y, Width: source.Width, + Height: (dest.Height / tileHeight) * source.Height, + } + dst := rl.Rectangle{X: dest.X + dx, Y: dest.Y, Width: tileWidth, Height: dest.Height} + rl.DrawTexturePro(texture, src, dst, origin, rotation, tint) + } + + // Fit last tile + if dx < dest.Width { + src := rl.Rectangle{ + X: source.X, Y: source.Y, Width: ((dest.Width - dx) / tileWidth) * source.Width, + Height: (dest.Height / tileHeight) * source.Height, + } + dst := rl.Rectangle{X: dest.X + dx, Y: dest.Y, Width: dest.Width - dx, Height: dest.Height} + rl.DrawTexturePro(texture, src, + dst, origin, rotation, tint) + } + } else { + // Tiled both horizontally and vertically (rows and columns) + var dx float32 + for ; dx+tileWidth < dest.Width; dx += tileWidth { + var dy float32 + for ; dy+tileHeight < dest.Height; dy += tileHeight { + dst := rl.Rectangle{X: dest.X + dx, Y: dest.Y + dy, Width: tileWidth, Height: tileHeight} + rl.DrawTexturePro(texture, source, dst, origin, rotation, tint) + } + + if dy < dest.Height { + src := rl.Rectangle{ + X: source.X, Y: source.Y, + Width: source.Width, Height: ((dest.Height - dy) / tileHeight) * source.Height, + } + dst := rl.Rectangle{ + X: dest.X + dx, Y: dest.Y + dy, + Width: tileWidth, Height: dest.Height - dy, + } + rl.DrawTexturePro(texture, src, dst, origin, rotation, tint) + } + } + + // Fit last column of tiles + if dx < dest.Width { + var dy float32 + for ; dy+tileHeight < dest.Height; dy += tileHeight { + src := rl.Rectangle{ + X: source.X, Y: source.Y, + Width: ((dest.Width - dx) / tileWidth) * source.Width, Height: source.Height, + } + dst := rl.Rectangle{X: dest.X + dx, Y: dest.Y + dy, Width: dest.Width - dx, Height: tileHeight} + rl.DrawTexturePro(texture, src, dst, origin, rotation, tint) + } + + // Draw final tile in the bottom right corner + if dy < dest.Height { + src := rl.Rectangle{ + X: source.X, Y: source.Y, + Width: ((dest.Width - dx) / tileWidth) * source.Width, + Height: ((dest.Height - dy) / tileHeight) * source.Height, + } + dst := rl.Rectangle{X: dest.X + dx, Y: dest.Y + dy, Width: dest.Width - dx, Height: dest.Height - dy} + rl.DrawTexturePro(texture, src, dst, origin, rotation, tint) + } + } + } +} + +func clamp(value, minValue, maxValue float32) float32 { + return min(maxValue, max(value, minValue)) +} diff --git a/examples/textures/draw_tiled/patterns.png b/examples/textures/draw_tiled/patterns.png new file mode 100644 index 0000000000000000000000000000000000000000..58b3c372c7dbfaf53bca771a9dc32e83d37dbd0d GIT binary patch literal 7387 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 Date: Thu, 17 Oct 2024 16:35:11 +0200 Subject: [PATCH 5/5] Revert "New example : Textures/sprite_anim" This reverts commit cf5c9f8b9ad62a69a1e7a53a518cc033593687d2. --- examples/textures/sprite_anim/main.go | 98 ----------------------- examples/textures/sprite_anim/scarfy.png | Bin 10394 -> 0 bytes 2 files changed, 98 deletions(-) delete mode 100644 examples/textures/sprite_anim/main.go delete mode 100644 examples/textures/sprite_anim/scarfy.png diff --git a/examples/textures/sprite_anim/main.go b/examples/textures/sprite_anim/main.go deleted file mode 100644 index 10e5383..0000000 --- a/examples/textures/sprite_anim/main.go +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************************* -* -* raylib [textures] example - Sprite animation -* -* Example originally created with raylib 1.3, last time updated with raylib 1.3 -* -* 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) 2014-2024 Ramon Santamaria (@raysan5) -* -********************************************************************************************/ -package main - -import ( - "fmt" - - rl "github.com/gen2brain/raylib-go/raylib" -) - -const ( - screenWidth = 800 - screenHeight = 450 - maxFramesSpeed = 15 - minFramesSpeed = 1 -) - -func main() { - rl.InitWindow(screenWidth, screenHeight, "raylib [texture] example - sprite anim") - - // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) - scarfy := rl.LoadTexture("scarfy.png") // Texture loading - - position := rl.Vector2{X: 350.0, Y: 280.0} - frameRec := rl.Rectangle{Width: float32(scarfy.Width / 6), Height: float32(scarfy.Height)} - var currentFrame, framesCounter, framesSpeed int32 = 0, 0, 8 - - rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second - - // Main game loop - for !rl.WindowShouldClose() { // Detect window close button or ESC key - framesCounter++ - - if framesCounter >= (60 / framesSpeed) { - framesCounter = 0 - currentFrame++ - - if currentFrame > 5 { - currentFrame = 0 - } - - frameRec.X = float32(currentFrame*scarfy.Width) / 6 - } - - // Control frames speed - if rl.IsKeyPressed(rl.KeyRight) { - framesSpeed++ - } else if rl.IsKeyPressed(rl.KeyLeft) { - framesSpeed-- - } - - // Make sure that framesSpeed is between minFramesSpeed and maxFramesSpeed - framesSpeed = clamp(framesSpeed, minFramesSpeed, maxFramesSpeed) - - // Draw - rl.BeginDrawing() - rl.ClearBackground(rl.RayWhite) - - rl.DrawTexture(scarfy, 15, 40, rl.White) - rl.DrawRectangleLines(15, 40, scarfy.Width, scarfy.Height, rl.Lime) - rl.DrawRectangleLines(15+int32(frameRec.X), 40+int32(frameRec.Y), int32(frameRec.Width), int32(frameRec.Height), rl.Red) - - rl.DrawText("FRAME SPEED: ", 165, 210, 10, rl.DarkGray) - rl.DrawText(fmt.Sprintf("%02d FPS", framesSpeed), 575, 210, 10, rl.DarkGray) - rl.DrawText("PRESS RIGHT/LEFT KEYS to CHANGE SPEED!", 290, 240, 10, rl.DarkGray) - - for i := int32(0); i < maxFramesSpeed; i++ { - if i < framesSpeed { - rl.DrawRectangle(250+21*i, 205, 20, 20, rl.Red) - } - rl.DrawRectangleLines(250+21*i, 205, 20, 20, rl.Maroon) - } - - rl.DrawTextureRec(scarfy, frameRec, position, rl.White) // Draw part of the texture - - rl.DrawText("(c) Scarfy sprite by Eiden Marsal", screenWidth-200, screenHeight-20, 10, rl.Gray) - - rl.EndDrawing() - } - - // De-Initialization - rl.UnloadTexture(scarfy) // Texture unloading - rl.CloseWindow() // Close window and OpenGL context -} - -func clamp(value, minValue, maxValue int32) int32 { - return max(minValue, min(value, maxValue)) -} diff --git a/examples/textures/sprite_anim/scarfy.png b/examples/textures/sprite_anim/scarfy.png deleted file mode 100644 index be3b83d0e7f523e2cf80da19e274a8479e33fe13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10394 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 E4?57ykpKVy