Files
2026-06-01 12:46:52 +02:00

149 lines
3.7 KiB
C++

#include "stdafx.h"
#include "KResourceManager.h"
#include "KUIControlChaosGauge.h"
#include "KViewport.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlChaosGauge Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* Creator()
{
return new KUIControlChaosGauge;
}
bool bRegister = KUIFactory::GetInstance()->RegisterCreator( Creator, "chaos_gauge");
const size_t TOTAL_GAUGE_COUNT = 11;
const float TOTAL_PERCENT = 100.f;
const float PERCENT_PER_ONE_GAGUE = TOTAL_PERCENT / TOTAL_GAUGE_COUNT;
size_t X_OFFSET = 3;
size_t X_MARGIN = 5;
size_t Y_MARGIN = 4;
LPCSTR BACK_NAME = "static_inventory_chaosback01";
}
KUIControlChaosGauge::KUIControlChaosGauge()
{
for(size_t i = 0; i < TOTAL_GAUGE_COUNT; ++i)
{
_registerSprite(&m_prSprite[i]);
}
_registerSprite(&m_prBackGround);
m_curPercent = 0;
}
KUIControlChaosGauge::~KUIControlChaosGauge()
{
}
void KUIControlChaosGauge::SetPercent(size_t percent)
{
m_curPercent = std::min(static_cast<size_t>(100),percent);
_UpdateSpriteRes();
#ifdef _KUI_INVALIDATION
// { [sonador]
InvalidateWnd();
// }
#endif
}
void KUIControlChaosGauge::OnPosChangeNofity(int xOffset, int yOffset)
{
KUIControl::OnPosChangeNofity(xOffset,yOffset);
m_ClipForLast.left += xOffset; m_ClipForLast.right += xOffset;
m_ClipForLast.top += yOffset; m_ClipForLast.bottom += yOffset;
}
void KUIControlChaosGauge::OnClipChangeNotify(const KRect& rcClipRect)
{
KUIControl::OnClipChangeNotify(rcClipRect);
if(m_curNumberOfRender > 0)
m_prSprite[m_curNumberOfRender - 1].SetClipRect(&m_ClipForLast);
}
void KUIControlChaosGauge::Render(KViewportObject * pViewport, bool isFront)
{
if(false == m_bShowFlag)
return;
pViewport->Register(&m_prBackGround, isFront);
for(size_t i = 0; i < m_curNumberOfRender; ++i)
{
pViewport->Register(&m_prSprite[i], isFront);
}
}
void KUIControlChaosGauge::_initControl()
{
if( m_sAniName.empty() )
return;
KResSprite* pBackFrame = _getSpriteSet()->GetSpriteRes(BACK_NAME, 0);
assert(pBackFrame&& "Cannot find Sprite Res Frame");
m_rcRegion.right = m_rcRegion.left + pBackFrame->GetSizeX();
m_rcRegion.bottom = m_rcRegion.top + pBackFrame->GetSizeY();
m_prBackGround.SetRes(pBackFrame);
m_prBackGround.SetPosition( m_rcRegion.left, m_rcRegion.top, m_fZPos);
KResSprite* pFrame = _getSpriteSet()->GetSpriteRes( m_sAniName.c_str(), 0);
assert(pFrame && "Cannot find Sprite Res Frame");
m_xSize = pFrame->GetSizeX();
m_fSizePerPercent = static_cast<float>(m_xSize) / ( TOTAL_PERCENT / TOTAL_GAUGE_COUNT );
for(size_t i = 0; i < TOTAL_GAUGE_COUNT; ++i)
{
m_prSprite[i].SetRes(pFrame);
m_prSprite[i].SetPosition(m_rcRegion.left + (m_xSize + X_MARGIN)* i + X_OFFSET, m_rcRegion.top + Y_MARGIN,m_fZPos);
m_prSprite[i].SetClipRect(&m_rcRegion);
}
_UpdateSpriteRes();
}
void KUIControlChaosGauge::_UpdateSpriteRes()
{
m_curNumberOfRender = m_curPercent / PERCENT_PER_ONE_GAGUE;
float fModulation = static_cast<float>(m_curPercent )- static_cast<float>(m_curNumberOfRender) * PERCENT_PER_ONE_GAGUE;
for(size_t i = 0; i < m_curNumberOfRender; ++i)
{
m_prSprite[i].SetClipRect(&m_rcRegion);
}
if(fModulation > 0.f)
{
K3DVector vPos = m_prSprite[m_curNumberOfRender].GetPosition();
m_ClipForLast = KRect(vPos.x, vPos.y, vPos.x + m_fSizePerPercent * fModulation, vPos.y + m_rcRegion.GetWidth() );
m_prSprite[m_curNumberOfRender].SetClipRect(&m_ClipForLast);
}
// 마지막에 짤린걸 찍어줘야 하므로
m_curNumberOfRender = std::min(m_curNumberOfRender + 1, TOTAL_GAUGE_COUNT);
#ifdef _KUI_INVALIDATION
// { [sonador]
InvalidateWnd();
// }
#endif
}