diff --git a/imgui.ini b/imgui.ini index 806e1e0..2450bc6 100644 --- a/imgui.ini +++ b/imgui.ini @@ -4,12 +4,12 @@ Size=400,400 Collapsed=0 [Window][Phoenix Map Editor] -Pos=851,698 -Size=556,101 +Pos=732,455 +Size=773,153 Collapsed=0 [Window][Map Editor Tools] -Pos=1002,137 +Pos=860,128 Size=357,247 Collapsed=0 diff --git a/include/map.hpp b/include/map.hpp index f61d874..815f5d0 100644 --- a/include/map.hpp +++ b/include/map.hpp @@ -2,6 +2,8 @@ #include #include +struct MapPoint {}; + struct MapData { std::vector mapTiles; std::vector mapEnemys; @@ -22,5 +24,6 @@ struct Map { }; Map PLoadMapFromFile(std::string filepath); +Map PCreateNewMap(std::string filepath); void PSaveMapToFile(Map *map, std::string filepath); -void PRenderMap(Map *map); +void PRenderMap(Map *map, bool debug = false); diff --git a/maps/dm_scale.map b/maps/dm_scale.map index e410edf..bf767b1 100644 --- a/maps/dm_scale.map +++ b/maps/dm_scale.map @@ -3,97 +3,31 @@ MAPVERS 1 MAPAUTH Interfiber MAPSIZE 10x10 MAPSCAL 3x3 -MAPSPWN 32,32 +MAPSPWN 32,120 MAP TILE WALL -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR 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 FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR 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 FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR 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 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 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 WALL TILE WALL TILE WALL @@ -104,39 +38,15 @@ TILE WALL TILE WALL TILE FLOOR TILE FLOOR -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL TILE FLOOR TILE FLOOR -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL TILE FLOOR TILE FLOOR -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL -TILE WALL TILE FLOOR TILE FLOOR TILE WALL TILE WALL -TILE WALL +TILE FLOOR TILE FLOOR TILE FLOOR TILE FLOOR @@ -147,61 +57,21 @@ TILE FLOOR TILE WALL TILE WALL TILE WALL -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE WALL TILE WALL TILE WALL -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR TILE WALL TILE WALL TILE WALL -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR TILE WALL TILE WALL TILE WALL -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR -TILE FLOOR TILE WALL TILE WALL TILE WALL -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 WALL TILE WALL TILE WALL diff --git a/maps/ph_example.map b/maps/ph_example.map new file mode 100644 index 0000000..1c2f7f3 --- /dev/null +++ b/maps/ph_example.map @@ -0,0 +1,608 @@ +MAPNAME ph_exampleMap +MAPVERS b1 +MAPAUTH JohnDoe +MAPSIZE 20x20 +MAPSCAL 3x3 +MAPSPWN 499,666 +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 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 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 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 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 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 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 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 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 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 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 FLOOR +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 FLOOR +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 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 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 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 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 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 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 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/src/map.cpp b/src/map.cpp index c282506..f8a3c84 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1,5 +1,7 @@ #include "assets.hpp" +#include "collision.hpp" #include "config.hpp" +#include "player.hpp" #include "state.hpp" #include "texture.hpp" #include @@ -81,7 +83,7 @@ Map PLoadMapFromFile(std::string filepath) { return map; } -void PRenderMap(Map *map) { +void PRenderMap(Map *map, bool debug) { PhoenixTexture *brickWallTexture = PGetTextureById(BRICK_WALL_TEXTURE_ID); PhoenixTexture *floorTexture = PGetTextureById(FLOOR_TEXTURE_ID); @@ -105,6 +107,27 @@ void PRenderMap(Map *map) { i++; } + + if (debug) { + SDL_Rect playerSpawnRect = PGetPlayerRect(&state.player); + playerSpawnRect.x = map->mapPlayerSpawnX; + playerSpawnRect.y = map->mapPlayerSpawnY; + PhoenixTexture *playerTexture = + PGetTextureById(PLAYER_WALK_DOWN_TEXTURE_ID); + + PRenderTexture(playerTexture, map->mapPlayerSpawnX, map->mapPlayerSpawnY); + + SDL_SetRenderDrawColor(state.renderer, 255, 255, 255, 1); + + // Check collision + if (!PCanMoveTo(map->mapPlayerSpawnX, map->mapPlayerSpawnY)) { + SDL_SetRenderDrawColor(state.renderer, 255, 0, 0, 1); + } else { + SDL_SetRenderDrawColor(state.renderer, 255, 255, 255, 1); + } + + SDL_RenderDrawRect(state.renderer, &playerSpawnRect); + } } void PSaveMapToFile(Map *map, std::string filepath) { @@ -136,3 +159,19 @@ void PSaveMapToFile(Map *map, std::string filepath) { mapFile << mapContent; mapFile.close(); } + +Map PCreateNewMap(std::string filepath) { + Map map{}; + map.mapName = "ph_exampleMap"; + map.mapVersion = "b1"; + map.mapAuthor = "John Doe"; + map.mapPlayerSpawnX = 32; + map.mapPlayerSpawnY = 32; + map.mapWidth = 20; + map.mapHeight = 20; + + // Write the map to disk + PSaveMapToFile(&map, filepath); + + return map; +} diff --git a/src/mapEditor.cpp b/src/mapEditor.cpp index 142fdde..a58973e 100644 --- a/src/mapEditor.cpp +++ b/src/mapEditor.cpp @@ -1,4 +1,5 @@ #include "mapEditor.hpp" +#include "collision.hpp" #include "imgui.h" #include "imgui_impl_sdl2.h" #include "imgui_impl_sdlrenderer.h" @@ -10,6 +11,7 @@ #include #include #include +#include #include #include @@ -77,17 +79,33 @@ void runMapEditor() { while (SDL_PollEvent(&event)) { ImGui_ImplSDL2_ProcessEvent(&event); - if (event.type == SDL_MOUSEBUTTONDOWN && !ImGui::IsAnyItemActive() && - !ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow) && - !ImGui::IsAnyItemHovered()) { + if (editorState.placingPlayerSpawn && event.type == SDL_MOUSEBUTTONDOWN) { if (event.button.button == SDL_BUTTON_LEFT) { - if (editorState.placeTileMode) { - editorState.currentMap.data.mapTiles.push_back( - editorState.selectedTileName); - } - } else if (event.button.button == SDL_BUTTON_RIGHT) { - if (editorState.placeTileMode) { - editorState.currentMap.data.mapTiles.pop_back(); + int mouseX; + int mouseY; + SDL_GetMouseState(&mouseX, &mouseY); + + SDL_Log("Player spawn is: (%i,%i)", mouseX, mouseY); + + editorState.currentMap.mapPlayerSpawnX = mouseX; + editorState.currentMap.mapPlayerSpawnY = mouseY; + + SDL_Log("Placed player spawn point"); + editorState.placingPlayerSpawn = false; + } + } else { + if (event.type == SDL_MOUSEBUTTONDOWN && !ImGui::IsAnyItemActive() && + !ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow) && + !ImGui::IsAnyItemHovered()) { + if (event.button.button == SDL_BUTTON_LEFT) { + if (editorState.placeTileMode) { + editorState.currentMap.data.mapTiles.push_back( + editorState.selectedTileName); + } + } else if (event.button.button == SDL_BUTTON_RIGHT) { + if (editorState.placeTileMode) { + editorState.currentMap.data.mapTiles.pop_back(); + } } } } @@ -116,10 +134,18 @@ void runMapEditor() { ImGui::Text("The Phoenix map editor outputs .map files which can be loaded " "by phoenix"); ImGui::InputText("##Level file path", &editorState.mapFilePath); - ImGui::SameLine(); if (ImGui::Button("Load .map file")) { editorState.currentMap = PLoadMapFromFile(editorState.mapFilePath); editorState.loadedMap = true; + + PBuildCollisionFromMap(&editorState.currentMap); + } + ImGui::SameLine(); + if (ImGui::Button("Create .map file")) { + editorState.currentMap = PCreateNewMap(editorState.mapFilePath); + editorState.loadedMap = true; + + PBuildCollisionFromMap(&editorState.currentMap); } ImGui::End(); @@ -132,6 +158,10 @@ void runMapEditor() { if (ImGui::Button("Save level file")) { PSaveMapToFile(&editorState.currentMap, editorState.mapFilePath); } + if (ImGui::Button("Place player spawn")) { + editorState.placingPlayerSpawn = true; + SDL_Log("Enabled player spawn point placing mode"); + } ImGui::Text("Viewport scale"); ImGui::SameLine(); @@ -182,7 +212,7 @@ void runMapEditor() { SDL_RenderSetScale(state.renderer, editorState.editorScale, editorState.editorScale); if (editorState.loadedMap) { - PRenderMap(&editorState.currentMap); + PRenderMap(&editorState.currentMap, true); } SDL_RenderPresent(state.renderer); diff --git a/src/mapEditorState.hpp b/src/mapEditorState.hpp index ef863ca..531ff84 100644 --- a/src/mapEditorState.hpp +++ b/src/mapEditorState.hpp @@ -6,6 +6,7 @@ struct EditorGlobalState { std::string mapFilePath; bool loadedMap = false; bool placeTileMode = false; + bool placingPlayerSpawn = false; Map currentMap; const char *selectedTileName = "WALL"; int editorScale = 1; diff --git a/src/phoenix.cpp b/src/phoenix.cpp index fc424dd..2633bb3 100644 --- a/src/phoenix.cpp +++ b/src/phoenix.cpp @@ -36,7 +36,7 @@ PhoenixGame::PhoenixGame() { // Load textures PRunBoostrap(); - m_currentMap = PLoadMapFromFile("maps/dm_scale.map"); + m_currentMap = PLoadMapFromFile("maps/ph_example.map"); PBuildCollisionFromMap(&m_currentMap); state.camera.x = 0;