mirror of
https://github.com/HowestDAE/dae16-VerhulstBram.git
synced 2025-12-16 03:41:48 +01:00
Fix Collision add basic digging
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -30,4 +30,6 @@ private:
|
||||
|
||||
Point2f m_Acc;
|
||||
Point2f m_Gravity{ 0, -9.81f };
|
||||
|
||||
bool m_Grounded{ false };
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user