|
|
- /*******************************************************************************************
- *
- * raylib [core] example - Smooth Pixel-perfect camera
- *
- * Example originally created with raylib 3.7, last time updated with raylib 4.0
- *
- * Example contributed by Giancamillo Alessandroni (@NotManyIdeasDev) and
- * reviewed by Ramon Santamaria (@raysan5)
- *
- * 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 Giancamillo Alessandroni (@NotManyIdeasDev) and Ramon Santamaria (@raysan5)
- *
- ********************************************************************************************/
-
- #include "raylib.h"
-
- #include <math.h> // Required for: sinf(), cosf()
-
- //------------------------------------------------------------------------------------
- // Program main entry point
- //------------------------------------------------------------------------------------
- int main(void)
- {
- // Initialization
- //--------------------------------------------------------------------------------------
- const int screenWidth = 800;
- const int screenHeight = 450;
-
- const int virtualScreenWidth = 160;
- const int virtualScreenHeight = 90;
-
- const float virtualRatio = (float)screenWidth/(float)virtualScreenWidth;
-
- 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 target = LoadRenderTexture(virtualScreenWidth, virtualScreenHeight); // This is where we'll draw all our objects.
-
- Rectangle rec01 = { 70.0f, 35.0f, 20.0f, 20.0f };
- Rectangle rec02 = { 90.0f, 55.0f, 30.0f, 10.0f };
- Rectangle rec03 = { 80.0f, 65.0f, 15.0f, 25.0f };
-
- // The target's height is flipped (in the source Rectangle), due to OpenGL reasons
- Rectangle sourceRec = { 0.0f, 0.0f, (float)target.texture.width, -(float)target.texture.height };
- Rectangle destRec = { -virtualRatio, -virtualRatio, screenWidth + (virtualRatio*2), screenHeight + (virtualRatio*2) };
-
- Vector2 origin = { 0.0f, 0.0f };
-
- float rotation = 0.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 += 60.0f*GetFrameTime(); // Rotate the rectangles, 60 degrees per second
-
- // Make the camera move to demonstrate the effect
- cameraX = (sinf((float)GetTime())*50.0f) - 10.0f;
- cameraY = cosf((float)GetTime())*30.0f;
-
- // Set the camera's target to the values computed above
- screenSpaceCamera.target = (Vector2){ cameraX, cameraY };
-
- // Round worldSpace coordinates, keep decimals into screenSpace coordinates
- worldSpaceCamera.target.x = truncf(screenSpaceCamera.target.x);
- screenSpaceCamera.target.x -= worldSpaceCamera.target.x;
- screenSpaceCamera.target.x *= virtualRatio;
-
- worldSpaceCamera.target.y = truncf(screenSpaceCamera.target.y);
- screenSpaceCamera.target.y -= worldSpaceCamera.target.y;
- screenSpaceCamera.target.y *= virtualRatio;
- //----------------------------------------------------------------------------------
-
- // Draw
- //----------------------------------------------------------------------------------
- BeginTextureMode(target);
- ClearBackground(RAYWHITE);
-
- BeginMode2D(worldSpaceCamera);
- DrawRectanglePro(rec01, origin, rotation, BLACK);
- DrawRectanglePro(rec02, origin, -rotation, RED);
- DrawRectanglePro(rec03, origin, rotation + 45.0f, BLUE);
- EndMode2D();
- EndTextureMode();
-
- BeginDrawing();
- ClearBackground(RED);
-
- BeginMode2D(screenSpaceCamera);
- DrawTexturePro(target.texture, sourceRec, destRec, origin, 0.0f, WHITE);
- EndMode2D();
-
- DrawText(TextFormat("Screen resolution: %ix%i", screenWidth, screenHeight), 10, 10, 20, DARKBLUE);
- DrawText(TextFormat("World resolution: %ix%i", virtualScreenWidth, virtualScreenHeight), 10, 40, 20, DARKGREEN);
- DrawFPS(GetScreenWidth() - 95, 10);
- EndDrawing();
- //----------------------------------------------------------------------------------
- }
-
- // De-Initialization
- //--------------------------------------------------------------------------------------
- UnloadRenderTexture(target); // Unload render texture
-
- CloseWindow(); // Close window and OpenGL context
- //--------------------------------------------------------------------------------------
-
- return 0;
- }
|