SpelunkyRemake / GroundTile.cpp
GroundTile.cpp
Raw
#include "pch.h"
#include "GroundTile.h"
#include "Item.h"
#include "Texture.h"

int GroundTile::m_Count{ 0 };

const int GroundTile::m_VariationsX{ 4 };
const int GroundTile::m_VariationsY{ 2 };

Texture* GroundTile::m_pTexture{ nullptr };

GroundTile::GroundTile(int x, int y, int itemType)
	: Tile(x, y, itemType)
	, m_Variation { m_Count }
{
	if (m_pTexture == nullptr)
	{
		m_pTexture = new Texture{ "Resources/Sprites/ground_tiles.png" };
	}

	m_Count++;
}

GroundTile::~GroundTile()
{
	m_Count--;

	if (m_Count == 0)
	{
		delete m_pTexture;
		m_pTexture = nullptr;
	}
}

void GroundTile::Init(Tile* pTiles[], int xTiles, int yTiles)
{
	UpdateBorder(pTiles, xTiles, yTiles);
}

void GroundTile::UpdateBorder(Tile* pTiles[], int xTiles, int yTiles)
{
	//top
	if (m_Y < (yTiles - 1))
	{
		if ((pTiles[utils::GetIdx(m_X, m_Y + 1, xTiles)] != nullptr) && (dynamic_cast<GroundTile*>(pTiles[utils::GetIdx(m_X, m_Y + 1, xTiles)]) != nullptr))
		{
			SetBorder(Direction::UP, false);
		}
		else
		{
			SetBorder(Direction::UP, true);
		}
	}

	//bottom
	if (m_Y > 0)
	{
		if ((pTiles[utils::GetIdx(m_X, m_Y - 1, xTiles)] != nullptr) && (dynamic_cast<GroundTile*>(pTiles[utils::GetIdx(m_X, m_Y - 1, xTiles)]) != nullptr))
		{
			SetBorder(Direction::DOWN, false);
		}
		else
		{
			SetBorder(Direction::DOWN, true);
		}
	}

	//left
	if (m_X > 0)
	{
		if ((pTiles[utils::GetIdx(m_X - 1, m_Y, xTiles)] != nullptr) && (dynamic_cast<GroundTile*>(pTiles[utils::GetIdx(m_X - 1, m_Y, xTiles)]) != nullptr))
		{
			SetBorder(Direction::LEFT, false);
		}
		else
		{
			SetBorder(Direction::LEFT, true);
		}
	}

	//right
	if (m_X < (xTiles - 1))
	{
		if ((pTiles[utils::GetIdx(m_X + 1, m_Y, xTiles)] != nullptr) && (dynamic_cast<GroundTile*>(pTiles[utils::GetIdx(m_X + 1, m_Y, xTiles)]) != nullptr))
		{
			SetBorder(Direction::RIGHT, false);
		}
		else
		{
			SetBorder(Direction::RIGHT, true);
		}
	}
}

void GroundTile::Draw() const
{
	Rectf srcRect{ m_Position.x, m_Position.y, m_Size, m_Size };

	//Draw tile
	m_pTexture->Draw(m_Position, Rectf{ m_Size * (m_Variation % 4), m_Size * (m_Variation % 2), m_Size, m_Size });
}

void GroundTile::DrawBorder() const
{
	if (m_DrawBorder[int(Direction::UP)]) m_pTexture->Draw(Point2f{ m_Position.x, m_Position.y + 28 }, Rectf{ m_Size * 5 + (m_Size * (m_Variation % 3)), m_Size, m_Size, m_Size });
	if (m_DrawBorder[int(Direction::DOWN)])	m_pTexture->Draw(Point2f{ m_Position.x, m_Position.y - 32 }, Rectf{ m_Size * 5 + (m_Size * (m_Variation % 2)), 0, m_Size, m_Size });
	if (m_DrawBorder[int(Direction::LEFT)])	m_pTexture->Draw(Point2f{ m_Position.x - 32, m_Position.y }, Rectf{ m_Size * 4, m_Size, m_Size, m_Size });
	if (m_DrawBorder[int(Direction::RIGHT)]) m_pTexture->Draw(Point2f{ m_Position.x + 32, m_Position.y }, Rectf{ m_Size * 4, 0, m_Size, m_Size });
}

void GroundTile::DrawItem() const
{
	Tile::DrawItem();
}