mirror of
https://github.com/HowestDAE/dae16-VerhulstBram.git
synced 2025-12-16 20:41:47 +01:00
142 lines
4.8 KiB
C++
142 lines
4.8 KiB
C++
#include "pch.h"
|
|
#include "WorldTile.h"
|
|
|
|
#include <iostream>
|
|
|
|
#include "Camera.h"
|
|
#include "colors.h"
|
|
#include "../TextureManager.h"
|
|
#include "utils.h"
|
|
#include "WorldGridManager.h"
|
|
|
|
|
|
|
|
|
|
GroundTileType* getRandomGroundTile() {
|
|
// Generate a random weight between 0 and the sum of weights
|
|
float sumWeights = 0.0f;
|
|
for (const auto& pair : GroundTileWeights) {
|
|
sumWeights += pair.second;
|
|
}
|
|
|
|
float randomWeight = static_cast<float>(rand()) / RAND_MAX * sumWeights;
|
|
|
|
// Find the corresponding ground tile type
|
|
float cumulativeWeight = 0.0f;
|
|
for (const auto& pair : GroundTileWeights) {
|
|
cumulativeWeight += pair.second;
|
|
if (randomWeight <= cumulativeWeight) {
|
|
return pair.first;
|
|
}
|
|
}
|
|
|
|
// This should never be reached if weights sum to 1.0
|
|
return Tiles::AIR; // Default value
|
|
}
|
|
WorldTile::WorldTile(const Vector2f& position, GroundTileType* groundTileType, TextureManager* pTextureManager, WorldGridManager* pGridManager) : m_Position { position }, m_GroundTileType { groundTileType }, m_pGridManager { pGridManager } {
|
|
// const std::string dirtPath = + "tiles/dirt/dirt" + std::to_string(utils::randRange(1, 5)) + ".png";
|
|
// m_pTexture = new Texture(dirtPath);
|
|
m_pTexture = pTextureManager->GetTexture(groundTileType->getPath());
|
|
|
|
m_SideTextures[TileDirection::TopLeft] = pTextureManager->GetTexture("tiles/dirt/sidepieces/topLeft.png");
|
|
m_SideTextures[TileDirection::TopRight] = pTextureManager->GetTexture("tiles/dirt/sidepieces/topRight.png");
|
|
m_SideTextures[TileDirection::BottomLeft] = pTextureManager->GetTexture("tiles/dirt/sidepieces/bottomLeft.png");
|
|
m_SideTextures[TileDirection::BottomRight] = pTextureManager->GetTexture("tiles/dirt/sidepieces/bottomRight.png");
|
|
|
|
m_SideTextures[TileDirection::TopMiddle] = pTextureManager->GetTexture("tiles/dirt/sidepieces/middleTop.png");
|
|
m_SideTextures[TileDirection::BottomMiddle] = pTextureManager->GetTexture("tiles/dirt/sidepieces/middleBottom.png");
|
|
m_SideTextures[TileDirection::MiddleLeft] = pTextureManager->GetTexture("tiles/dirt/sidepieces/middleLeft.png");
|
|
m_SideTextures[TileDirection::MiddleRight] = pTextureManager->GetTexture("tiles/dirt/sidepieces/middleRight.png");
|
|
|
|
|
|
m_pAllTexture = pTextureManager->GetTexture("tiles/dirt/sidepieces/all.png");
|
|
}
|
|
WorldTile::~WorldTile() {
|
|
delete m_pTexture;
|
|
}
|
|
void WorldTile::Draw() {
|
|
|
|
|
|
switch (m_GroundTileType->getType()) {
|
|
case GroundTileTypes::Air: {
|
|
//check if it's all around dirt
|
|
bool allDirt = true;
|
|
for (int i = 0; i < 8; i++) {
|
|
const WorldTile* tile = m_SurroundingTiles.GetTile(static_cast<TileDirection>(i));
|
|
if(tile != nullptr) { //Tile exists
|
|
const GroundTileTypes type = tile->GetTileType()->getType();
|
|
if(type != Tiles::DIRT->getType()) {
|
|
allDirt = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if(allDirt) {
|
|
m_pAllTexture->Draw(m_Position);
|
|
return;
|
|
}
|
|
if(*m_GroundTileType == Tiles::AIR) {
|
|
this->DrawSide(TileDirection::TopLeft);
|
|
this->DrawSide(TileDirection::TopRight);
|
|
this->DrawSide(TileDirection::BottomLeft);
|
|
this->DrawSide(TileDirection::BottomRight);
|
|
|
|
this->DrawSide(TileDirection::TopMiddle);
|
|
this->DrawSide(TileDirection::BottomMiddle);
|
|
this->DrawSide(TileDirection::MiddleLeft);
|
|
this->DrawSide(TileDirection::MiddleRight);
|
|
break;
|
|
}
|
|
|
|
}
|
|
case GroundTileTypes::Dirt:
|
|
case GroundTileTypes::Hard:
|
|
case GroundTileTypes::Stone:
|
|
case GroundTileTypes::Iron:
|
|
m_pTexture->Draw(m_Position);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
if (*m_GroundTileType != Tiles::AIR) {
|
|
m_pTexture->Draw(m_Position);
|
|
if (m_Hightlight) {
|
|
utils::SetColor(Colors::GREEN);
|
|
utils::FillRect(m_Position, 50, 50);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void WorldTile::Update(const Camera* camera) {
|
|
m_pGridManager->GetIndexFromPosition(m_Position);
|
|
m_SurroundingTiles = m_pGridManager->GetSurroundingTiles(this);
|
|
const Vector2f mouse_pos = camera->TransformMouse(Vector2f{utils::GetMousePos().x, 500 - utils::GetMousePos().y});
|
|
m_Hightlight = utils::IsPointInRect(mouse_pos, Rectf{GetCollisionRect().pos, GetCollisionRect().size});
|
|
}
|
|
Collision::TileCollisionRect WorldTile::GetCollisionRect() {
|
|
return Collision::TileCollisionRect { m_Position, GetSize(), ( this ) };
|
|
}
|
|
|
|
void WorldTile::DrawSide(const TileDirection& direction) {
|
|
const WorldTile* tile = m_SurroundingTiles.GetTile(direction);
|
|
if(tile != nullptr) {
|
|
const GroundTileTypes type = tile->GetTileType()->getType();
|
|
if(direction == TileDirection::BottomMiddle || direction == TileDirection::BottomLeft || direction == TileDirection::BottomRight) {
|
|
if(type == Tiles::Special::GRASS->getType() || type == Tiles::Special::HARD_LEFT->getType() || type == Tiles::Special::HARD_MIDDLE->getType() || type == Tiles::Special::HARD_RIGHT->getType()) {
|
|
//Fix for edges being renderd on grass / hard tiles
|
|
//TODO: Possible fix if i have time
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(type != Tiles::AIR->getType()) {
|
|
m_SideTextures[direction]->Draw(m_Position);
|
|
}
|
|
}
|
|
} |