Fix Collision add basic digging

This commit is contained in:
Bram Verhulst
2024-03-19 17:12:24 +01:00
parent d5e4aa9752
commit a165c0bc6f
6 changed files with 43 additions and 12 deletions

View File

@@ -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<TileCollisionRect*>(rect.ContactMap[CollisionDirection::Bottom])->tile->SetTileType(GroundTileTypes::Air);
// std::map<CollisionDirection, TileCollisionRect*> test = rect.ContactMap;
// player.SetContactMap(test);
player.SetPosition(rect.pos);
player.SetVelocity(rect.vel);
return true;

View File

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

View File

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

View File

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

View File

@@ -30,4 +30,6 @@ private:
Point2f m_Acc;
Point2f m_Gravity{ 0, -9.81f };
bool m_Grounded{ false };
};

View File

@@ -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();
}