Fix camera, added more collsion stuff

added pink color
This commit is contained in:
Bram Verhulst
2024-03-19 10:20:07 +01:00
parent 6f2a6ead37
commit d5e4aa9752
13 changed files with 43 additions and 46 deletions

View File

@@ -7,7 +7,7 @@
namespace Collision
{
TileCollisionRect::TileCollisionRect(const Point2f& pos, const Point2f& size, WorldTile* tile): CollisionRect(pos, size), tile(tile)
TileCollisionRect::TileCollisionRect(const Point2f& pos, const Point2f& size, WorldTile* tile): pos(pos), size(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 );

View File

@@ -31,8 +31,12 @@ namespace Collision
std::map<CollisionDirection, CollisionRect*> ContactMap{};
};
struct TileCollisionRect : virtual public CollisionRect
struct TileCollisionRect
{
Point2f pos;
Point2f size;
Point2f vel;
TileCollisionRect(const Point2f& pos, const Point2f& size, WorldTile* tile);
WorldTile* tile;

View File

@@ -13,4 +13,5 @@ namespace Colors
const Color4f YELLOW{ 1.0f, 1.0f, 0.0f, 1.0f };
const Color4f MAGENTA{ 1.0f, 0.0f, 1.0f, 1.0f };
const Color4f CYAN{ 0.0f, 1.0f, 1.0f, 1.0f };
const Color4f PINK{ 1.0f, 0.0f, 0.5f, 1.0f };
}

View File

