回调退出动态播放(Native)
最終更新: 2020年1月30日
概述
使用Cubism SDK for Native,您现在可以在退出动态播放时通过回调获取Event。
在范例中,通过回调函数输出退出播放的记录文本。
回调实装
此次,由于在退出动态播放时通过回调进行处理,因此进行实装,使其能够通过管理动态的抽象类
Framework/src/Motion/ACubismMotion进行回调处理。
class ACubismMotion
{
public:
// 退出动态播放的回调函数的定义
typedef void (*FinishedMotionCallback)(ACubismMotion* self);
・
・
・
// 注册退出动态播放的回调
void SetFinishedMotionHandler(FinishedMotionCallback onFinishedMotionHandler);
// 获取退出动态播放的回调
FinishedMotionCallback GetFinishedMotionHandler();
・
・
・
private:
// 加入了退出动态播放时调用的回调函数的变量
FinishedMotionCallback _onFinishedMotion;
};
Tips
在范例中,以下情况无法调用回调,敬请注意。
- 当正在播放的动态设置为“循环”时
- 在回调中注册NULL时
回调函数的使用
实装希望通过回调函数实际处理的内容。
在范例中,通知退出动态播放的记录文本被实装为使用 LAppPal::PrintLog()输出。
如果要在退出动态播放时变更处理,请变更以下函数的实装。
void FinishedMotion(ACubismMotion* self)
{
LAppPal::PrintLog("Motion Finished: %x", self);
}
另外,在注册回调函数时,在使用导入动态数据的Framework层的CubismUserMotion::LoadMotion()时,会在生成动态的同时传递回调函数。
如果已经有了一个动态,则使用“实装回调”中介绍的SetFinishedMotionHandler()。
CubismMotionQueueEntryHandle LAppModel::StartMotion(const csmChar* group, csmInt32 no, csmInt32 priority, ACubismMotion::FinishedMotionCallback onFinishedMotionHandler)
{
・
・
・
if (motion == NULL)
{
csmString path = fileName;
path = _modelHomeDir + path;
csmByte* buffer;
csmSizeInt size;
buffer = CreateBuffer(path.GetRawString(), &size);
// 通过在导入动态数据的同时传递回调函数来注册
motion = static_cast<CubismMotion*>(LoadMotion(buffer, size, NULL, onFinishedMotionHandler));
・
・
・
}
else
{
motion->SetFinishedMotionHandler(onFinishedMotionHandler);
}
}
在范例中,回调函数是从执行获取点击Event的OnTap()时调用的StartRandomMotion()传入。
此外,由于实际播放动态的是CubismMotion::DoUpdateParameters(),因此进行实装,以便可以将回调函数传递给CubismMotion。
CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size, FinishedMotionCallback onFinishedMotionHandler)
{
CubismMotion* ret = CSM_NEW CubismMotion();
ret->Parse(buffer, size);
ret->_sourceFrameRate = ret->_motionData->Fps;
ret->_loopDurationSeconds = ret->_motionData->Duration;
// 回调函数的注册
ret->_onFinishedMotion = onFinishedMotionHandler;
}
关于实装的发展
范例中只实装了退出动态播放,但通过发展这些实装,可以在退出动态播放后通过回调函数进行异步处理等,
通过从要应用回调的实际处理中反转函数,您可以在退出动态播放以外的地方实装回调。
请问这篇文章对您有帮助吗?
是否