diff --git a/DevAssets/ConvertTexture.py b/DevAssets/ConvertTexture.py new file mode 100644 index 0000000..cc45fbc --- /dev/null +++ b/DevAssets/ConvertTexture.py @@ -0,0 +1,30 @@ +import os +from PIL import Image + +def convert_to_32bit(file_path): + try: + # Open the image + image = Image.open(file_path) + + # Convert to 32-bit color depth + if image.mode != 'RGBA': + image = image.convert('RGBA') + + # Save the converted image + converted_file_path = file_path.replace('.png', '_32bit.png') + image.save(converted_file_path) + + print(f"Conversion complete for '{file_path}'. Saved as '{converted_file_path}'") + except Exception as e: + print(f"Error: {e}") + +if __name__ == "__main__": + script_directory = os.path.dirname(os.path.realpath(__file__)) + png_files = [f for f in os.listdir(script_directory) if f.lower().endswith('.png')] + + if not png_files: + print("No .png files found in the script directory.") + else: + for file_name in png_files: + file_path = os.path.join(script_directory, file_name) + convert_to_32bit(file_path) diff --git a/DevAssets/MapCount.psd b/DevAssets/MapCount.psd new file mode 100644 index 0000000..4fc932e Binary files /dev/null and b/DevAssets/MapCount.psd differ diff --git a/Engine/Engine.vcxproj b/Engine/Engine.vcxproj index 0674a54..458bc61 100644 --- a/Engine/Engine.vcxproj +++ b/Engine/Engine.vcxproj @@ -31,6 +31,7 @@ + @@ -95,9 +96,18 @@ - ..\Libraries\SDLTtf\SDL2_ttf-2.20.2\include;..\Libraries\SDLImage\SDL2_image-2.6.3\include;..\Libraries\SDLMixer\SDL2_mixer-2.6.3\include;..\Libraries\SDLMain\SDL2-2.26.3\include;$(IncludePath) + C:\Users\Bram\Desktop\Programming 2\Exam\dae16-VerhulstBram\Libraries\DearImGui;..\Libraries\SDLTtf\SDL2_ttf-2.20.2\include;..\Libraries\SDLImage\SDL2_image-2.6.3\include;..\Libraries\SDLMixer\SDL2_mixer-2.6.3\include;..\Libraries\SDLMain\SDL2-2.26.3\include;$(IncludePath) ..\Libraries\SDLTtf\SDL2_ttf-2.20.2\lib\x64;..\Libraries\SDL2_mixer-2.6.3\lib\x64;..\Libraries\SDLImage\SDL2_image-2.6.3\lib\x64;..\Libraries\SDLMain\SDL2-2.26.3\lib\x64;$(LibraryPath) + + C:\Users\Bram\Desktop\Programming 2\Exam\dae16-VerhulstBram\Libraries\DearImGui;$(VC_IncludePath);$(WindowsSDK_IncludePath); + + + C:\Users\Bram\Desktop\Programming 2\Exam\dae16-VerhulstBram\Libraries\DearImGui;$(VC_IncludePath);$(WindowsSDK_IncludePath); + + + C:\Users\Bram\Desktop\Programming 2\Exam\dae16-VerhulstBram\Libraries\DearImGui;$(VC_IncludePath);$(WindowsSDK_IncludePath); + Level3 diff --git a/Engine/Engine.vcxproj.filters b/Engine/Engine.vcxproj.filters index 0a0053e..e42a904 100644 --- a/Engine/Engine.vcxproj.filters +++ b/Engine/Engine.vcxproj.filters @@ -42,6 +42,144 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -77,5 +215,110 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + \ No newline at end of file diff --git a/Engine/colors.h b/Engine/colors.h new file mode 100644 index 0000000..73e7630 --- /dev/null +++ b/Engine/colors.h @@ -0,0 +1,16 @@ + +#include "structs.h" + +namespace Colors +{ + const Color4f WHITE{ 1.0f, 1.0f, 1.0f, 1.0f }; + const Color4f BLACK{ 0.0f, 0.0f, 0.0f, 1.0f }; + + const Color4f RED{ 1.0f, 0.0f, 0.0f, 1.0f }; + const Color4f GREEN{ 0.0f, 1.0f, 0.0f, 1.0f }; + const Color4f BLUE{ 0.0f, 0.0f, 1.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 CYAN{ 0.0f, 1.0f, 1.0f, 1.0f }; +} diff --git a/Engine/structs.cpp b/Engine/structs.cpp index a910871..bac8210 100644 --- a/Engine/structs.cpp +++ b/Engine/structs.cpp @@ -20,6 +20,21 @@ Point2f::Point2f() Point2f::Point2f(float x, float y) : x { x }, y { y } { } +Point2f Point2f::operator+(const Point2f& other) const { + return Point2f { x + other.x, y + other.y }; +} +Point2f Point2f::operator*(float other) const { + return Point2f { x * other, y * other }; +} +Point2f Point2f::operator*(const Point2f& other) const { + return Point2f { x * other.x, y * other.y }; +} +Point2f Point2f::operator*(int other) const { + return Point2f { x * float(other), y * float(other) }; +} +Point2f Point2f::operator/(float other) const { + return Point2f { x / other, y / other }; +} // Point2f::Point2f(int x, int y) // : x { (float)x }, y { (float)y } { diff --git a/Engine/structs.h b/Engine/structs.h index b885c0b..0d58e25 100644 --- a/Engine/structs.h +++ b/Engine/structs.h @@ -18,6 +18,13 @@ struct Point2f explicit Point2f( float x, float y ); //Point2f(int x, int y); //Stupid fix for it giving an error + //operator + Point2f operator+( const Point2f& other ) const; + Point2f operator*( float other ) const; + Point2f operator*( const Point2f& other ) const; + Point2f operator*( int other ) const; + Point2f operator/( float other ) const; + float x; float y; }; diff --git a/Engine/utils.cpp b/Engine/utils.cpp index 0673309..6472313 100644 --- a/Engine/utils.cpp +++ b/Engine/utils.cpp @@ -5,13 +5,17 @@ #include #include "utils.h" - #pragma region OpenGLDrawFunctionality void utils::SetColor( const Color4f& color ) { glColor4f( color.r, color.g, color.b, color.a ); } +void utils::ClearBackground( const Color4f& color ) { + glClearColor(color.r, color.g, color.b, color.a); + glClear(GL_COLOR_BUFFER_BIT); +} + void utils::DrawPoint( float x, float y, float pointSize ) { glPointSize( pointSize ); @@ -684,3 +688,7 @@ bool utils::IntersectRectLine(const Rectf& r, const Point2f& p1, const Point2f& } #pragma endregion CollisionFunctionality + +int utils::randRange(int min, int max) { + return min + rand() % (( max + 1 ) - min); +} diff --git a/Engine/utils.h b/Engine/utils.h index 230aca0..55509fd 100644 --- a/Engine/utils.h +++ b/Engine/utils.h @@ -9,6 +9,8 @@ namespace utils #pragma region OpenGLDrawFunctionality void SetColor( const Color4f& color ); + + void ClearBackground( const Color4f& color ); void DrawPoint( float x, float y, float pointSize = 1.0f ); void DrawPoint( const Point2f& p, float pointSize = 1.0f ); @@ -81,6 +83,7 @@ namespace utils bool IsPointOnLineSegment(const Point2f& p, const Point2f& a, const Point2f& b); bool IntersectRectLine(const Rectf& r, const Point2f& p1, const Point2f& p2, float& intersectMin, float& intersectMax); + int randRange(int min, int max); #pragma endregion CollisionFunctionality } \ No newline at end of file diff --git a/Game/Camera.cpp b/Game/Camera.cpp index b350b29..1a0b3d2 100644 --- a/Game/Camera.cpp +++ b/Game/Camera.cpp @@ -1,2 +1,21 @@ #include "pch.h" #include "Camera.h" + +Camera::Camera() : m_Position { 0, 0 }, m_Scale { 1.0f } { +} +Camera::Camera(const Point2f& position, const float scale) : m_Position { position }, m_Scale { scale } { +} + +void Camera::BeginRendering() const { + glPushMatrix(); + glTranslatef(m_Position.x, m_Position.y, 0); + glScalef(m_Scale, m_Scale, 1); +} + +void Camera::EndRendering() const { + glPopMatrix(); +} +Point2f Camera::TransformMouse(const Point2f& mousePos) const { + const Point2f translatedPosition = mousePos + m_Position; + return translatedPosition; +} diff --git a/Game/Camera.h b/Game/Camera.h index 7f10a0e..5b8d34b 100644 --- a/Game/Camera.h +++ b/Game/Camera.h @@ -3,8 +3,22 @@ class Camera { public: + Camera( ); + Camera( const Point2f& position, float scale = 1); + void SetPosition( const Point2f& position ) { m_Position = position; } + void SetScale( const float scale ) { m_Scale = scale; } + + const Point2f& GetPosition( ) const { return m_Position; } + float GetScale( ) const { return m_Scale; } + + void BeginRendering() const; + void EndRendering() const; + + Point2f TransformMouse (const Point2f& mousePos) const; + private: - - + Point2f m_Position; + float m_Scale; + }; diff --git a/Game/Game.cpp b/Game/Game.cpp index 1584c47..bf0e866 100644 --- a/Game/Game.cpp +++ b/Game/Game.cpp @@ -1,10 +1,12 @@ #include "pch.h" #include "Game.h" +#include "colors.h" #include "utils.h" +#include "WorldLevel.h" Game::Game(const Window& window) - : BaseGame { window } + : BaseGame { window }, m_Camera(Camera()), m_WorldLevel(WorldLevel(&m_Camera)) { Initialize(); } @@ -14,34 +16,42 @@ Game::~Game() { } void Game::Initialize() { - m_WorldLevel = WorldLevel(); + m_Camera.SetPosition(Point2f{GetViewPort().width / 2, GetViewPort().height / 2}); } void Game::Cleanup() { } void Game::Update(float elapsedSec) { - const Uint8 *pStates = SDL_GetKeyboardState( nullptr ); - if ( pStates[SDL_SCANCODE_RIGHT] ) { - m_CameraOffset.x += 100 * 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_IsMouseDown) { + Point2f newCameraPos = m_MousePos + m_MouseOffset; + m_Camera.SetPosition(newCameraPos); + } else { + m_MouseOffset = m_Camera.GetPosition(); } - if ( pStates[SDL_SCANCODE_LEFT] ) { - m_CameraOffset.x -= 100 * elapsedSec; - } - - + + } void Game::Draw() const { - ClearBackground(); - glPushMatrix(); - { - glTranslatef(m_CameraOffset.x , m_CameraOffset.y, 0); - m_WorldLevel.Draw(); - utils::SetColor(Color4f{1.0f, 0.0f, 0.0f, 1.0f}); - utils::FillEllipse(0,0,20,20); - } - glPopMatrix(); + utils::ClearBackground(Color4f(0.0f, 0.0f, 0.3f, 1.0f)); + //m_Camera.BeginRendering(); + m_WorldLevel.Draw(); + //m_Camera.EndRendering(); } void Game::ProcessKeyDownEvent(const SDL_KeyboardEvent& e) { @@ -66,10 +76,15 @@ void Game::ProcessKeyUpEvent(const SDL_KeyboardEvent& e) { } void Game::ProcessMouseMotionEvent(const SDL_MouseMotionEvent& e) { - //std::cout << "MOUSEMOTION event: " << e.x << ", " << e.y << std::endl; + m_MousePos = Point2f { float(e.x), float(e.y) }; + m_WorldLevel.MouseMove(m_MousePos); } void Game::ProcessMouseDownEvent(const SDL_MouseButtonEvent& e) { + m_IsMouseDown = true; + m_MouseOffset = Point2f(m_Camera.GetPosition() - m_MousePos); + + //std::cout << "MOUSEBUTTONDOWN event: "; //switch ( e.button ) //{ @@ -87,6 +102,7 @@ void Game::ProcessMouseDownEvent(const SDL_MouseButtonEvent& e) { } void Game::ProcessMouseUpEvent(const SDL_MouseButtonEvent& e) { + m_IsMouseDown = false; //std::cout << "MOUSEBUTTONUP event: "; //switch ( e.button ) //{ @@ -101,8 +117,3 @@ void Game::ProcessMouseUpEvent(const SDL_MouseButtonEvent& e) { // break; //} } - -void Game::ClearBackground() const { - glClearColor(0.0f, 0.0f, 0.3f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); -} diff --git a/Game/Game.h b/Game/Game.h index 24109f3..4f8c095 100644 --- a/Game/Game.h +++ b/Game/Game.h @@ -2,6 +2,7 @@ #include #include "BaseGame.h" +#include "Camera.h" #include "WorldLevel.h" #include "WorldTile.h" @@ -30,9 +31,13 @@ private: // FUNCTIONS void Initialize(); void Cleanup(); - void ClearBackground() const; - Point2f m_CameraOffset{0, 0}; + Camera m_Camera; WorldLevel m_WorldLevel; + + Point2f m_MousePos{}; + Point2f m_MouseOffset{}; + bool m_IsMouseDown{}; + }; diff --git a/Game/Game.vcxproj b/Game/Game.vcxproj index fce32a7..d31bc6f 100644 --- a/Game/Game.vcxproj +++ b/Game/Game.vcxproj @@ -149,10 +149,158 @@ xcopy "$(SolutionDir)Resources\*.*" "$(TargetDir)" /y /d /s - + + MultiThreadedDebugDll + EnableFastChecks + Disabled + true + NoListing + x64\Debug\ + false + false + x64\Debug\ + Default + true + Column + false + Prompt + false + Sync + false + false + false + NotSet + Precise + true + false + false + false + Default + false + false + Default + Default + false + x64\Debug\ + x64\Debug\ + false + Neither + false + x64\Debug\ + Cdecl + x64\Debug\vc143.pdb + Create + pch.h + x64\Debug\Game.pch + false + false + false + true + false + false + x64\Debug\ + true + true + false + false + Default + x64\Debug\Game.tlog\ + false + true + false + true + true + Level3 + x64\Debug\ + EditAndContinue + false + false + false + InheritWarningLevel + true + false + _DEBUG;_CONSOLE;_UNICODE;UNICODE; + true + true + - + + + + MultiThreadedDebugDll + EnableFastChecks + Disabled + true + NoListing + x64\Debug\ + false + false + x64\Debug\ + Default + true + Column + false + Prompt + false + Sync + false + false + false + NotSet + Precise + true + false + false + false + Default + false + false + Default + Default + false + x64\Debug\ + x64\Debug\ + false + Neither + false + x64\Debug\ + Cdecl + x64\Debug\vc143.pdb + Create + pch.h + x64\Debug\Game.pch + false + false + false + true + false + false + x64\Debug\ + true + true + false + false + Default + x64\Debug\Game.tlog\ + false + true + false + true + true + Level3 + x64\Debug\ + EditAndContinue + false + false + false + InheritWarningLevel + true + false + _DEBUG;_CONSOLE;_UNICODE;UNICODE; + true + true + @@ -160,9 +308,14 @@ xcopy "$(SolutionDir)Resources\*.*" "$(TargetDir)" /y /d /s + + + + + diff --git a/Game/Game.vcxproj.filters b/Game/Game.vcxproj.filters index 8287ec7..b721d5b 100644 --- a/Game/Game.vcxproj.filters +++ b/Game/Game.vcxproj.filters @@ -24,6 +24,93 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -32,5 +119,104 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + \ No newline at end of file diff --git a/Game/Level.cpp b/Game/Level.cpp index fcc8b14..2b9f4da 100644 --- a/Game/Level.cpp +++ b/Game/Level.cpp @@ -1,6 +1,12 @@ #include "pch.h" #include "Level.h" -Level::Level() { + +#include +Level::Level() : m_pCamera(nullptr) { + std::cout << "Cannot make level without a camera" << std::endl; +} +Level::Level(Camera* camera) { + m_pCamera = camera; } Level::~Level() { } @@ -8,3 +14,5 @@ void Level::Update(float elapsedSec) { } void Level::Draw() const { } +void Level::MouseMove(const Point2f& mousePos) { +} diff --git a/Game/Level.h b/Game/Level.h index 0aa6f70..42e9615 100644 --- a/Game/Level.h +++ b/Game/Level.h @@ -1,16 +1,19 @@ #pragma once +#include "Camera.h" class Level { public: Level(); - ~Level(); - + Level(Camera* camera); + virtual ~Level(); virtual void Update(float elapsedSec); virtual void Draw() const; + virtual void MouseMove(const Point2f& mousePos); private: - - + +protected: + Camera* m_pCamera; }; diff --git a/Game/Player.cpp b/Game/Player.cpp new file mode 100644 index 0000000..9708f2d --- /dev/null +++ b/Game/Player.cpp @@ -0,0 +1,45 @@ +#include "pch.h" +#include "Player.h" + +#include "colors.h" +#include "utils.h" +#include "WorldLevel.h" + +Player::Player(const Point2f& Position) : m_Position(Position), m_Size(Point2f{50, 20}) +{} + +void Player::Draw() const { + utils::SetColor(Colors::RED); + utils::DrawRect(Rectf{m_Position.x, m_Position.y, m_Size.x, m_Size.y}); +} + +void Player::Update(float elapsedTime, const WorldLevel& level) { + Point2f acc{0, 0}; + acc.y += m_Gravity.y; + + Point2f nextPos = m_Position + m_Vel * elapsedTime * acc * elapsedTime * elapsedTime; + //collision checking + auto tiles = level.GetAllTiles(); + for (int x{0}; x < WorldLevel::WORLD_WIDTH; ++x) { + for (int y{0}; y < WorldLevel::WORLD_HEIGHT; ++y) { + WorldTile* tile = tiles[x][y]; + if (tile->GetTileType() == GroundTileTypes::Dirt) { + Rectf tileRect = Rectf{tile->GetPosition().x, tile->GetPosition().y, WorldLevel::TILE_WIDTH, WorldLevel::TILE_HEIGHT}; + if (utils::IsOverlapping(nextPos, m_Size, tileRect)) { + //collision + if (m_Vel.y < 0) { + //collision from above + m_Position.y = tileRect.bottom; + m_Vel.y = 0; + } else { + m_Position.y = tileRect.bottom + m_Size.y; + m_Vel.y = 0; + } + } + } + } + } + m_Vel = Point2f{m_Vel.x + float(acc.x * elapsedTime), m_Vel.y + float(acc.y * elapsedTime)}; + // m_Position += m_Vel * elapsedTime; + m_Position = Point2f{m_Position.x + m_Vel.x * elapsedTime, m_Position.y + m_Vel.y * elapsedTime}; +} \ No newline at end of file diff --git a/Game/Player.h b/Game/Player.h new file mode 100644 index 0000000..ff152f3 --- /dev/null +++ b/Game/Player.h @@ -0,0 +1,22 @@ +#pragma once + +class WorldLevel; +class Player +{ +public: + + Player(const Point2f& Position); + void Update(float elapsedTime, const WorldLevel& level); + void Draw() const; + +private: + Point2f m_Position{}; + Point2f m_Size{}; + + Point2f m_Vel{}; + + Point2f m_Acc{}; + Point2f m_Gravity{ 0, -9.81f }; + float m_MaxSpeed{ 200 }; + +}; diff --git a/Game/TextureManager.cpp b/Game/TextureManager.cpp new file mode 100644 index 0000000..7feb2c3 --- /dev/null +++ b/Game/TextureManager.cpp @@ -0,0 +1,2 @@ +#include "pch.h" +#include "TextureManager.h" diff --git a/Game/TextureManager.h b/Game/TextureManager.h new file mode 100644 index 0000000..73680d7 --- /dev/null +++ b/Game/TextureManager.h @@ -0,0 +1,7 @@ +#pragma once + +class TextureManager +{ +public: + +}; diff --git a/Game/WorldLevel.cpp b/Game/WorldLevel.cpp index c0b872d..549e778 100644 --- a/Game/WorldLevel.cpp +++ b/Game/WorldLevel.cpp @@ -1,25 +1,72 @@ #include "pch.h" #include "WorldLevel.h" +#include +#include + +#include "colors.h" #include "utils.h" -WorldLevel::WorldLevel() { - for (int i{ 0 }; i < 10; ++i) { - for (int j{ 0 }; j < 10; ++j) { - m_WorldTiles[i][j] = WorldTile{ Point2f{ (float)i * 50, (float)j * 50 }, GroundTileTypes::Dirt }; - } - } -} -WorldLevel::~WorldLevel() { -} -void WorldLevel::Update(float elapsedSec) { -} -void WorldLevel::Draw() const { - for (int i{ 0 }; i < 10; ++i) { - for (int j{ 0 }; j < 10; ++j) { - utils::SetColor(Color4f{ 0.5f, 0.5f, 0.5f, 1.0f }); - utils::FillRect(m_WorldTiles[i][j].GetPosition().x, m_WorldTiles[i][j].GetPosition().y, 50, 50); + +WorldLevel::WorldLevel(Camera* camera) : Level(camera), m_mousePos{ 0, 0 }, m_player(Player{ Point2f{ 0, 100 } }) { + // The grid is 34 x 50 big, the top center is 0,0 in world coords + 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}; } } + // std::string dirtPath = + "tiles/dirt/dirt" + std::to_string(utils::randRange(1, 5)) + ".png"; + // m_pTextTexture = new Texture(dirtPath); } +WorldLevel::~WorldLevel() { + //delete m_pTextTexture; + +} +void WorldLevel::Update(float elapsedSec) { + int mouseX, mouseY; + SDL_GetMouseState(&mouseX, &mouseY); + m_mousePos = Point2f{ float(mouseX), float(mouseY) }; + m_player.Update(elapsedSec, *this); + + +} +void WorldLevel::Draw() const { + m_pCamera->BeginRendering(); + + for (size_t x { 0 }; x < WORLD_WIDTH; ++x) { + for (size_t y { 0 }; y < WORLD_HEIGHT; ++y) { + m_worldTiles[x][y]->Draw(); + } + } + + utils::SetColor(Colors::WHITE); + for (int x { -100 }; x < 100; ++x) { + for (int y { -100 }; y < 100; ++y) { + utils::DrawLine(x * 50, -5000, x * 50, 50000); + utils::DrawLine(-5000, y * 50, 50000, y * 50); + } + } + utils::SetColor(Colors::MAGENTA); + utils::FillEllipse(0, 0, 10, 10); + + m_player.Draw(); + m_pCamera->EndRendering(); + + //utils::SetColor(Colors::WHITE); + //m_pTextTexture->Draw(Point2f{ 0, 0 }); + +} +void WorldLevel::MouseMove(const Point2f& mousePos) { + m_mousePos = mousePos; +} +WorldTile* WorldLevel::GetTileAt(const Point2f& pos) const { + return nullptr; +} +void WorldLevel::SetTileAt(const Point2f& pos, WorldTile* tile) { +} +std::array, WorldLevel::WORLD_HEIGHT> WorldLevel::GetAllTiles() const { + return m_worldTiles; +} + diff --git a/Game/WorldLevel.h b/Game/WorldLevel.h index 62760b5..4d5b060 100644 --- a/Game/WorldLevel.h +++ b/Game/WorldLevel.h @@ -1,17 +1,41 @@ #pragma once #include "Level.h" +#include "Texture.h" +#include "WorldLevel.h" #include "WorldTile.h" +#include + +#include "Player.h" + class WorldLevel : public Level { public: - WorldLevel(); - ~WorldLevel(); + static const int WORLD_WIDTH = 34; + static const int WORLD_HEIGHT = 34; + + static const int TILE_WIDTH = 50; + static const int TILE_HEIGHT = 50; + + WorldLevel(Camera* camera); + ~WorldLevel() override; void Update(float elapsedSec) override; void Draw() const override; + void MouseMove(const Point2f& mousePos) override; + + WorldTile* GetTileAt(const Point2f& pos) const; + void SetTileAt(const Point2f& pos, WorldTile* tile); + + std::array, WORLD_HEIGHT> GetAllTiles() const; + + + private: - WorldTile m_WorldTiles[10][10]; - + + std::array, WORLD_HEIGHT> m_worldTiles; + + Player m_player; + Point2f m_mousePos{}; }; diff --git a/Game/WorldTile.cpp b/Game/WorldTile.cpp index 56e4733..d2ed95a 100644 --- a/Game/WorldTile.cpp +++ b/Game/WorldTile.cpp @@ -1,14 +1,21 @@ #include "pch.h" #include "WorldTile.h" - #include "utils.h" + WorldTile::WorldTile() { + } WorldTile::WorldTile(const Point2f& position, GroundTileTypes groundTileType) : m_Position { position }, m_GroundTileType { groundTileType } { + const std::string dirtPath = + "tiles/dirt/dirt" + std::to_string(utils::randRange(1, 5)) + ".png"; + m_pTexture = new Texture(dirtPath); +} +WorldTile::~WorldTile() { + delete m_pTexture; } void WorldTile::Draw() const { if (m_GroundTileType != GroundTileTypes::Air) { - utils::SetColor(Color4f{ 0.5f, 0.5f, 0.5f, 1.0f}); - utils::FillRect(m_Position.x, m_Position.y, 50, 50); + m_pTexture->Draw(m_Position); + //utils::SetColor(Color4f{ 0.5f, 0.5f, 0.5f, 1.0f}); + //utils::FillRect(m_Position.x, m_Position.y, 50, 50); } } diff --git a/Game/WorldTile.h b/Game/WorldTile.h index 50eb0b5..f72c21f 100644 --- a/Game/WorldTile.h +++ b/Game/WorldTile.h @@ -1,4 +1,5 @@ #pragma once +#include "Texture.h" enum class GroundTileTypes { @@ -10,16 +11,25 @@ class WorldTile { public: WorldTile(); WorldTile(const Point2f& position, GroundTileTypes groundTileType); + ~WorldTile(); void Draw() const; Point2f GetPosition() const { return m_Position; } void SetPosition(const Point2f& position) { m_Position = position; } + + Point2f GetSize() const { return Point2f{ 50, 50 }; } + + GroundTileTypes GetTileType() const { return m_GroundTileType; } + private: Point2f m_Position; GroundTileTypes m_GroundTileType; + + Texture* m_pTexture; + }; diff --git a/Game/main.cpp b/Game/main.cpp index 6315191..4adf2b0 100644 --- a/Game/main.cpp +++ b/Game/main.cpp @@ -6,7 +6,8 @@ void StartHeapControl(); void DumpMemoryLeaks(); -int SDL_main(int argv, char** args) { +int SDL_main(int argv, char** args) +{ srand(static_cast(time(nullptr))); StartHeapControl(); diff --git a/Prog2Engine.sln b/Prog2Engine.sln index 53a6c2f..2fd6507 100644 --- a/Prog2Engine.sln +++ b/Prog2Engine.sln @@ -6,6 +6,9 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Engine", "Engine\Engine.vcxproj", "{5ADAB721-CB6C-4EF5-89EB-20EC51A13CFC}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Game", "Game\Game.vcxproj", "{0F40114E-3E0C-4195-B425-91FD5EF586AD}" + ProjectSection(ProjectDependencies) = postProject + {5ADAB721-CB6C-4EF5-89EB-20EC51A13CFC} = {5ADAB721-CB6C-4EF5-89EB-20EC51A13CFC} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Resources/VisualStudioBad.png b/Resources/VisualStudioBad.png new file mode 100644 index 0000000..be94a82 Binary files /dev/null and b/Resources/VisualStudioBad.png differ diff --git a/Resources/test.png b/Resources/test.png new file mode 100644 index 0000000..ad19d72 Binary files /dev/null and b/Resources/test.png differ diff --git a/Resources/tiles/dirt/ConvertTexture.py b/Resources/tiles/dirt/ConvertTexture.py new file mode 100644 index 0000000..cc45fbc --- /dev/null +++ b/Resources/tiles/dirt/ConvertTexture.py @@ -0,0 +1,30 @@ +import os +from PIL import Image + +def convert_to_32bit(file_path): + try: + # Open the image + image = Image.open(file_path) + + # Convert to 32-bit color depth + if image.mode != 'RGBA': + image = image.convert('RGBA') + + # Save the converted image + converted_file_path = file_path.replace('.png', '_32bit.png') + image.save(converted_file_path) + + print(f"Conversion complete for '{file_path}'. Saved as '{converted_file_path}'") + except Exception as e: + print(f"Error: {e}") + +if __name__ == "__main__": + script_directory = os.path.dirname(os.path.realpath(__file__)) + png_files = [f for f in os.listdir(script_directory) if f.lower().endswith('.png')] + + if not png_files: + print("No .png files found in the script directory.") + else: + for file_name in png_files: + file_path = os.path.join(script_directory, file_name) + convert_to_32bit(file_path) diff --git a/Resources/tiles/dirt/dirt1.png b/Resources/tiles/dirt/dirt1.png new file mode 100644 index 0000000..4e20132 Binary files /dev/null and b/Resources/tiles/dirt/dirt1.png differ diff --git a/Resources/tiles/dirt/dirt2.png b/Resources/tiles/dirt/dirt2.png new file mode 100644 index 0000000..88f5a70 Binary files /dev/null and b/Resources/tiles/dirt/dirt2.png differ diff --git a/Resources/tiles/dirt/dirt3.png b/Resources/tiles/dirt/dirt3.png new file mode 100644 index 0000000..4684796 Binary files /dev/null and b/Resources/tiles/dirt/dirt3.png differ diff --git a/Resources/tiles/dirt/dirt4.png b/Resources/tiles/dirt/dirt4.png new file mode 100644 index 0000000..565abeb Binary files /dev/null and b/Resources/tiles/dirt/dirt4.png differ diff --git a/Resources/tiles/dirt/dirt5.png b/Resources/tiles/dirt/dirt5.png new file mode 100644 index 0000000..f94884b Binary files /dev/null and b/Resources/tiles/dirt/dirt5.png differ