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 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) { 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 ); 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{}; 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); TileCollisionRect(const Point2f& pos, const Point2f& size, WorldTile* tile);
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 YELLOW{ 1.0f, 1.0f, 0.0f, 1.0f };
const Color4f MAGENTA{ 1.0f, 0.0f, 1.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 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() : m_Position { 0, 0 }, m_Scale { 1.0f } {
} }
Camera::Camera(const Point2f& position, const float scale) : m_Position { position }, m_Scale { scale } {
} Camera::Camera(const Point2f& position, float scale) : m_Position { position }, m_Scale { scale } {
Camera::~Camera() {
} }
void Camera::BeginRendering() const { void Camera::BeginRendering() const {
glPushMatrix(); glPushMatrix();
glTranslatef(m_Position.x, m_Position.y, 0); glTranslatef(m_Position.x, m_Position.y, 0);
@@ -17,7 +17,7 @@ void Camera::BeginRendering() const {
void Camera::EndRendering() const { void Camera::EndRendering() const {
glPopMatrix(); glPopMatrix();
} }
Point2f Camera::TransformMouse(const Point2f& mousePos) const { Point2f Camera::TransformMouse(const Point2f& mousePos) const {
const Point2f translatedPosition = Point2f{ mousePos.x - m_Position.x, Viewport.height - mousePos.y - m_Position.y}; return Point2f { mousePos.x - m_Position.x, Viewport.height - mousePos.y - m_Position.y };
return translatedPosition;
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -3,7 +3,7 @@
#include <iostream> #include <iostream>
Level::Level() : m_pCamera(nullptr) { 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) { Level::Level(Camera* camera) {
m_pCamera = camera; m_pCamera = camera;

View File

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

View File

@@ -7,15 +7,19 @@
#include "utils.h" #include "utils.h"
#include "WorldLevel.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 Player::GetCollisionRect() {
Collision::CollisionRect rect = {m_Position, m_Size, m_Vel}; Collision::CollisionRect rect = {m_Position, m_Size, m_Vel};
return rect; return rect;
} }
void Player::Draw() const { 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}); 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) { for (std::pair<int, float> contact_time : contactTimes) {
int x = contact_time.first % level.WORLD_WIDTH; int x = contact_time.first % WorldLevel::WORLD_WIDTH;
int y = contact_time.first / level.WORLD_WIDTH; int y = contact_time.first / WorldLevel::WORLD_WIDTH;
WorldTile* tile2 = level.GetTileAt(Point2f{(float) x, (float) y}); WorldTile* world_tile = level.GetTileAt(Point2f{(float) x, (float) y});
Collision::CollisionRect rect = tile2->GetCollisionRect().getCollisionRect(); //TODO: fix this mess Collision::CollisionRect rect = world_tile->GetCollisionRect().getCollisionRect(); //TODO: fix this mess
Collision::ResolvePlayerVsRect(*this, elapsedTime, &rect); Collision::ResolvePlayerVsRect(*this, elapsedTime, &rect);
} }

View File

@@ -21,15 +21,13 @@ public:
void SetContactMap(Collision::CollisionDirection dir, WorldTile* tile) { m_ContactMap[dir] = tile; } void SetContactMap(Collision::CollisionDirection dir, WorldTile* tile) { m_ContactMap[dir] = tile; }
private: private:
Point2f m_Position{}; Point2f m_Position;
Point2f m_Size{}; 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 }; 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 x { 0 }; x < WORLD_WIDTH; ++x) {
for (size_t y { 0 }; y < WORLD_HEIGHT; ++y) { for (size_t y { 0 }; y < WORLD_HEIGHT; ++y) {
int actualX = x - WORLD_WIDTH / 2; 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) { if(m_ShowCameraWindow) {
ImGui::Begin("Camera", &m_ShowCameraWindow, ImGuiWindowFlags_AlwaysAutoResize); ImGui::Begin("Camera", &m_ShowCameraWindow, ImGuiWindowFlags_AlwaysAutoResize);
ImGui::Text("Camera Position: (%f, %f)", m_pCamera->GetPosition().x, m_pCamera->GetPosition().y); 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")) { 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});
} }