@@ -3,11 +3,11 @@
Camera::Camera() : m_Position { 0, 0 }, m_Scale { 1.0f } {
}
Camera::Camera(const Point2f& position, const float scale) : m_Position { position }, m_Scale { scale } {
}
Camera::~Camera() {
Camera::Camera(const Point2f& position, float scale) : m_Position { position }, m_Scale { scale } {
}
void Camera::BeginRendering() const {
glPushMatrix();
glTranslatef(m_Position.x, m_Position.y, 0);
@@ -17,7 +17,7 @@ void Camera::BeginRendering() const {
void Camera::EndRendering() const {
glPopMatrix();
}
Point2f Camera::TransformMouse(const Point2f& mousePos) const {
const Point2f translatedPosition = Point2f{ mousePos.x - m_Position.x, Viewport.height - mousePos.y - m_Position.y};
return translatedPosition;
return Point2f { mousePos.x - m_Position.x, Viewport.height - mousePos.y - m_Position.y };
}

View File

@@ -5,7 +5,7 @@ class Camera
public:
Camera( );
Camera( const Point2f& position, float scale = 1);
virtual ~Camera();
~Camera() = default;
void SetPosition( const Point2f& position ) { m_Position = position; }
void SetScale( const float scale ) { m_Scale = scale; }
@@ -23,5 +23,4 @@ public:
private:
Point2f m_Position;
float m_Scale;
};

View File

@@ -9,10 +9,14 @@
#include "utils.h"
#include "WorldLevel.h"
Rectf Game::VIEWPORT{};
Game::Game(const Window& window)
: BaseGame { window }, m_Camera(Camera()), m_WorldLevel(WorldLevel(&m_Camera, GetViewPort()))
{
Initialize();
Game::VIEWPORT = GetViewPort(); //TODO: See if this can be removed
}
Game::~Game() {
@@ -28,18 +32,6 @@ void Game::Cleanup() {
void Game::Update(float elapsedSec) {
const Uint8* pStates = SDL_GetKeyboardState(nullptr);
// if (pStates[SDL_SCANCODE_RIGHT]) {
// m_CameraOffset.x += 200 * elapsedSec;
// }
// if (pStates[SDL_SCANCODE_LEFT]) {
// m_CameraOffset.x -= 200 * elapsedSec;
// }
// if (pStates[SDL_SCANCODE_UP]) {
// m_CameraOffset.y += 200 * elapsedSec;
// }
// if (pStates[SDL_SCANCODE_DOWN]) {
// m_CameraOffset.y -= 200 * elapsedSec;
// }
if(m_IsRightMouseDown) {
Point2f newCameraPos = m_MousePos + m_MouseOffset;
@@ -50,9 +42,9 @@ void Game::Update(float elapsedSec) {
m_WorldLevel.Update(elapsedSec);
}
void Game::Draw() const {
utils::ClearBackground(Color4f(0.0f, 0.0f, 0.3f, 1.0f));
m_WorldLevel.Draw();
@@ -66,8 +58,8 @@ void Game::ProcessKeyUpEvent(const SDL_KeyboardEvent& e) {
}
void Game::ProcessMouseMotionEvent(const SDL_MouseMotionEvent& e) {
m_MousePos = Point2f { float(e.x), float(e.y) };
m_WorldLevel.MouseMove(m_MousePos);
m_MousePos = Point2f{float(e.x), float(e.y)};
m_WorldLevel.MouseMove(Point2f { float(e.x), float(e.y) });
}
void Game::ProcessMouseDownEvent(const SDL_MouseButtonEvent& e) {
@@ -92,8 +84,5 @@ void Game::ProcessMouseUpEvent(const SDL_MouseButtonEvent& e) {
//}
}
void Game::ProcessImGui() {
m_WorldLevel.ProcessImGui();
}

View File

@@ -29,6 +29,8 @@ public:
void ProcessImGui() override;
static Rectf VIEWPORT;
private:
// FUNCTIONS
void Initialize();

View File

@@ -109,7 +109,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Create</PrecompiledHeader>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>

View File

@@ -3,7 +3,7 @@
#include <iostream>
Level::Level() : m_pCamera(nullptr) {
std::cout << "Cannot make level without a camera" << std::endl;
std::cout << "Cannot make level without a camera, Duh 🙄" << std::endl;
}
Level::Level(Camera* camera) {
m_pCamera = camera;

View File

@@ -13,8 +13,6 @@ public:
virtual void MouseMove(const Point2f& mousePos) = 0;
virtual void ProcessImGui() = 0;
private:
protected:
Camera* m_pCamera;
};

View File

@@ -7,15 +7,19 @@
#include "utils.h"
#include "WorldLevel.h"
Player::Player(const Point2f& Position) : m_Position(Position), m_Size(Point2f{40, 40})
{}
Player::Player(const Point2f& Position) : m_Position(Position), m_Size(Point2f{40, 40}), m_Vel(Point2f{0,0}), m_Acc(Point2f{0,0}) {
m_ContactMap[Collision::CollisionDirection::Top] = nullptr;
m_ContactMap[Collision::CollisionDirection::Bottom] = nullptr;
m_ContactMap[Collision::CollisionDirection::Left] = nullptr;
m_ContactMap[Collision::CollisionDirection::Right] = nullptr;
}
Collision::CollisionRect Player::GetCollisionRect() {
Collision::CollisionRect rect = {m_Position, m_Size, m_Vel};
return rect;
}
void Player::Draw() const {
utils::SetColor(Colors::RED);
utils::SetColor(Colors::PINK);
utils::DrawRect(Rectf{m_Position.x, m_Position.y, m_Size.x, m_Size.y});
}
@@ -61,10 +65,10 @@ void Player::Update(float elapsedTime, WorldLevel& level) {
});
for (std::pair<int, float> contact_time : contactTimes) {
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
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});
Collision::CollisionRect rect = world_tile->GetCollisionRect().getCollisionRect(); //TODO: fix this mess
Collision::ResolvePlayerVsRect(*this, elapsedTime, &rect);
}

View File

@@ -21,15 +21,13 @@ public:
void SetContactMap(Collision::CollisionDirection dir, WorldTile* tile) { m_ContactMap[dir] = tile; }
private:
Point2f m_Position{};
Point2f m_Size{};
Point2f m_Position;
Point2f m_Size;
Point2f m_Vel{};
Point2f m_Vel;
std::map<Collision::CollisionDirection, WorldTile*> m_ContactMap{};
std::map<Collision::CollisionDirection, WorldTile*> m_ContactMap;
Point2f m_Acc{};
Point2f m_Acc;
Point2f m_Gravity{ 0, -9.81f };
float m_MaxSpeed{ 200 };
};

View File

@@ -21,7 +21,8 @@ WorldLevel::WorldLevel(Camera* camera, Rectf viewport):
for (size_t x { 0 }; x < WORLD_WIDTH; ++x) {
for (size_t y { 0 }; y < WORLD_HEIGHT; ++y) {
int actualX = x - WORLD_WIDTH / 2;
m_worldTiles[x][y] = new WorldTile{ Point2f{ float(actualX * TILE_WIDTH), -float(y * TILE_HEIGHT) - TILE_HEIGHT}, GroundTileTypes::Dirt, TextureManager::GetInstance()};
Point2f pos = Point2f{ float(actualX * TILE_WIDTH), -float(y * TILE_HEIGHT) - TILE_HEIGHT};
m_worldTiles[x][y] = new WorldTile{ pos, GroundTileTypes::Dirt, TextureManager::GetInstance() };
}
}
@@ -125,6 +126,7 @@ void WorldLevel::ProcessImGui() {
if(m_ShowCameraWindow) {
ImGui::Begin("Camera", &m_ShowCameraWindow, ImGuiWindowFlags_AlwaysAutoResize);
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});
}