diff --git a/.cache/clangd/index/mapEditor.cpp.D1B6F4A71599CCB9.idx b/.cache/clangd/index/mapEditor.cpp.D1B6F4A71599CCB9.idx index 6190a39..c19862e 100644 Binary files a/.cache/clangd/index/mapEditor.cpp.D1B6F4A71599CCB9.idx and b/.cache/clangd/index/mapEditor.cpp.D1B6F4A71599CCB9.idx differ diff --git a/imgui.ini b/imgui.ini index 2e24dc3..adc23d5 100644 --- a/imgui.ini +++ b/imgui.ini @@ -4,17 +4,17 @@ Size=400,400 Collapsed=0 [Window][Phoenix Map Editor] -Pos=60,60 +Pos=1582,392 Size=521,94 Collapsed=0 [Window][Map Information Editor] -Pos=504,255 +Pos=1433,675 Size=549,264 Collapsed=0 [Window][Map Editor Tools] -Pos=405,187 -Size=276,197 +Pos=995,701 +Size=326,231 Collapsed=0 diff --git a/include/config.hpp b/include/config.hpp index 5ecffdd..a285630 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -1,8 +1,8 @@ #pragma once // GFX constants -#define SCREEN_WIDTH 1000 -#define SCREEN_HEIGHT 1000 +//#define SCREEN_WIDTH 1000 +//#define SCREEN_HEIGHT 1000 // 32x32 textures #define TEXTURE_WIDTH 32 diff --git a/include/map.hpp b/include/map.hpp index 815f5d0..1a195e6 100644 --- a/include/map.hpp +++ b/include/map.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include @@ -27,3 +28,5 @@ Map PLoadMapFromFile(std::string filepath); Map PCreateNewMap(std::string filepath); void PSaveMapToFile(Map *map, std::string filepath); void PRenderMap(Map *map, bool debug = false); +void PRenderMapBackground(Map *map); +SDL_Rect PGetMapRect(Map *map); diff --git a/include/state.hpp b/include/state.hpp index c032483..d363dd3 100644 --- a/include/state.hpp +++ b/include/state.hpp @@ -15,6 +15,9 @@ struct GlobalState { std::vector collisions; PhoenixAssets assets; int scale = 20; + + int screenWidth = 1000; + int screenHeight = 1000; }; extern GlobalState state; diff --git a/maps/example.map b/maps/example.map new file mode 100644 index 0000000..5479866 --- /dev/null +++ b/maps/example.map @@ -0,0 +1,248 @@ +MAPNAME ph_exampleMap +MAPVERS b1 +MAPAUTH John +MAPSIZE 20x20 +MAPSCAL 1x1 +MAPSPWN 484,274 +MAP +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE FLOOR +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +TILE WALL +ENDMAP diff --git a/maps/ph_example.map b/maps/ph_example.map index 0198534..ac3fd84 100644 --- a/maps/ph_example.map +++ b/maps/ph_example.map @@ -1,9 +1,9 @@ MAPNAME ph_exampleMap MAPVERS b1 -MAPAUTH JohnDoe -MAPSIZE 20x20 -MAPSCAL 6x6 -MAPSPWN 499,666 +MAPAUTH Interfiber +MAPSIZE 20x40 +MAPSCAL 5x5 +MAPSPWN 297,619 MAP TILE WALL TILE WALL diff --git a/src/collision.cpp b/src/collision.cpp index 8ea125a..3536c4b 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -2,6 +2,7 @@ #include "config.hpp" #include "player.hpp" #include "state.hpp" +#include void PBuildCollisionFromMap(Map *map) { SDL_Log("Building collision data from map"); @@ -44,6 +45,7 @@ bool PCanMoveTo(int x, int y) { SDL_Rect playerRect = PGetPlayerRect(&state.player); playerRect.x = x; playerRect.y = y; + for (PCollisionRect rect : state.collisions) { if (SDL_HasIntersection(&playerRect, &rect.rect)) { return false; diff --git a/src/map.cpp b/src/map.cpp index f8a3c84..ddcf652 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -95,7 +95,6 @@ void PRenderMap(Map *map, bool debug) { row++; i = 0; } - int x = i * TEXTURE_WIDTH; int y = row * TEXTURE_HEIGHT; @@ -175,3 +174,40 @@ Map PCreateNewMap(std::string filepath) { return map; } + +SDL_Rect PGetMapRect(Map *map) { + SDL_Rect mapRect{}; + mapRect.x = 0; + mapRect.y = 0; + mapRect.w = map->mapWidth; + mapRect.h = map->mapHeight; + + return mapRect; +} + +void PRenderMapBackground(Map *map) { + PhoenixTexture *wallTexture = PGetTextureById(BRICK_WALL_TEXTURE_ID); + + for (int x = 0; x < state.screenWidth; x += 32) { + for (int y = 0; y < state.screenHeight; y += 32) { + PRenderTexture(wallTexture, x, y); + } + } + + for (int x = 0; x < state.screenWidth; x += 32) { + for (int y = 0; y < state.screenHeight; y += 32) { + } + } + + for (int y = 0; y < state.screenHeight; y += 32) { + for (int x = 0; x < state.screenWidth; x += 32) { + PRenderTexture(wallTexture, -x, y); + } + } + + for (int y = 0; y < state.screenHeight; y += 32) { + for (int x = -state.screenWidth; x < state.screenWidth; x += 32) { + PRenderTexture(wallTexture, x, -y); + } + } +} diff --git a/src/phoenix.cpp b/src/phoenix.cpp index 2633bb3..6102ad4 100644 --- a/src/phoenix.cpp +++ b/src/phoenix.cpp @@ -1,5 +1,6 @@ #include "assets.hpp" #include "collision.hpp" +#include "map.hpp" #include "texture.hpp" #include #include @@ -28,10 +29,11 @@ PhoenixGame::PhoenixGame() { IMG_Init(IMG_INIT_PNG); state.window = SDL_CreateWindow("Phoenix", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, 1000, 1000, 0); + SDL_WINDOWPOS_CENTERED, 1000, 1000, + SDL_WINDOW_RESIZABLE); state.renderer = SDL_CreateRenderer( - state.window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_SOFTWARE); + state.window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); // Load textures PRunBoostrap(); @@ -41,8 +43,8 @@ PhoenixGame::PhoenixGame() { state.camera.x = 0; state.camera.y = 0; - state.camera.w = SCREEN_WIDTH; - state.camera.h = SCREEN_HEIGHT; + state.camera.w = state.screenWidth; + state.camera.h = state.screenHeight; state.player.x = m_currentMap.mapPlayerSpawnX; state.player.y = m_currentMap.mapPlayerSpawnY; @@ -57,6 +59,7 @@ void PhoenixGame::render() { SDL_SetRenderDrawColor(state.renderer, 0, 0, 0, 255); SDL_RenderClear(state.renderer); + PRenderMapBackground(&m_currentMap); PRenderMap(&m_currentMap); PRenderPlayer(&state.player); @@ -74,6 +77,20 @@ void PhoenixGame::run() { mb_isOpen = false; break; } + + if (event.type == SDL_WINDOWEVENT) { + if (event.window.event == SDL_WINDOWEVENT_RESIZED) { + state.screenWidth = event.window.data1; + state.screenHeight = event.window.data2; + + // Ajust camera position + state.camera.x = state.player.x - + ((state.screenWidth / m_currentMap.mapScaleX) / 2); + state.camera.y = state.player.y - + ((state.screenHeight / m_currentMap.mapScaleY) / 2); + break; + } + } } unsigned char const *keys = SDL_GetKeyboardState(nullptr); @@ -103,9 +120,9 @@ void PhoenixGame::run() { } state.camera.x = - state.player.x - ((SCREEN_WIDTH / m_currentMap.mapScaleX) / 2); + state.player.x - ((state.screenWidth / m_currentMap.mapScaleX) / 2); state.camera.y = - state.player.y - ((SCREEN_HEIGHT / m_currentMap.mapScaleY) / 2); + state.player.y - ((state.screenHeight / m_currentMap.mapScaleY) / 2); // Rendering code diff --git a/src/texture.cpp b/src/texture.cpp index 3325766..d6e748a 100644 --- a/src/texture.cpp +++ b/src/texture.cpp @@ -30,5 +30,13 @@ void PRenderTexture(PhoenixTexture *texture, int x, int y) { dstRect.w = TEXTURE_WIDTH; dstRect.h = TEXTURE_HEIGHT; - SDL_RenderCopy(state.renderer, texture->texture, NULL, &dstRect); + SDL_Rect screenRect{}; + screenRect.x = 0; + screenRect.y = 0; + screenRect.w = state.screenWidth; + screenRect.h = state.screenHeight; + + if (SDL_HasIntersection(&dstRect, &screenRect)) { + SDL_RenderCopy(state.renderer, texture->texture, NULL, &dstRect); + } }