From d7bd66f339a84865c2f9a38f18041cd12342c23b Mon Sep 17 00:00:00 2001 From: Per Hultqvist Date: Wed, 16 Oct 2024 15:41:18 +0200 Subject: [PATCH] New example : Window flags --- examples/core/window_flags/main.go | 260 +++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 examples/core/window_flags/main.go diff --git a/examples/core/window_flags/main.go b/examples/core/window_flags/main.go new file mode 100644 index 0000000..6e26ebe --- /dev/null +++ b/examples/core/window_flags/main.go @@ -0,0 +1,260 @@ +/******************************************************************************************* +* +* raylib [core] example - window flags +* +* Example originally created with raylib 3.5, last time updated with raylib 3.5 +* +* 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 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +package main + +import ( + "fmt" + + rl "github.com/gen2brain/raylib-go/raylib" +) + +const ( + screenWidth = 800 + screenHeight = 450 +) + +// Possible window flags +/* + FLAG_VSYNC_HINT + FLAG_FULLSCREEN_MODE -> not working properly -> wrong scaling! + FLAG_WINDOW_RESIZABLE + FLAG_WINDOW_UNDECORATED + FLAG_WINDOW_TRANSPARENT + FLAG_WINDOW_HIDDEN + FLAG_WINDOW_MINIMIZED -> Not supported on window creation + FLAG_WINDOW_MAXIMIZED -> Not supported on window creation + FLAG_WINDOW_UNFOCUSED + FLAG_WINDOW_TOPMOST + FLAG_WINDOW_HIGHDPI -> errors after minimize-resize, fb size is recalculated + FLAG_WINDOW_ALWAYS_RUN + FLAG_MSAA_4X_HINT +*/ + +func main() { + // Set configuration flags for window creation + //SetConfigFlags(FLAG_VSYNC_HINT | FLAG_MSAA_4X_HINT | FLAG_WINDOW_HIGHDPI); + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - Window Flags") + + ballPosition := rl.Vector2{X: float32(rl.GetScreenWidth()) / 2.0, Y: float32(rl.GetScreenHeight()) / 2.0} + ballSpeed := rl.Vector2{X: 5.0, Y: 4.0} + ballRadius := float32(20.0) + framesCounter := 0 + + rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second + + for !rl.WindowShouldClose() { // Detect window close button or ESC key + if rl.IsKeyPressed(rl.KeyF) { + rl.ToggleFullscreen() // modifies window size when scaling! + } + + if rl.IsKeyPressed(rl.KeyR) { + if rl.IsWindowState(rl.FlagWindowResizable) { + rl.ClearWindowState(rl.FlagWindowResizable) + } else { + rl.SetWindowState(rl.FlagWindowResizable) + } + } + + if rl.IsKeyPressed(rl.KeyD) { + if rl.IsWindowState(rl.FlagWindowUndecorated) { + rl.ClearWindowState(rl.FlagWindowUndecorated) + } else { + rl.SetWindowState(rl.FlagWindowUndecorated) + } + } + + if rl.IsKeyPressed(rl.KeyH) { + if !rl.IsWindowState(rl.FlagWindowHidden) { + rl.SetWindowState(rl.FlagWindowHidden) + } + + framesCounter = 0 + } + + if rl.IsWindowState(rl.FlagWindowHidden) { + framesCounter++ + if framesCounter >= 240 { + rl.ClearWindowState(rl.FlagWindowHidden) // Show window after 3 seconds + } + } + + if rl.IsKeyPressed(rl.KeyN) { + if !rl.IsWindowState(rl.FlagWindowMinimized) { + rl.MinimizeWindow() + } + + framesCounter = 0 + } + + if rl.IsWindowState(rl.FlagWindowMinimized) { + framesCounter++ + if framesCounter >= 240 { + rl.RestoreWindow() // Restore window after 3 seconds + } + } + + if rl.IsKeyPressed(rl.KeyM) { + // NOTE: Requires FLAG_WINDOW_RESIZABLE enabled! + if rl.IsWindowState(rl.FlagWindowMaximized) { + rl.RestoreWindow() + } else { + rl.MaximizeWindow() + } + } + + if rl.IsKeyPressed(rl.KeyU) { + if rl.IsWindowState(rl.FlagWindowUnfocused) { + rl.ClearWindowState(rl.FlagWindowUnfocused) + } else { + rl.SetWindowState(rl.FlagWindowUnfocused) + } + } + + if rl.IsKeyPressed(rl.KeyT) { + if rl.IsWindowState(rl.FlagWindowTopmost) { + rl.ClearWindowState(rl.FlagWindowTopmost) + } else { + rl.SetWindowState(rl.FlagWindowTopmost) + } + } + + if rl.IsKeyPressed(rl.KeyA) { + if rl.IsWindowState(rl.FlagWindowAlwaysRun) { + rl.ClearWindowState(rl.FlagWindowAlwaysRun) + } else { + rl.SetWindowState(rl.FlagWindowAlwaysRun) + } + } + + if rl.IsKeyPressed(rl.KeyV) { + if rl.IsWindowState(rl.FlagVsyncHint) { + rl.ClearWindowState(rl.FlagVsyncHint) + } else { + rl.SetWindowState(rl.FlagVsyncHint) + } + } + + // Bouncing ball logic + ballPosition.X += ballSpeed.X + ballPosition.Y += ballSpeed.Y + if (ballPosition.X >= (float32(rl.GetScreenWidth()) - ballRadius)) || (ballPosition.X <= ballRadius) { + ballSpeed.X *= -1.0 + } + if (ballPosition.Y >= (float32(rl.GetScreenHeight()) - ballRadius)) || (ballPosition.Y <= ballRadius) { + ballSpeed.Y *= -1.0 + } + + rl.BeginDrawing() + if rl.IsWindowState(rl.FlagWindowTransparent) { + rl.ClearBackground(rl.Blank) + } else { + rl.ClearBackground(rl.White) + } + + rl.DrawCircleV(ballPosition, ballRadius, rl.Maroon) + rl.DrawRectangleLinesEx( + rl.Rectangle{ + Width: float32(rl.GetScreenWidth()), + Height: float32(rl.GetScreenHeight()), + }, + 4, rl.White, + ) + + rl.DrawCircleV(rl.GetMousePosition(), 10, rl.DarkBlue) + + rl.DrawFPS(10, 10) + + rl.DrawText( + fmt.Sprintf("Screen Size: [%d, %d]", rl.GetScreenWidth(), rl.GetScreenHeight()), + 10, + 40, + 10, + rl.Green, + ) + + // Draw window state info + rl.DrawText("Following flags can be set after window creation:", 10, 60, 10, rl.Gray) + if rl.IsWindowState(rl.FlagFullscreenMode) { + rl.DrawText("[F] FLAG_FULLSCREEN_MODE: on", 10, 80, 10, rl.Lime) + } else { + rl.DrawText("[F] FLAG_FULLSCREEN_MODE: off", 10, 80, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowResizable) { + rl.DrawText("[R] FLAG_WINDOW_RESIZABLE: on", 10, 100, 10, rl.Lime) + } else { + rl.DrawText("[R] FLAG_WINDOW_RESIZABLE: off", 10, 100, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowUndecorated) { + rl.DrawText("[D] FLAG_WINDOW_UNDECORATED: on", 10, 120, 10, rl.Lime) + } else { + rl.DrawText("[D] FLAG_WINDOW_UNDECORATED: off", 10, 120, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowHidden) { + rl.DrawText("[H] FLAG_WINDOW_HIDDEN: on", 10, 140, 10, rl.Lime) + } else { + rl.DrawText("[H] FLAG_WINDOW_HIDDEN: off", 10, 140, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowMinimized) { + rl.DrawText("[N] FLAG_WINDOW_MINIMIZED: on", 10, 160, 10, rl.Lime) + } else { + rl.DrawText("[N] FLAG_WINDOW_MINIMIZED: off", 10, 160, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowMaximized) { + rl.DrawText("[M] FLAG_WINDOW_MAXIMIZED: on", 10, 180, 10, rl.Lime) + } else { + rl.DrawText("[M] FLAG_WINDOW_MAXIMIZED: off", 10, 180, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowUnfocused) { + rl.DrawText("[G] FLAG_WINDOW_UNFOCUSED: on", 10, 200, 10, rl.Lime) + } else { + rl.DrawText("[U] FLAG_WINDOW_UNFOCUSED: off", 10, 200, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowTopmost) { + rl.DrawText("[T] FLAG_WINDOW_TOPMOST: on", 10, 220, 10, rl.Lime) + } else { + rl.DrawText("[T] FLAG_WINDOW_TOPMOST: off", 10, 220, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowAlwaysRun) { + rl.DrawText("[A] FLAG_WINDOW_ALWAYS_RUN: on", 10, 240, 10, rl.Lime) + } else { + rl.DrawText("[A] FLAG_WINDOW_ALWAYS_RUN: off", 10, 240, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagVsyncHint) { + rl.DrawText("[V] FLAG_VSYNC_HINT: on", 10, 260, 10, + rl.Lime) + } else { + rl.DrawText("[V] FLAG_VSYNC_HINT: off", 10, 260, 10, rl.Maroon) + } + + rl.DrawText("Following flags can only be set before window creation:", 10, 300, 10, rl.Gray) + if rl.IsWindowState(rl.FlagWindowHighdpi) { + rl.DrawText("FLAG_WINDOW_HIGHDPI: on", 10, 320, 10, rl.Lime) + } else { + rl.DrawText("FLAG_WINDOW_HIGHDPI: off", 10, 320, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagWindowTransparent) { + rl.DrawText("FLAG_WINDOW_TRANSPARENT: on", 10, 340, 10, rl.Lime) + } else { + rl.DrawText("FLAG_WINDOW_TRANSPARENT: off", 10, 340, 10, rl.Maroon) + } + if rl.IsWindowState(rl.FlagMsaa4xHint) { + rl.DrawText("FLAG_MSAA_4X_HINT: on", 10, 360, 10, rl.Lime) + } else { + rl.DrawText("FLAG_MSAA_4X_HINT: off", 10, 360, 10, rl.Maroon) + } + + rl.EndDrawing() + } + rl.CloseWindow() +}