SpelunkyRemake / Item.cpp
Item.cpp
Raw
#include "pch.h"
#include "Item.h"
#include "Tile.h"
#include "Game.h"

const float Item::m_ClipWidth{ 80.f };
const float Item::m_ClipHeight{ 80.f };

const Vector2f Item::m_GravityAcceleration{ 0, -981.0f * 2 };
Texture* Item::m_pTextures{ nullptr };

int Item::m_Count{ 0 };

Item::Item(const Point2f& pos, float width, float height, const Rectf& srcRect, const Vector2f& hitboxMargin)
	: m_Hitbox { pos.x, pos.y, width, height }
	, m_SrcRect{ 0, 0, m_ClipWidth, m_ClipHeight }
	, m_Velocity{ }
	, m_Angle{ }
	, m_ActionState { ActionState::IDLE }
	, m_SpriteRect { 0, 0, 80, 80 }
	, m_HitboxMargin{ hitboxMargin }
{
	if (m_Count == 0)
	{
		m_pTextures = new Texture{ "Resources/Sprites/items.png" };
	}

	m_Count++;
}

Item::Item(int x, int y)
	: Item(Point2f{ x * Tile::m_Size, y * Tile::m_Size })
{

}

Item::Item(const Point2f& pos)
	: m_Hitbox{ pos.x, pos.y, 0, 0 }
	, m_SrcRect{ 0, 0, m_ClipWidth, m_ClipHeight }
	, m_Velocity{ }
	, m_Angle{ }
	, m_ActionState{ ActionState::IDLE }
	, m_SpriteRect{ 0, 0, 80, 80 }
{
	if (m_Count == 0)
	{
		m_pTextures = new Texture{ "Resources/Sprites/items.png" };
	}

	m_Count++;
}

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

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

void Item::CenterInTile()
{
	m_Hitbox.left += (Tile::m_Size - m_Hitbox.width) / 2;
}

Rectf& Item::GetHitbox()
{
	return m_Hitbox;
}

void Item::Update(float elapsedSec, const Level& level)
{
	if (m_ActionState != ActionState::HELD)
	{
		if (!level.IsOnGround(m_Hitbox)) m_Velocity += elapsedSec * m_GravityAcceleration;
		m_Hitbox.bottom += m_Velocity.y * elapsedSec;
		m_Hitbox.left += m_Velocity.x * elapsedSec;

		level.HandleCollision(m_Hitbox, m_Velocity);
	}

	switch (m_ActionState)
	{
	case ActionState::IDLE:
		break;
	default:
		break;
	}

	m_SpriteRect.left = m_Hitbox.left - m_HitboxMargin.x;
	m_SpriteRect.bottom = m_Hitbox.bottom - m_HitboxMargin.y;
}

void Item::Draw() const
{
	if (Game::DrawDebug)
	{
		//draw hitbox
		utils::SetColor(Color4f{ 1, 0, 0, 0.5f });
		utils::FillRect(m_Hitbox);
	}

	Rectf destRect{ -m_SpriteRect.width / 2, 0, m_SpriteRect.width, m_SpriteRect.height };

	glPushMatrix();
	glTranslatef(m_SpriteRect.left - destRect.left, m_SpriteRect.bottom, 0);

	//if (m_Direction == Direction::LEFT)
	//{
	//	glScalef(-1, 1, 1);
	//}

	m_pTextures->Draw(destRect, m_SrcRect);

	glPopMatrix();
}