summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRay <[email protected]>2021-06-22 21:20:14 +0200
committerRay <[email protected]>2021-06-22 21:20:14 +0200
commit6f60622619ed3b2606cc186d9d87cfe15e665e75 (patch)
treeec3792003dff00c75f2a66e688dae1070008b37c
parent429c5a9a9add32b470115e8cd9e38aa811546e69 (diff)
downloadraylib-6f60622619ed3b2606cc186d9d87cfe15e665e75.tar.gz
raylib-6f60622619ed3b2606cc186d9d87cfe15e665e75.zip
ADDED: Example: core_custom_frame_control
-rw-r--r--examples/core/core_custom_frame_control.c126
-rw-r--r--examples/core/core_custom_frame_control.pngbin0 -> 16952 bytes
2 files changed, 126 insertions, 0 deletions
diff --git a/examples/core/core_custom_frame_control.c b/examples/core/core_custom_frame_control.c
new file mode 100644
index 00000000..c1290abf
--- /dev/null
+++ b/examples/core/core_custom_frame_control.c
@@ -0,0 +1,126 @@
+/*******************************************************************************************
+*
+* raylib [core] example - custom frame control
+*
+* WARNING: This is an example for advance 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()
+*
+* This example has been created using raylib 3.8 (www.raylib.com)
+* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
+*
+* Copyright (c) 2021 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - custom frame control");
+
+ // Custom timming variables
+ double previousTime = GetTime(); // Previous time measure
+ double currentTime = 0.0; // Current time measure
+ double updateDrawTime = 0.0; // Update + Draw time
+ double waitTime = 0.0; // Wait time (if target fps required)
+ float deltaTime = 0.0f; // Frame time (Update + Draw + Wait time)
+
+ float timeCounter = 0.0f; // Accumulative time counter (seconds)
+ float position = 0.0f; // Circle position
+ bool pause = false; // Pause control flag
+
+ int targetFPS = 60; // Our initial target fps
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ PollInputEvents(); // Poll input events (SUPPORT_CUSTOM_FRAME_CONTROL)
+
+ if (IsKeyPressed(KEY_SPACE)) pause = !pause;
+
+ if (IsKeyPressed(KEY_UP)) targetFPS += 20;
+ else if (IsKeyPressed(KEY_DOWN)) targetFPS -= 20;
+
+ if (targetFPS < 0) targetFPS = 0;
+
+ if (!pause)
+ {
+ position += 200*deltaTime; // We move at 200 pixels per second
+
+ if (position >= GetScreenWidth()) position = 0;
+
+ timeCounter += deltaTime; // We count time (seconds)
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ for (int i = 0; i < GetScreenWidth()/200; i++) DrawRectangle(200*i, 0, 1, GetScreenHeight(), SKYBLUE);
+
+ DrawCircle((int)position, GetScreenHeight()/2 - 25, 50, RED);
+
+ DrawText(FormatText("%03.0f ms", timeCounter*1000.0f), position - 40, GetScreenHeight()/2 - 100, 20, MAROON);
+ DrawText(FormatText("PosX: %03.0f", position), position - 50, GetScreenHeight()/2 + 40, 20, BLACK);
+
+ DrawText("Circle is moving at a constant 200 pixels/sec,\nindependently of the frame rate.", 10, 10, 20, DARKGRAY);
+ DrawText("PRESS SPACE to PAUSE MOVEMENT", 10, GetScreenHeight() - 30, 20, GRAY);
+ DrawText(FormatText("TARGET FPS: %i", targetFPS), GetScreenWidth() - 220, 10, 20, LIME);
+ DrawText(FormatText("CURRENT FPS: %i", (int)(1.0f/deltaTime)), GetScreenWidth() - 220, 40, 20, GREEN);
+
+ 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
+
+ SwapScreenBuffer(); // Flip the back buffer to screen (front buffer)
+
+ currentTime = GetTime();
+ updateDrawTime = currentTime - previousTime;
+
+ if (targetFPS > 0) // We want a fixed frame rate
+ {
+ waitTime = (1.0f/(float)targetFPS) - updateDrawTime;
+ if (waitTime > 0.0)
+ {
+ WaitTime((float)waitTime*1000.0f);
+ currentTime = GetTime();
+ deltaTime = (float)(currentTime - previousTime);
+ }
+ }
+ else deltaTime = updateDrawTime; // Framerate could be variable
+
+ previousTime = currentTime;
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/examples/core/core_custom_frame_control.png b/examples/core/core_custom_frame_control.png
new file mode 100644
index 00000000..7d615efe
--- /dev/null
+++ b/examples/core/core_custom_frame_control.png
Binary files differ