update level editor so the player spawn point can be selected

This commit is contained in:
Hunter 2023-05-27 19:22:06 -04:00
parent 553ab7c1df
commit b7384adc5e
8 changed files with 701 additions and 150 deletions

View file

@ -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

View file

@ -2,6 +2,8 @@
#include <string>
#include <vector>
struct MapPoint {};
struct MapData {
std::vector<std::string> mapTiles;
std::vector<std::string> 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);

View file

@ -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

608
maps/ph_example.map Normal file
View file

@ -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

View file

@ -1,5 +1,7 @@
#include "assets.hpp"
#include "collision.hpp"
#include "config.hpp"
#include "player.hpp"
#include "state.hpp"
#include "texture.hpp"
#include <SDL.h>
@ -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;
}

View file

@ -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 <SDL.h>
#include <SDL_events.h>
#include <SDL_keycode.h>
#include <SDL_mouse.h>
#include <SDL_render.h>
#include <stdio.h>
@ -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);

View file

@ -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;

View file

@ -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;