#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("<#707070>%d", level).c_str()); if (m_wndJP) m_wndJP->SetCaption(CStringUtil::StringFormat("<#707070>%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); }