⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canimationmanager.cpp

📁 墨香完整原代码 C++ 值得研究 可以编译
💻 CPP
字号:
// cAnimationManager.cpp: implementation of the cAnimationManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "cAnimationManager.h"
#include "cWindow.h"
#include "cDialog.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ANISHAKEVECTOR normallShake[] =
{
	{	0.f,	10.f,	50	},
	{	0.f,	-10.f,	50	},
	{	0.f,	20.f,	50	},
	{	0.f,	-20.f,	50	},
	{	0.f,	15.f,	50	},
	{	0.f,	-15.f,	50	},
	{	0.f,	10.f,	50	},
	{	0.f,	-10.f,	50	},
	{	0.f,	5.f,	50	},
	{	0.f,	-5.f,	50	},
	{	0.f,	2.f,	50	},
	{	0.f,	-2.f,	50	},
	{	0.f,	1.f,	50	},
	{	0.f,	-1.f,	50	},
};
ANISHAKEVECTOR normall2Shake[] =
{
	{	0.f,	10.f,	30	},
	{	0.f,	-10.f,	30	},
	{	0.f,	20.f,	30	},
	{	0.f,	-20.f,	30	},
	{	0.f,	15.f,	30	},
	{	0.f,	-15.f,	30	},
	{	0.f,	10.f,	30	},
	{	0.f,	-10.f,	30	},
	{	0.f,	5.f,	30	},
	{	0.f,	-5.f,	30	},
	{	0.f,	2.f,	30	},
	{	0.f,	-2.f,	50	},
	{	0.f,	1.f,	50	},
	{	0.f,	-1.f,	50	},
};
WORD cAnimationManager::MAG_GAB = 10;
ANISHAKEINFO cAnimationManager::m_SHAKEMODE[];
cAnimationManager::cAnimationManager()
{
	m_OrgX					= 0;
	m_OrgY					= 0;	
	m_CurIdx				= 0;
	m_dwLastShakingPosChangedTime	= 0;
	m_bShaking				= FALSE;
	m_pWindow				= NULL;
}

GLOBALTON(cAnimationManager);
cAnimationManager::~cAnimationManager()
{
	EndFadeAll();
}
void cAnimationManager::Init()
{
	m_SHAKEMODE[SHAKE_NORMAL_TYPE].SetParam(normallShake, sizeof(normallShake)/sizeof(ANISHAKEVECTOR));
	m_SHAKEMODE[SHAKE_NORMAL2_TYPE].SetParam(normall2Shake, sizeof(normall2Shake)/sizeof(ANISHAKEVECTOR));
}
void cAnimationManager::RollBack()
{
	m_bShaking = FALSE;
	if( m_pWindow )
	{
		m_pWindow->SetAbsXY(m_OrgX, m_OrgY);
		m_pWindow = NULL;
	}
}
void cAnimationManager::StartShake(ESHAKETYPE shakeType, cWindow * window)
{
	RollBack();

	m_shakeType = shakeType;
	m_OrgX		= (long)window->GetAbsX();
	m_OrgY		= (long)window->GetAbsY();
	m_CurIdx	= 0;
	m_pWindow	= window;
	m_bShaking	= TRUE;
	m_dwLastShakingPosChangedTime = gCurTime;
}

void cAnimationManager::ShakeProcess()
{
	if(!m_bShaking) return;

	ANISHAKEVECTOR * shV = &m_SHAKEMODE[m_shakeType].pV[m_CurIdx];

	if(gCurTime - m_dwLastShakingPosChangedTime >= shV->Duration)
	{
		m_dwLastShakingPosChangedTime = gCurTime;
		if( ++m_CurIdx >= m_SHAKEMODE[m_shakeType].nN )
		{
			m_bShaking	= FALSE;
			m_pWindow->SetAbsXY(m_OrgX, m_OrgY);
			return;
		}
	}

	m_pWindow->SetAbsXY((long)(m_OrgX + shV->varVector.x), (long)(m_OrgY + shV->varVector.y));

}

BOOL cAnimationManager::MagProcess(RECT * dockingBarRect, cWindow* window, VECTOR2 * outWindowPos)
{
	BOOL rt = FALSE;
	if( abs( (int)(dockingBarRect->left - (LONG)(window->GetAbsX()) ) ) <= MAG_GAB )
	{
		outWindowPos->x = (float)dockingBarRect->left;
		rt = TRUE;
	}
	else if(abs((int)(dockingBarRect->left - (window->GetAbsX()+window->GetWidth()))) <= MAG_GAB)
	{
		outWindowPos->x = (float)dockingBarRect->left-window->GetWidth();
		rt = TRUE;
	}

	if(abs((int)(dockingBarRect->right - window->GetAbsX())) <= MAG_GAB)
	{
		outWindowPos->x = (float)dockingBarRect->right;
		rt = TRUE;
	}
	else if(abs((int)(dockingBarRect->right - (window->GetAbsX()+window->GetWidth()))) <= MAG_GAB)
	{
		outWindowPos->x = (float)(dockingBarRect->right - window->GetWidth());
		rt = TRUE;
	}

	if(abs((int)(dockingBarRect->top - window->GetAbsY())) <= MAG_GAB)
	{
		outWindowPos->y = (float)dockingBarRect->top;
		rt = TRUE;
	}
	else if(abs((int)(dockingBarRect->top - (window->GetAbsY()+window->GetHeight()))) <= MAG_GAB)
	{
		outWindowPos->y = (float)dockingBarRect->top-window->GetHeight();
		rt = TRUE;
	}
	
	if(abs((int)(dockingBarRect->bottom - window->GetAbsY())) <= MAG_GAB)
	{
		outWindowPos->y = (float)dockingBarRect->bottom;
		rt = TRUE;
	}
	else if(abs((int)(dockingBarRect->bottom - (window->GetAbsY()+window->GetHeight()))) <= MAG_GAB)
	{
		outWindowPos->y = (float)(dockingBarRect->bottom - window->GetHeight());
		rt = TRUE;
	}

//KES 031017 CAPTION捞 观栏肺 唱啊瘤 给窍档废
	RECT rc = *((cDialog*)window)->GetCaptionRect();
	OffsetRect( &rc, (int)window->GetAbsX(), (int)window->GetAbsY() );

	if( rc.left < dockingBarRect->left )
	{
		outWindowPos->x = (float)dockingBarRect->left;
		rt = TRUE;
	}
	else if( rc.right > dockingBarRect->right )
	{
		outWindowPos->x = (float)(dockingBarRect->right - ( rc.right - rc.left ));
		rt = TRUE;
	}
	if( rc.top < dockingBarRect->top )
	{
		outWindowPos->y = (float)dockingBarRect->top;
		rt = TRUE;
	}
	else if( rc.bottom > dockingBarRect->bottom )
	{
		outWindowPos->y = (float)(dockingBarRect->bottom - ( rc.bottom - rc.top ));
		rt = TRUE;
	}

	return rt;
}

void cAnimationManager::StartFade(BYTE fadeType, short fadeStart, short fadeEnd, DWORD fadeTime, cDialog * pWnd)
{
	if(FindFadeNode(pWnd))
	{
		return ;
	}
	FADE_INFO * pInfo		= new FADE_INFO;
	
	pInfo->fadeType					= fadeType;
	pInfo->fadeStartValue			= fadeStart;
	pInfo->fadeEndValude			= fadeEnd;
	//pInfo->fadeTotalCount			= fadeCount; 
	//pInfo->fadeCurCount				= 0;
	pInfo->fadeTime					= fadeTime;
	//for(int i = 0 ; i < fadeCount ; ++i)
	//{
	//	pInfo->fadeTime[i] = fadeTime[i];
	//}
	pInfo->fadeStartTime			= gCurTime;
	pInfo->pWnd						= pWnd;
	pInfo->bEnd						= FALSE;
	if(pInfo->fadeType == ANI_FADE_IN)
	{
		pInfo->pWnd->SetAlpha((BYTE)pInfo->fadeStartValue);
		pInfo->pWnd->SetActive(TRUE);
		pInfo->pWnd->SetDisable(TRUE);
	}
	m_FadeList.AddTail(pInfo);
	
}
BOOL cAnimationManager::FindFadeNode(cDialog * window)
{
	FADE_INFO * pInfo;
	POS pos = m_FadeList.GetFirstPos();
	while(pInfo = m_FadeList.GetNextPos(pos))
	{
		if(pInfo->pWnd == window)
			return TRUE;
	}
	return FALSE;
}
void cAnimationManager::FadeProcess()
{
	FADE_INFO * pInfo;
	POS pos = m_FadeList.GetFirstPos();
	while(pInfo = m_FadeList.GetNextPos(pos))
	{
		DWORD dwElapsed = gCurTime - pInfo->fadeStartTime;
		if(dwElapsed > pInfo->fadeTime)
		{
			pInfo->pWnd->SetAlpha((BYTE)pInfo->fadeEndValude);
			if(pInfo->fadeType == ANI_FADE_IN)
			{
				pInfo->pWnd->SetActive(TRUE);
				pInfo->pWnd->SetDisable(FALSE);
			}
			else
			{
				pInfo->pWnd->SetAlpha(255);
				pInfo->pWnd->SetActive(FALSE);
			}
			pInfo->bEnd = TRUE;
		}
		else
		{
			pInfo->pWnd->SetAlpha( (BYTE)(pInfo->fadeStartValue + ((float)dwElapsed * (float)(pInfo->fadeEndValude- pInfo->fadeStartValue) / (float)pInfo->fadeTime )) );
		}
	}

	for(int i  = 0 ; i < m_FadeList.GetCount() ; ++i)
	{
		pInfo = m_FadeList.GetAt(i);
		if(pInfo->bEnd == TRUE)
		{
			m_FadeList.DeleteAt(i);
			break;
		}
	}
}

void cAnimationManager::EndFadeAll()
{
	m_FadeList.DeleteAll();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -