diff --git a/Engine/Collision.cpp b/Engine/Collision.cpp index bdbe7f7..ed77b70 100644 --- a/Engine/Collision.cpp +++ b/Engine/Collision.cpp @@ -107,13 +107,13 @@ namespace Collision dynamicRectangle.ContactMap[CollisionDirection::Bottom] = staticRectangle; } if (contactNormal.x < 0) { - dynamicRectangle.ContactMap[CollisionDirection::Left] = staticRectangle; + dynamicRectangle.ContactMap[CollisionDirection::Right] = staticRectangle; } if (contactNormal.y < 0) { dynamicRectangle.ContactMap[CollisionDirection::Top] = staticRectangle; } if (contactNormal.x > 0) { - dynamicRectangle.ContactMap[CollisionDirection::Right] = staticRectangle; + dynamicRectangle.ContactMap[CollisionDirection::Left] = staticRectangle; } //dynamicRectangle.vel = dynamicRectangle.vel + contactNormal * Point2f(std::abs(dynamicRectangle.vel.x), std::abs(dynamicRectangle.vel.y)) * ( 1 - contact_time ); @@ -126,9 +126,8 @@ 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); player.SetVelocity(rect.vel); return true; diff --git a/Game/Camera.cpp b/Game/Camera.cpp index 623bd68..bf861fd 100644 --- a/Game/Camera.cpp +++ b/Game/Camera.cpp @@ -10,7 +10,7 @@ Camera::Camera(const Point2f& position, float scale) : m_Position { position }, void Camera::BeginRendering() const { glPushMatrix(); - glTranslatef(m_Position.x, m_Position.y, 0); + glTranslatef(-m_Position.x, -m_Position.y, 0); glScalef(m_Scale, m_Scale, 1); } @@ -19,5 +19,9 @@ void Camera::EndRendering() const { } Point2f Camera::TransformMouse(const Point2f& mousePos) const { - return Point2f { mousePos.x - m_Position.x, Viewport.height - mousePos.y - m_Position.y }; + //Mousepos is in screen coords, we need to transform it to world coords + Point2f worldPos = mousePos; + worldPos.x = (worldPos.x + m_Position.x) / m_Scale; + worldPos.y = Viewport.height - worldPos.y + m_Position.y / m_Scale; + return worldPos; } diff --git a/Game/Game.cpp b/Game/Game.cpp index 0477994..8ca4a79 100644 --- a/Game/Game.cpp +++ b/Game/Game.cpp @@ -24,7 +24,7 @@ Game::~Game() { } void Game::Initialize() { - m_Camera.SetPosition(Point2f{GetViewPort().width / 2, GetViewPort().height / 2}); + m_Camera.SetPosition(Point2f{-GetViewPort().width / 2, -GetViewPort().height / 2}); } void Game::Cleanup() { @@ -34,12 +34,13 @@ void Game::Update(float elapsedSec) { const Uint8* pStates = SDL_GetKeyboardState(nullptr); if(m_IsRightMouseDown) { - Point2f newCameraPos = m_MousePos + m_MouseOffset; - m_Camera.SetPosition(newCameraPos); + Point2f newCameraPos = Point2f{m_MousePos.x + m_MouseOffset.x, m_MousePos.y + m_MouseOffset.y}; + m_Camera.SetPosition(Point2f{-newCameraPos.x, -newCameraPos.y}); } else { m_MouseOffset = m_Camera.GetPosition(); } + m_WorldLevel.Update(elapsedSec); } @@ -64,7 +65,7 @@ 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}; + m_MouseOffset = Point2f{-m_Camera.GetPosition().x - m_MousePos.x, -m_Camera.GetPosition().y - m_MousePos.y}; } void Game::ProcessMouseUpEvent(const SDL_MouseButtonEvent& e) { diff --git a/Game/Player.cpp b/Game/Player.cpp index 845ee53..17ff31a 100644 --- a/Game/Player.cpp +++ b/Game/Player.cpp @@ -37,9 +37,16 @@ void Player::Update(float elapsedTime, WorldLevel& level) { } if(utils::isKeyDown(SDL_SCANCODE_S)) { m_Vel.y = -100; + if(m_Grounded) { + if(m_ContactMap[Collision::CollisionDirection::Bottom] != nullptr) { + m_ContactMap[Collision::CollisionDirection::Bottom]->SetTileType(GroundTileTypes::Air); + } + + } } if(utils::isKeyDown(SDL_SCANCODE_A)) { m_Vel.x = -100; + } if(utils::isKeyDown(SDL_SCANCODE_D)) { m_Vel.x = 100; @@ -68,6 +75,16 @@ void Player::Update(float elapsedTime, WorldLevel& level) { int x = contact_time.first % WorldLevel::WORLD_WIDTH; int y = contact_time.first / WorldLevel::WORLD_WIDTH; WorldTile* world_tile = level.GetTileAt(Point2f{(float) x, (float) y}); + //check if tile is next to player + + //check if the collision happend beneeth the player + if(world_tile->GetCollisionRect().pos.y < m_Position.y) { + m_Grounded = true; + m_ContactMap[Collision::CollisionDirection::Bottom] = world_tile; + } + + + Collision::CollisionRect rect = world_tile->GetCollisionRect().getCollisionRect(); //TODO: fix this mess Collision::ResolvePlayerVsRect(*this, elapsedTime, &rect); } diff --git a/Game/Player.h b/Game/Player.h index d1d9ec7..5cc5f4c 100644 --- a/Game/Player.h +++ b/Game/Player.h @@ -30,4 +30,6 @@ private: Point2f m_Acc; Point2f m_Gravity{ 0, -9.81f }; + + bool m_Grounded{ false }; }; diff --git a/Game/WorldLevel.cpp b/Game/WorldLevel.cpp index 764ad7c..f6ceec9 100644 --- a/Game/WorldLevel.cpp +++ b/Game/WorldLevel.cpp @@ -55,6 +55,14 @@ void WorldLevel::Update(float elapsedSec) { } m_player.Update(elapsedSec, *this); + + //Point2f playerPos = m_player.GetPosition(); + //Point2f newCameraPos = playerPos; + //m_pCamera->SetPosition(newCameraPos); + + //place the player in the center of the camera + //m_pCamera->SetPosition(Point2f{playerPos.x - m_viewport.width / 2, playerPos.y - m_viewport.height / 2}); + } void WorldLevel::Draw() const { m_pCamera->BeginRendering(); @@ -128,7 +136,7 @@ void WorldLevel::ProcessImGui() { ImGui::Text("Camera Position: (%f, %f)", m_pCamera->GetPosition().x, m_pCamera->GetPosition().y); ImGui::Text("Is Right Mouse Down: %s", utils::isMouseDown(0) ? "true" : "false"); if(ImGui::Button("Reset Camera")) { - m_pCamera->SetPosition(Point2f{m_viewport.width / 2, m_viewport.height / 2}); + m_pCamera->SetPosition(Point2f{-m_viewport.width / 2, -m_viewport.height / 2}); } ImGui::End(); }