From e3ff5f3dc250e8e1ca8acd59a0cd6e1a619cec07 Mon Sep 17 00:00:00 2001 From: Ray Date: Thu, 7 Jul 2022 11:13:45 +0200 Subject: [PATCH] ADDED: example: `textures_fog_of_war` --- examples/textures/textures_fog_of_war.c | 152 +++++++ examples/textures/textures_fog_of_war.png | Bin 0 -> 38477 bytes .../examples/textures_fog_of_war.vcxproj | 387 ++++++++++++++++++ projects/VS2022/raylib.sln | 19 + 4 files changed, 558 insertions(+) create mode 100644 examples/textures/textures_fog_of_war.c create mode 100644 examples/textures/textures_fog_of_war.png create mode 100644 projects/VS2022/examples/textures_fog_of_war.vcxproj diff --git a/examples/textures/textures_fog_of_war.c b/examples/textures/textures_fog_of_war.c new file mode 100644 index 00000000..4cbebbb1 --- /dev/null +++ b/examples/textures/textures_fog_of_war.c @@ -0,0 +1,152 @@ +/******************************************************************************************* +* +* raylib [textures] example - Fog of war +* +* This example has been created using raylib 4.2 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2018-2022 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#include // Required for: calloc(), free() + +#define MAP_TILE_SIZE 32 // Tiles size 32x32 pixels +#define PLAYER_SIZE 16 // Player size +#define PLAYER_TILE_VISIBILITY 2 // Player can see 2 tiles around its position + +// Map data type +typedef struct Map { + unsigned int tilesX; // Number of tiles in X axis + unsigned int tilesY; // Number of tiles in Y axis + unsigned char *tileIds; // Tile ids (tilesX*tilesY), defines type of tile to draw + unsigned char *tileFog; // Tile fog state (tilesX*tilesY), defines if a tile has fog or half-fog +} Map; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [textures] example - fog of war"); + + Map map = { 0 }; + map.tilesX = 25; + map.tilesY = 15; + + // NOTE: We can have up to 256 values for tile ids and for tile fog state, + // probably we don't need that many values for fog state, it can be optimized + // to use only 2 bits per fog state (reducing size by 4) but logic will be a bit more complex + map.tileIds = (unsigned char *)calloc(map.tilesX*map.tilesY, sizeof(unsigned char)); + map.tileFog = (unsigned char *)calloc(map.tilesX*map.tilesY, sizeof(unsigned char)); + + // Load map tiles (generating 2 random tile ids for testing) + // NOTE: Map tile ids should be probably loaded from an external map file + for (int i = 0; i < map.tilesY*map.tilesX; i++) map.tileIds[i] = GetRandomValue(0, 1); + + // Player position on the screen (pixel coordinates, not tile coordinates) + Vector2 playerPosition = { 180, 130 }; + int playerTileX = 0; + int playerTileY = 0; + + // Render texture to render fog of war + // NOTE: To get an automatic smooth-fog effect we use a render texture to render fog + // at a smaller size (one pixel per tile) and scale it on drawing with bilinear filtering + RenderTexture2D fogOfWar = LoadRenderTexture(map.tilesX, map.tilesY); + SetTextureFilter(fogOfWar.texture, TEXTURE_FILTER_BILINEAR); + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // Move player around + if (IsKeyDown(KEY_RIGHT)) playerPosition.x += 5; + if (IsKeyDown(KEY_LEFT)) playerPosition.x -= 5; + if (IsKeyDown(KEY_DOWN)) playerPosition.y += 5; + if (IsKeyDown(KEY_UP)) playerPosition.y -= 5; + + // Check player position to avoid moving outside tilemap limits + if (playerPosition.x < 0) playerPosition.x = 0; + else if ((playerPosition.x + PLAYER_SIZE) > (map.tilesX*MAP_TILE_SIZE)) playerPosition.x = map.tilesX*MAP_TILE_SIZE - PLAYER_SIZE; + if (playerPosition.y < 0) playerPosition.y = 0; + else if ((playerPosition.y + PLAYER_SIZE) > (map.tilesY*MAP_TILE_SIZE)) playerPosition.y = map.tilesY*MAP_TILE_SIZE - PLAYER_SIZE; + + // Previous visited tiles are set to partial fog + for (int i = 0; i < map.tilesX*map.tilesY; i++) if (map.tileFog[i] == 1) map.tileFog[i] = 2; + + // Get current tile position from player pixel position + playerTileX = (int)((playerPosition.x + MAP_TILE_SIZE/2)/MAP_TILE_SIZE); + playerTileY = (int)((playerPosition.y + MAP_TILE_SIZE/2)/MAP_TILE_SIZE); + + // Check visibility and update fog + // NOTE: We check tilemap limits to avoid processing tiles out-of-array-bounds (it could crash program) + for (int y = (playerTileY - PLAYER_TILE_VISIBILITY); y < (playerTileY + PLAYER_TILE_VISIBILITY); y++) + for (int x = (playerTileX - PLAYER_TILE_VISIBILITY); x < (playerTileX + PLAYER_TILE_VISIBILITY); x++) + if ((x >= 0) && (x < map.tilesX) && (y >= 0) && (y < map.tilesY)) map.tileFog[y*map.tilesX + x] = 1; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + // Draw fog of war to a small render texture for automatic smoothing on scaling + BeginTextureMode(fogOfWar); + ClearBackground(BLANK); + for (int y = 0; y < map.tilesY; y++) + for (int x = 0; x < map.tilesX; x++) + if (map.tileFog[y*map.tilesX + x] == 0) DrawRectangle(x, y, 1, 1, BLACK); + else if (map.tileFog[y*map.tilesX + x] == 2) DrawRectangle(x, y, 1, 1, Fade(BLACK, 0.8f)); + EndTextureMode(); + + BeginDrawing(); + + ClearBackground(RAYWHITE); + + for (int y = 0; y < map.tilesY; y++) + { + for (int x = 0; x < map.tilesX; x++) + { + // Draw tiles from id (and tile borders) + DrawRectangle(x*MAP_TILE_SIZE, y*MAP_TILE_SIZE, MAP_TILE_SIZE, MAP_TILE_SIZE, + (map.tileIds[y*map.tilesX + x] == 0)? BLUE : Fade(BLUE, 0.9f)); + DrawRectangleLines(x*MAP_TILE_SIZE, y*MAP_TILE_SIZE, MAP_TILE_SIZE, MAP_TILE_SIZE, Fade(DARKBLUE, 0.5f)); + } + } + + // Draw player + DrawRectangleV(playerPosition, (Vector2){ PLAYER_SIZE, PLAYER_SIZE }, RED); + + + // Draw fog of war (scaled to full map, bilinear filtering) + DrawTexturePro(fogOfWar.texture, (Rectangle){ 0, 0, fogOfWar.texture.width, -fogOfWar.texture.height }, + (Rectangle){ 0, 0, map.tilesX*MAP_TILE_SIZE, map.tilesY*MAP_TILE_SIZE }, + (Vector2){ 0, 0 }, 0.0f, WHITE); + + // Draw player current tile + DrawText(TextFormat("Current tile: [%i,%i]", playerTileX, playerTileY), 10, 10, 20, LIME); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + free(map.tileIds); // Free allocated map tile ids + free(map.tileFog); // Free allocated map tile fog state + + UnloadRenderTexture(fogOfWar); // Unload render texture + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/textures/textures_fog_of_war.png b/examples/textures/textures_fog_of_war.png new file mode 100644 index 0000000000000000000000000000000000000000..6a91316ee53a91cc63262e31e3b1bf615c6220de GIT binary patch literal 38477 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 + + + + Debug.DLL + Win32 + + + Debug.DLL + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release.DLL + Win32 + + + Release.DLL + x64 + + + Release + Win32 + + + Release + x64 + + + + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0} + Win32Proj + textures_fog_of_war + 10.0 + textures_fog_of_war + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)\build\$(ProjectName)\obj\$(Platform)\$(Configuration)\ + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + $(SolutionDir)..\..\examples\textures + WindowsLocalDebugger + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + /FS %(AdditionalOptions) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;PLATFORM_DESKTOP;%(PreprocessorDefinitions) + CompileAsC + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + Copy Debug DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);PLATFORM_DESKTOP + $(SolutionDir)..\..\src;%(AdditionalIncludeDirectories) + CompileAsC + true + + + Console + true + true + true + raylib.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winmm.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\ + + + xcopy /y /d "$(SolutionDir)\build\raylib\bin\$(Platform)\$(Configuration)\raylib.dll" "$(SolutionDir)\build\$(ProjectName)\bin\$(Platform)\$(Configuration)" + + + Copy Release DLL to output directory + + + + + + + + {e89d61ac-55de-4482-afd4-df7242ebc859} + + + + + + \ No newline at end of file diff --git a/projects/VS2022/raylib.sln b/projects/VS2022/raylib.sln index 66830ce1..ff6681f2 100644 --- a/projects/VS2022/raylib.sln +++ b/projects/VS2022/raylib.sln @@ -249,6 +249,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text_codepoints_loading", " EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core_window_should_close", "examples\core_window_should_close.vcxproj", "{3FE7E9B6-49AC-4246-A789-28DB4644567B}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "textures_fog_of_war", "examples\textures_fog_of_war.vcxproj", "{EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug.DLL|x64 = Debug.DLL|x64 @@ -2081,6 +2083,22 @@ Global {3FE7E9B6-49AC-4246-A789-28DB4644567B}.Release|x64.Build.0 = Release|x64 {3FE7E9B6-49AC-4246-A789-28DB4644567B}.Release|x86.ActiveCfg = Release|Win32 {3FE7E9B6-49AC-4246-A789-28DB4644567B}.Release|x86.Build.0 = Release|Win32 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Debug.DLL|x64.ActiveCfg = Debug.DLL|x64 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Debug.DLL|x64.Build.0 = Debug.DLL|x64 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Debug.DLL|x86.ActiveCfg = Debug.DLL|Win32 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Debug.DLL|x86.Build.0 = Debug.DLL|Win32 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Debug|x64.ActiveCfg = Debug|x64 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Debug|x64.Build.0 = Debug|x64 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Debug|x86.ActiveCfg = Debug|Win32 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Debug|x86.Build.0 = Debug|Win32 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Release.DLL|x64.ActiveCfg = Release.DLL|x64 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Release.DLL|x64.Build.0 = Release.DLL|x64 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Release.DLL|x86.ActiveCfg = Release.DLL|Win32 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Release.DLL|x86.Build.0 = Release.DLL|Win32 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Release|x64.ActiveCfg = Release|x64 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Release|x64.Build.0 = Release|x64 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Release|x86.ActiveCfg = Release|Win32 + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2207,6 +2225,7 @@ Global {F5FC9279-DE63-4EF3-B31F-CFCEF9B11F71} = {AF5BEC5C-1F2B-4DA8-B12D-D09FE569237C} {F2DB2E59-76BF-4D81-859A-AFC289C046C0} = {8D3C83B7-F1E0-4C2E-9E34-EE5F6AB2502A} {3FE7E9B6-49AC-4246-A789-28DB4644567B} = {6C82BAAE-BDDF-457D-8FA8-7E2490B07035} + {EBBBF4A0-2DA2-4DE6-B4FE-C6654A2417A0} = {DA049009-21FF-4AC0-84E4-830DD1BCD0CE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E926C768-6307-4423-A1EC-57E95B1FAB29}