diff --git a/ComicSans.ttf b/ComicSans.ttf new file mode 100644 index 0000000..831e3d8 Binary files /dev/null and b/ComicSans.ttf differ diff --git a/Engine/BaseGame.cpp b/Engine/BaseGame.cpp index 016bf39..c45cd8e 100644 --- a/Engine/BaseGame.cpp +++ b/Engine/BaseGame.cpp @@ -101,6 +101,10 @@ void BaseGame::InitializeGameEngine() IMGUI_CHECKVERSION(); ImGui::CreateContext(); + //ImGuiIO& io = ImGui::GetIO(); (void)io; + //io.Fonts->AddFontFromFileTTF("ComicSans.ttf", 18.0f, NULL, NULL); + + // Setup Dear ImGui style ImGui::StyleColorsDark(); //ImGui::StyleColorsLight(); diff --git a/Engine/Collision.cpp b/Engine/Collision.cpp index a767386..0d13738 100644 --- a/Engine/Collision.cpp +++ b/Engine/Collision.cpp @@ -2,11 +2,12 @@ #include "utils.h" #include "../Game/Player.h" +#include "../Game/WorldTile.h" namespace Collision { - TileCollisionRect::TileCollisionRect(const Point2f& pos, const Point2f& size, WorldTile* tile): pos(pos), size(size), tile(tile) + TileCollisionRect::TileCollisionRect(const Point2f& pos, const Point2f& size, WorldTile* tile): CollisionRect(pos, size), tile(tile) {} bool PointVsRect(const Point2f p, const Collision::CollisionRect& r) { return ( p.x >= r.pos.x && p.y >= r.pos.y && p.x < r.pos.x + r.size.x && p.y < r.pos.y + r.size.y ); @@ -125,6 +126,7 @@ namespace Collision bool ResolvePlayerVsRect(Player& player, float ElapsedTime, Collision::CollisionRect* staticRectangle) { CollisionRect rect = player.GetCollisionRect(); Collision::ResolveDynamicRectVsRect(rect, ElapsedTime, staticRectangle); + //dynamic_cast(rect.ContactMap[CollisionDirection::Bottom])->tile->SetTileType(GroundTileTypes::Air); // std::map test = rect.ContactMap; // player.SetContactMap(test); player.SetPosition(rect.pos); diff --git a/Engine/Collision.h b/Engine/Collision.h index 16181a7..ec84d2c 100644 --- a/Engine/Collision.h +++ b/Engine/Collision.h @@ -31,14 +31,10 @@ namespace Collision std::map ContactMap{}; }; - struct TileCollisionRect + struct TileCollisionRect : virtual public CollisionRect { - Point2f pos; - Point2f size; - Point2f vel; TileCollisionRect(const Point2f& pos, const Point2f& size, WorldTile* tile); WorldTile* tile; - std::map ContactMap; bool Contains(Point2f point2_f) { return utils::IsPointInRect(point2_f, Rectf{ pos.x, pos.y, size.x, size.y }); diff --git a/Game/Game.cpp b/Game/Game.cpp index d12a9e7..d036a76 100644 --- a/Game/Game.cpp +++ b/Game/Game.cpp @@ -2,12 +2,15 @@ #include "pch.h" #include "Game.h" +#include +#include + #include "colors.h" #include "utils.h" #include "WorldLevel.h" Game::Game(const Window& window) - : BaseGame { window }, m_Camera(Camera()), m_WorldLevel(WorldLevel(&m_Camera)) + : BaseGame { window }, m_Camera(Camera()), m_WorldLevel(WorldLevel(&m_Camera, GetViewPort())) { Initialize(); } @@ -60,7 +63,6 @@ void Game::ProcessKeyDownEvent(const SDL_KeyboardEvent& e) { } void Game::ProcessKeyUpEvent(const SDL_KeyboardEvent& e) { - } void Game::ProcessMouseMotionEvent(const SDL_MouseMotionEvent& e) { @@ -71,26 +73,10 @@ void Game::ProcessMouseMotionEvent(const SDL_MouseMotionEvent& e) { void Game::ProcessMouseDownEvent(const SDL_MouseButtonEvent& e) { m_IsRightMouseDown = e.button == SDL_BUTTON_RIGHT; m_MouseOffset = Point2f{m_Camera.GetPosition().x - m_MousePos.x, m_Camera.GetPosition().y - m_MousePos.y}; - - - //std::cout << "MOUSEBUTTONDOWN event: "; - //switch ( e.button ) - //{ - //case SDL_BUTTON_LEFT: - // std::cout << " left button " << std::endl; - // break; - //case SDL_BUTTON_RIGHT: - // std::cout << " right button " << std::endl; - // break; - //case SDL_BUTTON_MIDDLE: - // std::cout << " middle button " << std::endl; - // break; - //} - } void Game::ProcessMouseUpEvent(const SDL_MouseButtonEvent& e) { - m_IsRightMouseDown = e.button == SDL_BUTTON_RIGHT; + m_IsRightMouseDown = e.button == SDL_BUTTON_RIGHT ? false : m_IsRightMouseDown; //std::cout << "MOUSEBUTTONUP event: "; //switch ( e.button ) //{ @@ -106,11 +92,8 @@ void Game::ProcessMouseUpEvent(const SDL_MouseButtonEvent& e) { //} } void Game::ProcessImGui() { - ImGui::Begin("Hello world", nullptr, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::Text("Texture loading Count:"); - ImGui::SameLine(); - ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), std::to_string(Texture::m_TextureCounter).c_str()); - ImGui::End(); + + m_WorldLevel.ProcessImGui(); } diff --git a/Game/Player.cpp b/Game/Player.cpp index 735ef96..874f546 100644 --- a/Game/Player.cpp +++ b/Game/Player.cpp @@ -7,7 +7,7 @@ #include "utils.h" #include "WorldLevel.h" -Player::Player(const Point2f& Position) : m_Position(Position), m_Size(Point2f{50, 20}) +Player::Player(const Point2f& Position) : m_Position(Position), m_Size(Point2f{40, 40}) {} Collision::CollisionRect Player::GetCollisionRect() { Collision::CollisionRect rect = {m_Position, m_Size, m_Vel}; @@ -46,9 +46,13 @@ void Player::Update(float elapsedTime, WorldLevel& level) { std::vector> contactTimes{}; - for (size_t i { 0 }; i < level.m_Rects.size(); ++i) { - if(Collision::DynamicRectVsRect(this->GetCollisionRect(), elapsedTime, level.m_Rects[i], intersectionPoint, normal, t)) { - contactTimes.push_back(std::pair{i, t}); + for (size_t x { 0 }; x < level.WORLD_WIDTH; ++x) { + for(size_t y { 0 }; y < level.WORLD_HEIGHT; ++y) { + if(level.GetTileAt(Point2f{(float)x,(float)y})->GetTileType() == GroundTileTypes::Dirt) { + if(Collision::DynamicRectVsRect(this->GetCollisionRect(), elapsedTime, level.GetTileAt(Point2f{(float)x, (float)y})->GetCollisionRect().getCollisionRect(), intersectionPoint, normal, t)) { + contactTimes.push_back(std::pair{x + y * level.WORLD_WIDTH, t}); + } + } } } @@ -57,7 +61,11 @@ void Player::Update(float elapsedTime, WorldLevel& level) { }); for (std::pair contact_time : contactTimes) { - Collision::ResolvePlayerVsRect(*this, elapsedTime, &level.m_Rects[contact_time.first]); + int x = contact_time.first % level.WORLD_WIDTH; + int y = contact_time.first / level.WORLD_WIDTH; + WorldTile* tile2 = level.GetTileAt(Point2f{(float) x, (float) y}); + Collision::CollisionRect rect = tile2->GetCollisionRect().getCollisionRect(); //TODO: fix this mess + Collision::ResolvePlayerVsRect(*this, elapsedTime, &rect); } m_Position = m_Position + m_Vel * elapsedTime; diff --git a/Game/WorldLevel.cpp b/Game/WorldLevel.cpp index 8a6d9e0..7cc5efd 100644 --- a/Game/WorldLevel.cpp +++ b/Game/WorldLevel.cpp @@ -11,7 +11,12 @@ #include "utils.h" -WorldLevel::WorldLevel(Camera* camera) : Level(camera), m_mousePos{ 0, 0 }, m_player(Player{ Point2f{ 0, 100 } }) { +WorldLevel::WorldLevel(Camera* camera, Rectf viewport): + Level(camera), + m_player(Player { Point2f { 0, 100 } }), + m_mousePos { 0, 0 }, + m_viewport(viewport) +{ // The grid is 34 x 50 big, the top center is 0,0 in world coords for (size_t x { 0 }; x < WORLD_WIDTH; ++x) { for (size_t y { 0 }; y < WORLD_HEIGHT; ++y) { @@ -19,22 +24,7 @@ WorldLevel::WorldLevel(Camera* camera) : Level(camera), m_mousePos{ 0, 0 }, m_pl m_worldTiles[x][y] = new WorldTile{ Point2f{ float(actualX * TILE_WIDTH), -float(y * TILE_HEIGHT) - TILE_HEIGHT}, GroundTileTypes::Dirt, TextureManager::GetInstance()}; } } - m_Rects.push_back(Collision::CollisionRect{ Point2f{0.0f, 10.0f}, Point2f{40.0f, 40.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{170.0f, 70.0f}, Point2f{10.0f, 40.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{150.0f, 50.0f}, Point2f{20.0f, 20.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{150.0f, 150.0f}, Point2f{75.0f, 20.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{170.0f, 50.0f}, Point2f{20.0f, 20.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{190.0f, 50.0f}, Point2f{20.0f, 20.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{110.0f, 50.0f}, Point2f{20.0f, 20.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{50.0f, 130.0f}, Point2f{20.0f, 20.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{50.0f, 150.0f}, Point2f{20.0f, 20.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{50.0f, 170.0f}, Point2f{20.0f, 20.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{150.0f, 100.0f}, Point2f{10.0f, 1.0f} }); - m_Rects.push_back(Collision::CollisionRect{ Point2f{200.0f, 100.0f}, Point2f{20.0f, 60.0f} }); - - // std::string dirtPath = + "tiles/dirt/dirt" + std::to_string(utils::randRange(1, 5)) + ".png"; - // m_pTextTexture = new Texture(dirtPath); } WorldLevel::~WorldLevel() { //delete m_pTextTexture; @@ -58,82 +48,12 @@ void WorldLevel::Update(float elapsedSec) { } } if(selectedTile != nullptr) { - selectedTile->SetTileType(GroundTileTypes::Air); + if(utils::isMouseDown(SDL_BUTTON_LEFT)) { + selectedTile->SetTileType(GroundTileTypes::Air); + } } - Point2f RayPoint = Point2f{m_pCamera->Viewport.width, m_pCamera->Viewport.height}; - Point2f RayDir = Point2f{m_mousePos.x - RayPoint.x, m_mousePos.y - RayPoint.y}; - - //wasd movement - if(utils::isKeyDown(SDL_SCANCODE_W)) { - m_Rects[0].vel.y += 20; - } - if(utils::isKeyDown(SDL_SCANCODE_S)) { - m_Rects[0].vel.y += -10; - } - if(utils::isKeyDown(SDL_SCANCODE_A)) { - m_Rects[0].vel.x += -10; - } - if(utils::isKeyDown(SDL_SCANCODE_D)) { - m_Rects[0].vel.x += 10; - } - if(utils::isKeyDown(SDL_SCANCODE_SPACE)) { - //check if the player is on the ground - m_Rects[0].ContactMap[Collision::CollisionDirection::Bottom]->pos.y += 100; - } - m_Rects[0].vel.y -= 9.81f; - - m_Rects[0].ContactMap.clear(); - - float t = 0, min_t = INFINITY; - Point2f intersectionPoint, normal; - - std::vector> contactTimes{}; - m_player.Update(elapsedSec, *this); - - // for (size_t i { 1 }; i < m_Rects.size(); ++i) { - // if(Collision::DynamicRectVsRect(m_Rects[0], elapsedSec, m_Rects[i], intersectionPoint, normal, t)) { - // contactTimes.push_back(std::pair{i, t}); - // } - // } - // - // std::sort(contactTimes.begin(), contactTimes.end(), [](const std::pair& a, const std::pair& b) { - // return a.second < b.second; - // }); - // - // for (std::pair contact_time : contactTimes) { - // Collision::ResolveDynamicRectVsRect(m_Rects[0], elapsedSec, &m_Rects[contact_time.first]); - // } - - //contactTimes.clear(); - - // //loop over the worldTiles - // for (int x {0} ; x < WORLD_WIDTH; ++x) { - // for (int y {0}; y < WORLD_HEIGHT; ++y) { - // if(m_worldTiles[x][y]->GetTileType() == GroundTileTypes::Dirt) { - // if(Collision::DynamicRectVsRect(m_Rects[0], elapsedSec, m_worldTiles[x][y]->GetCollisionRect().getCollisionRect(), intersectionPoint, normal, t)) { - // contactTimes.push_back(std::pair{x + y * WORLD_WIDTH, t}); - // } - // } - // } - // } - // - // std::sort(contactTimes.begin(), contactTimes.end(), [](const std::pair& a, const std::pair& b) { - // return a.second < b.second; - // }); - // - // for (std::pair contact_time : contactTimes) { - // WorldTile* tile = m_worldTiles[contact_time.first % WORLD_WIDTH][contact_time.first / WORLD_WIDTH]; - // Collision::CollisionRect rect = tile->GetCollisionRect().getCollisionRect(); - // Collision::ResolveDynamicRectVsRect(m_Rects[0], elapsedSec, &rect); - // //delete tile; - // //WorldTile* tileRect = tile->GetCollisionRect().tile; - // //tileRect->SetTileType(GroundTileTypes::Air); - // } - // - // m_Rects[0].pos = m_Rects[0].pos + m_Rects[0].vel * elapsedSec; - } void WorldLevel::Draw() const { m_pCamera->BeginRendering(); @@ -167,21 +87,6 @@ void WorldLevel::Draw() const { } } - for (size_t i { 0 }; i < 4; ++i) { - if(m_Rects[0].ContactMap.find(static_cast(i)) != m_Rects[0].ContactMap.end()) { - utils::SetColor(Colors::RED); - Collision::CollisionRect* rect = m_Rects[0].ContactMap.at(static_cast(i)); - utils::FillRect(rect->pos, rect->size.x, rect->size.y); - } - } - - // utils::SetColor(Colors::WHITE); - // for (int x { -100 }; x < 100; ++x) { - // for (int y { -100 }; y < 100; ++y) { - // utils::DrawLine(x * 50, -5000, x * 50, 50000); - // utils::DrawLine(-5000, y * 50, 50000, y * 50); - // } - // } utils::SetColor(Colors::MAGENTA); utils::FillEllipse(0, 0, 5, 5); @@ -191,21 +96,57 @@ void WorldLevel::Draw() const { void WorldLevel::MouseMove(const Point2f& mousePos) { m_mousePos = mousePos; } + void WorldLevel::ProcessImGui() { - ImGui::Begin("Player Info", nullptr, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::Text("Player Position: (%f, %f)", m_player.GetPosition().x, m_player.GetPosition().y); - ImGui::Text("Player Velocity: (%f, %f)", m_player.GetVelocity().x, m_player.GetVelocity().y); - //PLAYER COLLISIONS - ImGui::Text("Player Collisions:"); - // for (std::pair contact : m_player.GetContactMap()) { - // ImGui::Text("Direction: %d", contact.first); - // ImGui::Text("Position: (%f, %f)", contact.second->pos.x, contact.second->pos.y); - // ImGui::Text("Size: (%f, %f)", contact.second->size.x, contact.second->size.y); - // } - ImGui::End(); + if (ImGui::BeginMainMenuBar()) { + if (ImGui::BeginMenu("Properties")) { + if (ImGui::MenuItem("TextureManager Info")) { + m_ShowTextureManagerWindow = !m_ShowTextureManagerWindow; + } + if (ImGui::MenuItem("Camera Info")) { + m_ShowCameraWindow = !m_ShowCameraWindow; + } + if(ImGui::MenuItem("Player Info")) { + m_ShowPlayerInfo = !m_ShowPlayerInfo; + } + ImGui::EndMenu(); + } + ImGui::EndMainMenuBar(); + } + + if(m_ShowTextureManagerWindow) { + ImGui::Begin("Texture Manager", &m_ShowTextureManagerWindow, ImGuiWindowFlags_AlwaysAutoResize); + ImGui::Text("Texture loading Count:"); + ImGui::SameLine(); + ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), std::to_string(Texture::m_TextureCounter).c_str()); + ImGui::End(); + } + + if(m_ShowCameraWindow) { + ImGui::Begin("Camera", &m_ShowCameraWindow, ImGuiWindowFlags_AlwaysAutoResize); + ImGui::Text("Camera Position: (%f, %f)", m_pCamera->GetPosition().x, m_pCamera->GetPosition().y); + if(ImGui::Button("Reset Camera")) { + m_pCamera->SetPosition(Point2f{m_viewport.width / 2, m_viewport.height / 2}); + } + ImGui::End(); + } + + if(m_ShowPlayerInfo) { + ImGui::Begin("Player Info", &m_ShowPlayerInfo, ImGuiWindowFlags_AlwaysAutoResize); + ImGui::Text("Player Position: (%f, %f)", m_player.GetPosition().x, m_player.GetPosition().y); + ImGui::Text("Player Velocity: (%f, %f)", m_player.GetVelocity().x, m_player.GetVelocity().y); + //PLAYER COLLISIONS + ImGui::Text("Player Collisions:"); + // for (std::pair contact : m_player.GetContactMap()) { + // ImGui::Text("Direction: %d", contact.first); + // ImGui::Text("Position: (%f, %f)", contact.second->pos.x, contact.second->pos.y); + // ImGui::Text("Size: (%f, %f)", contact.second->size.x, contact.second->size.y); + // } + ImGui::End(); + } } WorldTile* WorldLevel::GetTileAt(const Point2f& pos) const { - return nullptr; + return m_worldTiles[pos.x][pos.y]; } void WorldLevel::SetTileAt(const Point2f& pos, WorldTile* tile) { } diff --git a/Game/WorldLevel.h b/Game/WorldLevel.h index 6ca96cc..7be3832 100644 --- a/Game/WorldLevel.h +++ b/Game/WorldLevel.h @@ -18,7 +18,7 @@ public: static const int TILE_WIDTH = 50; static const int TILE_HEIGHT = 50; - WorldLevel(Camera* camera); + WorldLevel(Camera* camera, Rectf viewport); ~WorldLevel() override; void Update(float elapsedSec) override; @@ -34,6 +34,8 @@ public: std::vector m_Rects; + std::array, WORLD_HEIGHT> GetWorldTiles() const { return m_worldTiles; } + private: @@ -43,4 +45,11 @@ private: Player m_player; Point2f m_mousePos{}; + + Rectf m_viewport; + + // ImGui Vars + bool m_ShowTextureManagerWindow{ false }; + bool m_ShowCameraWindow{ false }; + bool m_ShowPlayerInfo{ false }; };