diff --git a/cpp/resources/player.png b/cpp/resources/player.png index d313d39..5309a8a 100644 Binary files a/cpp/resources/player.png and b/cpp/resources/player.png differ diff --git a/cpp/src/entities.cpp b/cpp/src/entities.cpp index 0122f12..e3e0f50 100644 --- a/cpp/src/entities.cpp +++ b/cpp/src/entities.cpp @@ -60,7 +60,7 @@ Sprite &Player::GetSprite() { void Player::LoadResources() { m_Sprite = - std::make_unique("resources/player.png", WorldPos{38.0f, 46.0f}); + std::make_unique("resources/player.png", WorldPos{19.0f, 23.0f}); } std::unique_ptr Player::m_Sprite; diff --git a/cpp/src/map.cpp b/cpp/src/map.cpp index a9e5886..aa48775 100644 --- a/cpp/src/map.cpp +++ b/cpp/src/map.cpp @@ -104,12 +104,29 @@ void Map::PaintLine(TilePos start_tile, TilePos stop_tile, double width, TileTyp for (double t = 0; t < line_length; t += 1.0) { for (double ortho_t = 0; ortho_t < width; ortho_t += 0.1) { auto tile_pos = start + step * t + ortho * ortho_t; - size_t row = static_cast(tile_pos.x); - size_t col = static_cast(tile_pos.y); if (IsTilePosValid(tile_pos)) { + size_t row = static_cast(tile_pos.x); + size_t col = static_cast(tile_pos.y); m_Tiles[row][col] = &tile_types.at(tile_type); } } } } + +void Map::PaintRectangle(TilePos first_corner, TilePos second_corner, TileType tile_type) +{ + std::initializer_list xvals = {first_corner.x, second_corner.x}; + std::initializer_list yvals = {first_corner.y, second_corner.y}; + for (int x = std::min(xvals); x < std::max(xvals); x++) { + for (int y = std::min(yvals); y < std::max(yvals); y++) { + TilePos tile_pos{x,y}; + LOG_DEBUG("tile_pos = ", tile_pos); + if (IsTilePosValid(tile_pos)) { + size_t row = static_cast(tile_pos.x); + size_t col = static_cast(tile_pos.y); + m_Tiles[row][col] = &tile_types.at(tile_type); + } + } + } +} diff --git a/cpp/src/map.hpp b/cpp/src/map.hpp index 763ecf8..2be7b64 100644 --- a/cpp/src/map.hpp +++ b/cpp/src/map.hpp @@ -35,6 +35,7 @@ public: // methods for drawing on the map void PaintCircle(TilePos center, unsigned radius, TileType tile_type); void PaintLine(TilePos start, TilePos stop, double width, TileType tile_type); + void PaintRectangle(TilePos first_corner, TilePos second_corner, TileType tile_type); std::vector GetNeighbors(TilePos center) const; float GetCost(TilePos pos) const { return GetTileAt(pos)->cost; } diff --git a/cpp/src/pathfindingdemo.cpp b/cpp/src/pathfindingdemo.cpp index 39fe40e..63d51f2 100644 --- a/cpp/src/pathfindingdemo.cpp +++ b/cpp/src/pathfindingdemo.cpp @@ -29,18 +29,36 @@ void PathFindingDemo::AddEntity(std::shared_ptr e) { } void PathFindingDemo::CreateMap() { - // create the map + // lake m_Map.PaintCircle(TilePos{50, 50}, 10, TileType::WATER); m_Map.PaintCircle(TilePos{75, 100}, 50, TileType::WATER); + // river m_Map.PaintLine(TilePos{0,0}, TilePos{100,100}, 3.0, TileType::WATER); + // road m_Map.PaintLine(TilePos{17,6}, TilePos{100,6}, 5.0, TileType::ROAD); m_Map.PaintLine(TilePos{10,17}, TilePos{10,100}, 5.0, TileType::ROAD); m_Map.PaintLine(TilePos{20,10}, TilePos{10,20}, 5.0, TileType::ROAD); + // bridges + m_Map.PaintLine(TilePos{50,75}, TilePos{70,75}, 5.0, TileType::WOOD); + m_Map.PaintLine(TilePos{95,26}, TilePos{95,60}, 5.0, TileType::WOOD); + // island + m_Map.PaintRectangle(TilePos{70, 60}, TilePos{100,100}, TileType::GRASS); + // walls + m_Map.PaintLine(TilePos{71,60}, TilePos{90,60}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{77,67}, TilePos{100,67}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{71,60}, TilePos{71,75}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{72,73}, TilePos{95,73}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{95,73}, TilePos{95,90}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{71,81}, TilePos{71,100}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{72,81}, TilePos{90,81}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{89,87}, TilePos{89,100}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{84,81}, TilePos{84,96}, 1.0, TileType::WALL); + m_Map.PaintLine(TilePos{78,87}, TilePos{78,100}, 1.0, TileType::WALL); // add player m_Entities.clear(); m_Player = std::make_shared(); - m_Player->SetPosition(WorldPos{250.0f, 200.0f}); + m_Player->SetPosition(m_Map.TileToWorld(TilePos{25, 20})); m_Entities.push_back(m_Player); } diff --git a/cpp/src/tile.cpp b/cpp/src/tile.cpp index 1a85a1d..e8d5aa0 100644 --- a/cpp/src/tile.cpp +++ b/cpp/src/tile.cpp @@ -6,8 +6,9 @@ // we could use array here, but this is more explicit, // and we don't access tile_types that often, so it should be ok const std::unordered_map tile_types = { - { TileType::GRASS, Tile{1.0, 0, 200, 0, 255}}, - { TileType::MUD, Tile{2.0, 100, 100, 100, 255}}, - { TileType::ROAD, Tile{0.5, 20, 20, 20, 255}}, - { TileType::WATER, Tile{10.0, 0, 50, 200, 255}}, + { TileType::GRASS, Tile{1.0, 0, 200, 0, 255}}, + { TileType::WOOD, Tile{1.0, 132, 68, 0, 255}}, + { TileType::ROAD, Tile{0.5, 20, 20, 20, 255}}, + { TileType::WATER, Tile{10.0, 0, 50, 200, 255}}, + { TileType::WALL, Tile{1000.0, 144, 33, 0, 255}}, }; diff --git a/cpp/src/tile.hpp b/cpp/src/tile.hpp index c7d3535..c80f931 100644 --- a/cpp/src/tile.hpp +++ b/cpp/src/tile.hpp @@ -13,9 +13,10 @@ struct Tile { enum class TileType { GRASS, - MUD, + WOOD, ROAD, WATER, + WALL, }; extern const std::unordered_map tile_types;