Some more terrain painting

This commit is contained in:
Jan Mrna 2025-09-29 06:24:22 +02:00
parent b6d24da982
commit 1779fde397
7 changed files with 48 additions and 10 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -60,7 +60,7 @@ Sprite &Player::GetSprite() {
void Player::LoadResources() {
m_Sprite =
std::make_unique<Sprite>("resources/player.png", WorldPos{38.0f, 46.0f});
std::make_unique<Sprite>("resources/player.png", WorldPos{19.0f, 23.0f});
}
std::unique_ptr<Sprite> Player::m_Sprite;

View File

@ -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;
if (IsTilePosValid(tile_pos)) {
size_t row = static_cast<size_t>(tile_pos.x);
size_t col = static_cast<size_t>(tile_pos.y);
if (IsTilePosValid(tile_pos)) {
m_Tiles[row][col] = &tile_types.at(tile_type);
}
}
}
}
void Map::PaintRectangle(TilePos first_corner, TilePos second_corner, TileType tile_type)
{
std::initializer_list<int> xvals = {first_corner.x, second_corner.x};
std::initializer_list<int> 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<size_t>(tile_pos.x);
size_t col = static_cast<size_t>(tile_pos.y);
m_Tiles[row][col] = &tile_types.at(tile_type);
}
}
}
}

View File

@ -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<TilePos> GetNeighbors(TilePos center) const;
float GetCost(TilePos pos) const { return GetTileAt(pos)->cost; }

View File

@ -29,18 +29,36 @@ void PathFindingDemo::AddEntity(std::shared_ptr<Entity> 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<Player>();
m_Player->SetPosition(WorldPos{250.0f, 200.0f});
m_Player->SetPosition(m_Map.TileToWorld(TilePos{25, 20}));
m_Entities.push_back(m_Player);
}

View File

@ -7,7 +7,8 @@
// and we don't access tile_types that often, so it should be ok
const std::unordered_map<TileType, Tile> tile_types = {
{ TileType::GRASS, Tile{1.0, 0, 200, 0, 255}},
{ TileType::MUD, Tile{2.0, 100, 100, 100, 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}},
};

View File

@ -13,9 +13,10 @@ struct Tile {
enum class TileType {
GRASS,
MUD,
WOOD,
ROAD,
WATER,
WALL,
};
extern const std::unordered_map<TileType, Tile> tile_types;