Collision Rework, started adding directions to the collision (WIP)

This commit is contained in:
Bram Verhulst
2024-03-17 15:53:48 +01:00
parent d6c5cfa47b
commit 05f46b7eba
5 changed files with 42 additions and 21 deletions

View File

@@ -76,12 +76,13 @@ void WorldLevel::Update(float elapsedSec) {
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].contact[0] = nullptr;
m_Rects[0].contact[1] = nullptr;
m_Rects[0].contact[2] = nullptr;
m_Rects[0].contact[3] = nullptr;
m_Rects[0].ContactMap.clear();
float t = 0, min_t = INFINITY;
Point2f intersectionPoint, normal;
@@ -108,7 +109,7 @@ void WorldLevel::Update(float elapsedSec) {
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(), intersectionPoint, normal, t)) {
if(Collision::DynamicRectVsRect(m_Rects[0], elapsedSec, m_worldTiles[x][y]->GetCollisionRect().getCollisionRect(), intersectionPoint, normal, t)) {
contactTimes.push_back(std::pair<int, float>{x + y * WORLD_WIDTH, t});
}
}
@@ -121,14 +122,13 @@ void WorldLevel::Update(float elapsedSec) {
for (std::pair<int, float> contact_time : contactTimes) {
WorldTile* tile = m_worldTiles[contact_time.first % WORLD_WIDTH][contact_time.first / WORLD_WIDTH];
Collision::CollisionRect rect = tile->GetCollisionRect();
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;
}
@@ -174,7 +174,7 @@ void WorldLevel::Draw() const {
for (int x { 0 }; x < WORLD_WIDTH; ++x) {
for (int y { 0 }; y < WORLD_HEIGHT; ++y) {
if(m_worldTiles[x][y]->GetTileType() == GroundTileTypes::Dirt) {
Collision::CollisionRect rect = m_worldTiles[x][y]->GetCollisionRect();
Collision::CollisionRect rect = m_worldTiles[x][y]->GetCollisionRect().getCollisionRect();
utils::SetColor(Colors::GREEN);
utils::DrawRect(rect.pos, rect.size.x, rect.size.y);
}
@@ -182,9 +182,10 @@ void WorldLevel::Draw() const {
}
for (size_t i { 0 }; i < 4; ++i) {
if(m_Rects[0].contact[i] != nullptr) {
if(m_Rects[0].ContactMap.find(static_cast<Collision::CollisionDirection>(i)) != m_Rects[0].ContactMap.end()) {
utils::SetColor(Colors::RED);
utils::FillRect(m_Rects[0].contact[i]->pos, m_Rects[0].contact[i]->size.x, m_Rects[0].contact[i]->size.y);
Collision::CollisionRect* rect = m_Rects[0].ContactMap.at(static_cast<Collision::CollisionDirection>(i));
utils::FillRect(rect->pos, rect->size.x, rect->size.y);
}
}