From 4ab28fffb42bc3104bca48166ea4d7712450852d Mon Sep 17 00:00:00 2001 From: Gianni Alessandroni <45824238+NotManyIdeasDev@users.noreply.github.com> Date: Mon, 10 May 2021 20:16:12 +0200 Subject: Added smooth pixel-perfect camera example + Small typo fix in examples_template.c (#1760) * Typo fix Changed "bsasic" to "basic" in the comments. * Added pixel-perfect camera example Added pixel-perfect camera example, both the .c file and the cover .png image. The example works with any resolution you want, as long as the ratio stays the same (ex. 16:9, 4:3) ecc. * Fixed Typecasts Fixed compiler errors (implicit conversions) * Precomputed rectangles, time-based movement and whitespace fix Moved the source and destination rectangles for the renderTexture into their own variables, modified the animation to be time-based instead of frame-based, fixed the bug with whitespaces. * Fixed spacing and added more consistency with sinf() and cosf() * Fixed *= operator spacing --- examples/core/core_2d_camera_smooth_pixelperfect.c | 136 +++++++++++++++++++++ .../core/core_2d_camera_smooth_pixelperfect.png | Bin 0 -> 6365 bytes 2 files changed, 136 insertions(+) create mode 100644 examples/core/core_2d_camera_smooth_pixelperfect.c create mode 100644 examples/core/core_2d_camera_smooth_pixelperfect.png (limited to 'examples/core') diff --git a/examples/core/core_2d_camera_smooth_pixelperfect.c b/examples/core/core_2d_camera_smooth_pixelperfect.c new file mode 100644 index 00000000..3594c4ab --- /dev/null +++ b/examples/core/core_2d_camera_smooth_pixelperfect.c @@ -0,0 +1,136 @@ +/******************************************************************************************* +* +* raylib [core] example - smooth pixel-perfect camera +* +* This example has been created using raylib 3.7 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Example contributed by Giancamillo Alessandroni ([discord]NotManyIdeas#9972 - [github]NotManyIdeasDev) and +* reviewed by Ramon Santamaria (@raysan5) +* +* Copyright (c) 2021 Giancamillo Alessandroni (NotManyIdeas#9972) and Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" +#include + +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + const int virualScreenWidth = 160; + const int virtualScreenHeight = 90; + + const float virtualRatio = (float)screenWidth/(float)virualScreenWidth; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - smooth pixel-perfect camera"); + + Camera2D worldSpaceCamera = { 0 }; // Game world camera + worldSpaceCamera.zoom = 1.0f; + + Camera2D screenSpaceCamera = { 0 }; //Smoothing camera + screenSpaceCamera.zoom = 1.0f; + + RenderTexture2D renderTexture = LoadRenderTexture(virualScreenWidth, virtualScreenHeight); //This is where we'll draw all our objects. + + Rectangle firstRectangle = { 70.0f, 35.0f, 20.0f, 20.0f }; + Rectangle secondRectangle = { 90.0f, 55.0f, 30.0f, 10.0f }; + Rectangle thirdRectangle = { 80.0f, 65.0f, 15.0f, 25.0f }; + + //The renderTexture's height is flipped (in the source Rectangle), due to OpenGL reasons. + Rectangle renderTextureSource = { 0.0f, 0.0f, (float)renderTexture.texture.width, (float)-renderTexture.texture.height }; + Rectangle renderTextureDest = { -virtualRatio, -virtualRatio, screenWidth + (virtualRatio*2), screenHeight + (virtualRatio*2) }; + + Vector2 origin = { 0.0f, 0.0f }; + + float rotation = 0.0f; + float degreesPerSecond = 60.0f; + + float cameraX = 0.0f; + float cameraY = 0.0f; + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + rotation += degreesPerSecond*GetFrameTime(); // Rotate the rectangles. + + // Make the camera move to demonstrate the effect. + cameraX = (sinf(GetTime())*50.0f) - 10.0f; + cameraY = cosf(GetTime())*30.0f; + + // Set the camera's target to the values computed above. + screenSpaceCamera.target = (Vector2){ cameraX, cameraY }; + + // Round worldCamera's X, keep the decimals on screenSpaceCamera. + if (screenSpaceCamera.target.x >= 1 || screenSpaceCamera.target.x <= -1) + { + worldSpaceCamera.target.x = (int)screenSpaceCamera.target.x; + screenSpaceCamera.target.x -= worldSpaceCamera.target.x; + screenSpaceCamera.target.x *= virtualRatio; + } + + // Round worldCamera's Y, keep the decimals on screenSpaceCamera. + if (screenSpaceCamera.target.y >= 1 || screenSpaceCamera.target.y <= -1) + { + worldSpaceCamera.target.y = (int)screenSpaceCamera.target.y; + screenSpaceCamera.target.y -= worldSpaceCamera.target.y; + screenSpaceCamera.target.y *= virtualRatio; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + ClearBackground(RED); // This is for debug purposes. If you see red, then you've probably done something wrong. + + BeginTextureMode(renderTexture); + BeginMode2D(worldSpaceCamera); + ClearBackground(RAYWHITE); // This is the color you should see as background color. + + // Draw the rectangles + DrawRectanglePro(firstRectangle, origin, rotation, BLACK); + DrawRectanglePro(secondRectangle, origin, -rotation, RED); + DrawRectanglePro(thirdRectangle, origin, rotation + 45.0f, BLUE); + + EndMode2D(); + EndTextureMode(); + + BeginMode2D(screenSpaceCamera); + + // Draw the render texture with an offset of 1 worldSpace unit/pixel, so that the content behind the renderTexture is not shown. + DrawTexturePro( + renderTexture.texture, + renderTextureSource, + renderTextureDest, + origin, + 0.0f, + WHITE + ); + + EndMode2D(); + + //Debug info + DrawText("Screen resolution: 800x450", 5, 0, 20, DARKBLUE); + DrawText("World resolution: 160x90", 5, 20, 20, DARKGREEN); + DrawFPS(screenWidth - 75, 0); + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadRenderTexture(renderTexture); // RenderTexture unloading + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/core/core_2d_camera_smooth_pixelperfect.png b/examples/core/core_2d_camera_smooth_pixelperfect.png new file mode 100644 index 00000000..aeac7944 Binary files /dev/null and b/examples/core/core_2d_camera_smooth_pixelperfect.png differ -- cgit v1.2.3