Files
Leviathan/Client/Game/game/Interface/Skill/SUIAniJobLevelUpWnd.cpp
T
2026-06-01 12:46:52 +02:00

179 lines
5.1 KiB
C++

#include "stdafx.h"
/// 2010.12.02 - prodongi
#include "SUIAniJobLevelUpWnd.h"
#include "SUISkillWnd.h"
#include "SExpDB.h"
void sAniJobLevelUpData::init(float aniTime, sAniJobLevelUpWnd const& wndFrom,
sAniJobLevelUpWnd const& wndTo)
{
m_lenJLv = calcLength(wndFrom.m_posJLv, wndTo.m_posJLv);
m_lenJP = calcLength(wndFrom.m_posJP, wndTo.m_posJP);
/// 초기 속도는 등속 운동을 했을 때의 속도 절반으로 해준다
m_v0JLv = m_lenJLv/aniTime * 0.5f;
m_v0JP = m_lenJP/aniTime * 0.5f;
m_accel = 500.0f;
}
void sAniJobLevelUpData::begin()
{
m_lenLastJLv = 0.0f;
m_lenLastJP = 0.0f;
m_processT = 0.0f;
}
float sAniJobLevelUpData::calcLength(KPoint const& pos1, KPoint const& pos2)
{
double x = (double)(pos2.x - pos1.x);
double y = (double)(pos2.y - pos1.y);
return (float)sqrt(x*x + y*y);
}
void sAniJobLevelUpData::slerp(KPoint& pos, float t, KPoint const& posFrom, KPoint const& posTo)
{
if (t > 1.0f)
t = 1.0f;
pos.x = (int)((float)posFrom.x + (float)(posTo.x - posFrom.x) * t);
pos.y = (int)((float)posFrom.y + (float)(posTo.y - posFrom.y) * t);
}
bool sAniJobLevelUpData::procedure(float elapsedtime, SUISkillWnd const* skillWnd,
sAniJobLevelUpWnd& wndFrom, sAniJobLevelUpWnd const& wndTo)
{
m_processT += elapsedtime;
float s;
float s2 = 0.5f * m_accel * m_processT * m_processT;
s = m_v0JLv * m_processT + s2;
m_lenLastJLv = s;
s = m_v0JP * m_processT + s2;
m_lenLastJP = s;
KRect r;
KPoint offsetJLv, offsetJP;
slerp(offsetJLv, m_lenLastJLv/m_lenJLv, wndFrom.m_posJLv, wndTo.m_posJLv);
slerp(offsetJP, m_lenLastJP/m_lenJP, wndFrom.m_posJP, wndTo.m_posJP);
wndFrom.setWndPos(skillWnd->GetRect(), offsetJLv, offsetJP);
return (m_lenLastJLv < m_lenJLv);
}
void sAniJobLevelUpWnd::init(SUISkillWnd const* skillWnd, char const* jlvName, char const* jpName)
{
m_wndJLv = getChildWnd(skillWnd, jlvName, m_posJLv);
m_wndJP = getChildWnd(skillWnd, jpName, m_posJP);
}
KUIWnd* sAniJobLevelUpWnd::getChildWnd(SUISkillWnd const* skillWnd, char const* wndName, KPoint& pos)
{
KUIWnd* wnd = NULL;
wnd = skillWnd->GetChild(wndName);
(wnd) ? pos = KPoint(wnd->GetRect().left, wnd->GetRect().top) : assert(wnd && "failed find Job Level Up control");
return wnd;
}
void sAniJobLevelUpWnd::setInitPos(KRect const& parentRect)
{
if (m_wndJLv) m_wndJLv->MovePos(parentRect.left + m_posJLv.x, parentRect.top + m_posJLv.y);
if (m_wndJP) m_wndJP->MovePos(parentRect.left + m_posJP.x, parentRect.top + m_posJP.y);
}
void sAniJobLevelUpWnd::setWndPos(KRect const& parentRect, KPoint const& offsetJLv, KPoint const& offsetJP)
{
if (m_wndJLv) m_wndJLv->MovePos(parentRect.left + offsetJLv.x, parentRect.top + offsetJLv.y);
if (m_wndJP) m_wndJP->MovePos(parentRect.left + offsetJP.x, parentRect.top + offsetJP.y);
}
void sAniJobLevelUpWnd::setCaption(int level, int changeJob)
{
__int64 needJp = GetExpDB().GetNeedJp(level, changeJob);
if( needJp > 0 )
{
std::string strNeedJp;
jpToString( needJp, strNeedJp );
if (m_wndJLv) m_wndJLv->SetCaption(CStringUtil::StringFormat("<font:font_02><#707070><size:9><vcenter><left>%d", level).c_str());
if (m_wndJP) m_wndJP->SetCaption(CStringUtil::StringFormat("<font:font_02><#707070><size:9><vcenter><right>%s", strNeedJp.c_str()).c_str());
}
else
{
if (m_wndJLv) m_wndJLv->SetCaption("");
if (m_wndJP) m_wndJP->SetCaption("");
}
}
void sAniJobLevelUp::init(SUISkillWnd const* skillWnd)
{
m_state = END;
m_aniTime = 0.6f;
m_wndTop.init(skillWnd, "joblv_next_02", "jp_next_02");
m_wndNext.init(skillWnd, "joblv_next_01", "jp_next_01");
m_wndCur.init(skillWnd, "joblv_curjlv_01", "jp_curjlv_01");
m_wndPrev.init(skillWnd, "joblv_prev_01", "jp_prev_01");
m_wndBottom.init(skillWnd, "joblv_prev_02", "jp_prev_02");
m_topToNext.init(m_aniTime, m_wndTop, m_wndNext);
m_nextToCur.init(m_aniTime, m_wndNext, m_wndCur);
m_curToPrev.init(m_aniTime, m_wndCur, m_wndPrev);
m_prevToBottom.init(m_aniTime, m_wndPrev, m_wndBottom);
}
void sAniJobLevelUp::setState(int state, KRect const& parentRect)
{
m_state = state;
if (isState(BEGIN))
{
m_topToNext.begin();
m_nextToCur.begin();
m_curToPrev.begin();
m_prevToBottom.begin();
}
else if (isState(END))
{
setInitPos(parentRect);
}
}
void sAniJobLevelUp::setInitPos(KRect const& parentRect)
{
m_wndTop.setInitPos(parentRect);
m_wndNext.setInitPos(parentRect);
m_wndCur.setInitPos(parentRect);
m_wndPrev.setInitPos(parentRect);
m_wndBottom.setInitPos(parentRect);
}
bool sAniJobLevelUp::procedure(SUISkillWnd const* skillWnd, DWORD elapsedtime)
{
if (!isState(BEGIN))
return false;
float e_t = (float)elapsedtime/1000.0f;
bool ret = m_topToNext.procedure(e_t, skillWnd, m_wndTop, m_wndNext);
m_nextToCur.procedure(e_t, skillWnd, m_wndNext, m_wndCur);
m_curToPrev.procedure(e_t, skillWnd, m_wndCur, m_wndPrev);
m_prevToBottom.procedure(e_t, skillWnd, m_wndPrev, m_wndBottom);
_oprint("ani lv : %f, %f\n", m_topToNext.m_lenLastJLv, m_topToNext.m_processT);
if (!ret)
{
setState(END, skillWnd->GetRect());
return true;
}
return false;
}
void sAniJobLevelUp::setTopWndCaption(int level, int changeJob)
{
m_wndTop.setCaption(level+2, changeJob);
}