📄 cspriteanim.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 + -