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

📄 cspriteanim.cpp

📁 3D游戏疯狂的鸡蛋
💻 CPP
字号:
/*************************************************************************************
**	文件名: CSpriteAnim.h
**	描述:   用以控制精灵动画的基类,被具体的精灵类继承
**			 具体信息见附带文档:CSpriteAnim类文档.doc	
**	作者:   Kevin Lynx
**  日期:   2006.8.13
**  
**
**  上次更新:2006.8.16
**	2006.10.16:
**  e_Dir, e_Action没有用到,反而使这个类不怎么通用--用户必须修改头文件加入自己的状态
**  于是去掉了e_Dir, e_Action。
**  2007.1.24修正指定播放次数模式的BUG
**************************************************************************************/

#include	"CSpriteAnim.h"


//==============================================================
//	Name: CSpriteAnim
//	Desc: constructor
//
//==============================================================
CSpriteAnim::CSpriteAnim()
{
	m_statusPool	=	0;
	m_statusCount	=	0;

	m_status		=	0;

}

//==============================================================
//	Name: ~CSpriteAnim
//	Desc: destructor
//
//==============================================================

CSpriteAnim::~CSpriteAnim()
{

	if( m_statusPool != 0 )
	{	
		delete	[]	m_statusPool;
		m_statusPool	=	0 ;
	}

}


//==============================================================
//	Name: InitStatusAnim
//	Desc: init the status info,allocate memory
//
//==============================================================

bool	CSpriteAnim::InitStatus( int statusCount )
{
	if( statusCount < 1 )
		return false;
	
	m_statusCount	=	statusCount;

	m_statusPool	=	new	CSpriteStatus [m_statusCount];

	if( m_statusPool == 0 )
		return	false;

	return true;
}

//==============================================================
//	Name: AddStatus
//	Desc: add some status to the memory 
//
//==============================================================
void	CSpriteAnim::AddStatus( int statusIndex, int dir, int action,
						    int minFrame, int maxFrame, float delay, int times )
{
	if( statusIndex < 0 || statusIndex >= m_statusCount )
		return ;

	m_statusPool[statusIndex].m_dir		=	dir;
	m_statusPool[statusIndex].m_action	=	action;
	m_statusPool[statusIndex].m_minFrame=	minFrame;
	m_statusPool[statusIndex].m_maxFrame=	maxFrame;
	m_statusPool[statusIndex].m_delay   =   delay;
	m_statusPool[statusIndex].m_times   =   times;
	m_statusPool[statusIndex].m_curTimes =  0;
}

//==============================================================
//	Name: SetStatus
//	Desc: set current status for the sprite
//
//==============================================================
bool	CSpriteAnim::SetStatus( int dir, int action )
{
	for( int i = 0; i < m_statusCount ; i ++ )
	{
		if( m_statusPool[i].m_action == action &&
			m_statusPool[i].m_dir == dir )
		{
			m_status	=	i;
			break;
		}
	}
	
	if( i >= m_statusCount )
		return false;
	else
	{
		m_statusPool[m_status].m_curFrame = m_statusPool[m_status].m_minFrame ;
		m_statusPool[m_status].m_curTimes = 0;//重新计算次数
	}
	return true;
}

//==============================================================
//	Name: GetStatus
//	Desc: get the current status info
//
//==============================================================
CSpriteStatus	CSpriteAnim::GetStatus()
{
	return	m_statusPool[m_status];
}


//==============================================================
//	Name: UpdateAnimFrame
//	Desc: update current frame,used by the render
//
//==============================================================
int		CSpriteAnim::UpdateAnimFrame( float time )
{
	
	float	delay	=	m_statusPool[m_status].m_delay ;

	m_statusPool[m_status].m_curFrame += ( delay * time ) ;
	

	if( m_statusPool[m_status].m_curFrame >= m_statusPool[m_status].m_maxFrame + 1 )
	{
		m_statusPool[m_status].m_curTimes ++;		//播放一次

		if( m_statusPool[m_status].m_times == -1 )	//循环播放 
		{
			m_statusPool[m_status].m_curFrame = m_statusPool[m_status].m_minFrame ;
		}
		else
		{
			if( m_statusPool[m_status].m_curTimes >= m_statusPool[m_status].m_times )
			{
				return PLAY_FINISHED;				//播放完毕
			}
			else
			{
				m_statusPool[m_status].m_curFrame = m_statusPool[m_status].m_minFrame ;

			}
		}
	}
	return	(int)m_statusPool[m_status].m_curFrame ;
}

//===============================================================
//File end here.

⌨️ 快捷键说明

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