New example : Custom Frame Control
This commit is contained in:
parent
10a7b71ee0
commit
c2b8b9ee3a
1 changed files with 131 additions and 0 deletions
131
examples/core/custom_frame_control/main.go
Normal file
131
examples/core/custom_frame_control/main.go
Normal file
|
@ -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()
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue