m2anicontroller.cpp
来自「3D游戏展示程序」· C++ 代码 · 共 232 行
CPP
232 行
//--------------------------------------------------
// Desc: M2 Animation Controller
// From: WOW Model Viewer
// I just coding in my own ways!
//
//--------------------------------------------------
#include "M2AniController.h"
#include "M2Header.h"
M2AniController::M2AniController(ModelAnimation *pAni)
{
m_pAni = pAni;
// 默认只第一通道第一组, 循环播放
m_AniGroup[0][0].m_AnimID = 0;
m_AniGroup[1][0].m_AnimID = 0;
m_AniGroup[0][0].m_Loops = 0;
m_AniGroup[1][0].m_Loops = 0;
m_AniGroup[0][0].m_bEnable = true;
m_AniGroup[1][0].m_bEnable = true;
m_Index[0] = 0;
m_Index[1] = 0;
m_bChannelEnable[0] = true;
if(m_pAni != NULL)
{
m_Frame[0] = m_pAni[0].timeStart;
m_Frame[1] = m_pAni[0].timeStart;
}
else
{
m_Frame[0] = 0;
m_Frame[1] = 0;
}
m_bChannelEnable[1] = false;
m_fSpeed = 1.0f;
m_bPause = false;
}
M2AniController::~M2AniController()
{
m_pAni = NULL;
}
void M2AniController::Clear()
{
Stop(0);
Stop(1);
m_bPause = true;
}
bool M2AniController::IsChannelEnable(int channel)
{
if(channel>=0 && channel<CHANNELNUM)
{
return m_bChannelEnable[channel];
}
return false;
}
void M2AniController::EnableChannel(int channel)
{
if(channel>=0 && channel<CHANNELNUM)
{
m_bChannelEnable[channel] = true;
}
}
void M2AniController::DisableChannel(int channel)
{
if(channel>=0 && channel<CHANNELNUM)
{
m_bChannelEnable[channel] = false;
}
}
void M2AniController::EnableGroup(int channel, int group)
{
}
void M2AniController::DisableGroup(int channel, int group)
{
}
void M2AniController::AddAni(unsigned int id, int loop)
{
/*
if(m_AniCount > 3)
return;
m_AniGroupOne[m_AniCount].m_AnimID = id;
m_AniGroupOne[m_AniCount].m_Loops = loop;
m_AniCount++;
*/
}
//--------------------------------------------------
//
//--------------------------------------------------
void M2AniController::SetAni(int channel, int group, unsigned int id, int loop)
{
if(channel<0 || channel>=CHANNELNUM)
return;
if(group<0 || group>=ANIGROUPNUM)
return;
if(channel==1) m_bChannelEnable[1] = true;
if(channel==0) m_bPause = false;
if(m_AniGroup[channel][group].m_AnimID==id)
return;
m_AniGroup[channel][group].m_AnimID = id;
m_AniGroup[channel][group].m_Loops = loop;
m_AniGroup[channel][group].m_bEnable = true;
if(m_Index[channel] == group)
{
m_Frame[channel] = m_pAni[id].timeStart;
}
}
void M2AniController::Play()
{
for(int i=0; i<CHANNELNUM; i++)
{
m_Index[i] = 0;
m_Frame[i] = m_pAni[m_AniGroup[i][0].m_AnimID].timeStart;
}
m_bPause = false;
}
bool M2AniController::IsPause(void)
{
return m_bPause;
}
void M2AniController::Stop(int channel)
{
if(m_bChannelEnable[channel])
{
m_Index[channel] = 0;
m_Frame[channel] = m_pAni[m_AniGroup[channel][0].m_AnimID].timeStart;
if(channel == 1) m_bChannelEnable[1] = false;
if(channel == 0) m_bPause = true;
}
// m_bPause = true;
}
void M2AniController::Pause(bool bForce /* = false */)
{
if(m_bPause && bForce == false)
{
m_bPause = false;
}
else
{
m_bPause = true;
}
}
void M2AniController::Next(int channel)
{
if(channel<0 || channel>=CHANNELNUM)
return;
if(m_AniGroup[channel][m_Index[channel]].m_Loops == 1)
{
do
{
m_Index[channel]++;
if(m_Index[channel] >= ANIGROUPNUM)
{
Stop(channel);
return;
}
}while(m_AniGroup[channel][m_Index[channel]].m_bEnable==false);
}
else if(m_AniGroup[channel][m_Index[channel]].m_Loops > 1)
{
m_AniGroup[channel][m_Index[channel]].m_Loops--;
}
m_Frame[channel] = m_pAni[m_AniGroup[channel][m_Index[channel]].m_AnimID].timeStart;
}
int M2AniController::GetAnim(int channel /* = 0 */)
{
if(channel<0 || channel>=CHANNELNUM)
return -1;
return m_AniGroup[channel][m_Index[channel]].m_AnimID;
}
int M2AniController::GetFrame(int channel /* = 0 */)
{
if(channel<0 || channel>=CHANNELNUM)
return -1;
return m_Frame[channel];
}
int M2AniController::GetFrameCount(int channel /* = 0 */)
{
if(channel<0 || channel>=CHANNELNUM)
return -1;
return m_pAni[m_AniGroup[channel][m_Index[channel]].m_AnimID].timeEnd -
m_pAni[m_AniGroup[channel][m_Index[channel]].m_AnimID].timeStart;
}
int M2AniController::Update(int Deltatime)
{
if(m_bPause) return -1;
for(int i=0; i<CHANNELNUM; i++)
{
if(m_bChannelEnable[i])
{
m_Frame[i] += (unsigned int)(Deltatime*m_fSpeed);
if(m_Frame[i] >= m_pAni[m_AniGroup[i][m_Index[i]].m_AnimID].timeEnd)
{
Next(i);
continue;
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?