动态播放开始和播放结束回调(Native)

最終更新: 2024年12月19日

概述

现在在Cubism SDK for Native中可以在动态播放开始和结束时使用回调获取Event。

在范例中,回调函数输出通知播放开始和结束的记录文本。

回调实装

此次,由于在动态播放开始和结束时通过回调进行处理,因此进行实装,使其能够通过管理动态的抽象类Framework/src/Motion/ACubismMotion进行回调处理。

class ACubismMotion
{
public:
    // 开始动态播放回调函数的定义
    typedef void (*BeganMotionCallback)(ACubismMotion* self);

    // 退出动态播放的回调函数的定义
    typedef void (*FinishedMotionCallback)(ACubismMotion* self);
    ・
    ・
    ・
    // 注册开始动态播放的回调
    void SetBeganMotionHandler(BeganMotionCallback onBeganMotionHandler);

    // 注册退出动态播放的回调
    void SetFinishedMotionHandler(FinishedMotionCallback onFinishedMotionHandler);

    // 获取开始动态播放的回调
    BeganMotionCallback GetBeganMotionHandler() const;

    // 获取退出动态播放的回调
    FinishedMotionCallback GetFinishedMotionHandler();
    ・
    ・
    ・

private:
    // 加入了开始动态播放时调用的回调函数的变量
    BeganMotionCallback _onBeganMotion;

    // 加入了退出动态播放时调用的回调函数的变量
    FinishedMotionCallback _onFinishedMotion;
};
Tips

在范例中,以下情况无法调用回调,敬请注意。

  • 当正在播放的动态设置为“循环”时
  • 在回调中注册NULL时

回调函数的使用

实装希望通过回调函数实际处理的内容。

在范例中进行实装,以使用LAppPal::PrintLog()输出通知动态播放开始和结束的记录文本。 
如果要变更动态播放开始和结束时的处理,请变更以下函数的执行。

void BeganMotion(ACubismMotion* self)
{
   LAppPal::PrintLog("Motion Began: %x", self);
}

void FinishedMotion(ACubismMotion* self)
{
   LAppPal::PrintLog("Motion Finished: %x", self);
}

另外,在注册回调函数时,在使用导入动态数据的Framework层的CubismUserMotion::LoadMotion()时,会在生成动态的同时传递回调函数。
当已经有一个动态时,使用“回调实装”中介绍的SetBeganMotionHandler()和SetFinishedMotionHandler()。

CubismMotionQueueEntryHandle LAppModel::StartMotion(const csmChar* group, csmInt32 no, csmInt32 priority, ACubismMotion::FinishedMotionCallback onFinishedMotionHandler, ACubismMotion::BeganMotionCallback onBeganMotionHandler)
{
    ・
    ・
    ・
    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, onBeganMotionHandler));
        ・
        ・
        ・
    }
    else
    {
        motion->SetBeganMotionHandler(onBeganMotionHandler);
        motion->SetFinishedMotionHandler(onFinishedMotionHandler);
    }
}

在范例中,回调函数是从执行获取点击Event的OnTap()时调用的StartRandomMotion()传入。

此外,由于实际播放动态的是CubismMotion::DoUpdateParameters(),因此进行实装,以便可以将回调函数传递给CubismMotion。

CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size, FinishedMotionCallback onFinishedMotionHandler, BeganMotionCallback onBeganMotionHandler)
{
    CubismMotion* ret = CSM_NEW CubismMotion();

    ret->Parse(buffer, size);
    ret->_sourceFrameRate = ret->_motionData->Fps;
    ret->_loopDurationSeconds = ret->_motionData->Duration;
    // 回调函数的注册
    ret->_onFinishedMotion = onFinishedMotionHandler;
    ret->_onBeganMotion = onBeganMotionHandler;
}

关于实装的发展

范例中只实装了动态播放开始和结束,但通过发展这些实装,可以在动态播放开始和结束后通过回调函数进行异步处理等,通过从要应用回调的实际处理中反转函数,您可以在动态播放开始和结束以外的地方实装回调。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。