From c2b8b9ee3a0894dce2e8edd93740e625f8b3519d Mon Sep 17 00:00:00 2001 From: Per Hultqvist Date: Tue, 15 Oct 2024 17:09:11 +0200 Subject: [PATCH] New example : Custom Frame Control --- examples/core/custom_frame_control/main.go | 131 +++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 examples/core/custom_frame_control/main.go diff --git a/examples/core/custom_frame_control/main.go b/examples/core/custom_frame_control/main.go new file mode 100644 index 0000000..7dfc374 --- /dev/null +++ b/examples/core/custom_frame_control/main.go @@ -0,0 +1,131 @@ +package main + +/******************************************************************************************* +* +* raylib [core] example - custom frame control +* +* NOTE: WARNING: This is an example for advanced users willing to have full control over +* the frame processes. By default, EndDrawing() calls the following processes: +* 1. Draw remaining batch data: rlDrawRenderBatchActive() +* 2. SwapScreenBuffer() +* 3. Frame time control: WaitTime() +* 4. PollInputEvents() +* +* To avoid steps 2, 3 and 4, flag SUPPORT_CUSTOM_FRAME_CONTROL can be enabled in +* config.h (it requires recompiling raylib). This way those steps are up to the user. +* +* Note that enabling this flag invalidates some functions: +* - GetFrameTime() +* - SetTargetFPS() +* - GetFPS() +* +* Example originally created with raylib 4.0, last time updated with raylib 4.0 +* +* 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) 2021-2024 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +import ( + "fmt" + + rl "github.com/gen2brain/raylib-go/raylib" +) + +const ( + screenWidth = 800 + screenHeight = 450 +) + +func main() { + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - Custom Frame Control") + + previousTime := rl.GetTime() + currentTime := 0.0 + updateDrawTime := 0.0 + waitTime := 0.0 + deltaTime := 0.0 + + timeCounter := 0.0 + position := 0.0 + pause := false + + targetFPS := 60 + + for !rl.WindowShouldClose() { + rl.PollInputEvents() // Poll input events (SUPPORT_CUSTOM_FRAME_CONTROL) + + if rl.IsKeyPressed(rl.KeySpace) { + pause = !pause + } + if rl.IsKeyPressed(rl.KeyUp) { + targetFPS += 20 + } else if rl.IsKeyPressed(rl.KeyDown) { + targetFPS -= 20 + } + + if targetFPS < 0 { + targetFPS = 0 + } + + if !pause { + position += 200 * deltaTime // We move at 200 pixels per second + if position >= float64(rl.GetScreenWidth()) { + position = 0 + } + timeCounter += deltaTime // We count time (seconds) + } + + rl.BeginDrawing() + rl.ClearBackground(rl.RayWhite) + + for i := 0; i < rl.GetScreenWidth()/200; i++ { + rl.DrawRectangle(200*int32(i), 0, 1, int32(rl.GetScreenHeight()), rl.SkyBlue) + } + + rl.DrawCircle(int32(position), int32(rl.GetScreenHeight()/2-25), 50, rl.Red) + + msg := fmt.Sprintf("%03.0f ms", timeCounter*1000) + rl.DrawText(msg, int32(position-40), int32(rl.GetScreenHeight()/2-100), 20, rl.Maroon) + msg = fmt.Sprintf("PosX: %03.0f", position) + rl.DrawText(msg, int32(position-50), int32(rl.GetScreenHeight()/2+40), 20, rl.Black) + + msg = "Circle is moving at a constant 200 pixels/sec,\nindependently of the frame rate." + rl.DrawText(msg, 10, 10, 20, rl.DarkGray) + msg = "PRESS SPACE to PAUSE MOVEMENT" + rl.DrawText(msg, 10, int32(rl.GetScreenHeight()-60), 20, rl.Gray) + msg = "PRESS UP | DOWN to CHANGE TARGET FPS" + rl.DrawText(msg, 10, int32(rl.GetScreenHeight()-30), 20, rl.Gray) + msg = fmt.Sprintf("TARGET FPS: %d", targetFPS) + rl.DrawText(msg, int32(rl.GetScreenWidth()-220), 10, 20, rl.Lime) + msg = fmt.Sprintf("CURRENT FPS: %d", int(1/deltaTime)) + rl.DrawText(msg, int32(rl.GetScreenWidth()-220), 40, 20, rl.Lime) + + rl.EndDrawing() + + // NOTE: In case raylib is configured to SUPPORT_CUSTOM_FRAME_CONTROL, + // Events polling, screen buffer swap and frame time control must be managed by the user + + rl.SwapScreenBuffer() // We want a fixed frame rate + + currentTime = rl.GetTime() + updateDrawTime = currentTime - previousTime + + if targetFPS > 0 { // We want a fixed frame rate + waitTime = (1 / float64(targetFPS)) - updateDrawTime + if waitTime > 0 { + rl.WaitTime(waitTime) + currentTime = rl.GetTime() + deltaTime = currentTime - previousTime + } + } else { + deltaTime = updateDrawTime + } + + previousTime = currentTime + } + + rl.CloseWindow() +}