`

动画框架:SceneManager

 
阅读更多

SceneManager:

1.动画对象的管理:

AnimationList mAnimationsList;
AnimationStateSet mAnimationStates;

Animation* SceneManager::createAnimation(const String& name, Real length)
{
	OGRE_LOCK_MUTEX(mAnimationsListMutex)
    if (mAnimationsList.find(name) != mAnimationsList.end())
    {
        OGRE_EXCEPT(
            Exception::ERR_DUPLICATE_ITEM,
            "An animation with the name " + name + " already exists",
            "SceneManager::createAnimation" );
    }
    Animation* pAnim = OGRE_NEW Animation(name, length);
    mAnimationsList[name] = pAnim;
    return pAnim;
}

AnimationState* SceneManager::createAnimationState(const String& animName)
{
        Animation* anim = getAnimation(animName);//如果不存在就会抛异常
	return mAnimationStates.createAnimationState(animName, 0, anim->getLength());
}

在SceneManager里面使用Animation时会把Animation保存在mAnimationsList里面,AnimationState保存在mAnimationStates里面,他们通过animName来保持一一对应。生命周期:Animation创建-->AnimationState创建-->AnimationState销毁-->Animation销毁。如果不是按照这种顺序会报异常。

 

2.动画播放:

void SceneManager::_applySceneAnimations(void)
{
	// manual lock over states (extended duration required)
	OGRE_LOCK_MUTEX(mAnimationStates.OGRE_AUTO_MUTEX_NAME)

	// Iterate twice, once to reset, once to apply, to allow blending
    ConstEnabledAnimationStateIterator stateIt = mAnimationStates.getEnabledAnimationStateIterator();

    while (stateIt.hasMoreElements())
    {
        const AnimationState* state = stateIt.getNext();
        Animation* anim = getAnimation(state->getAnimationName());

        // Reset any nodes involved
        Animation::NodeTrackIterator nodeTrackIt = anim->getNodeTrackIterator();
        while(nodeTrackIt.hasMoreElements())
        {
            Node* nd = nodeTrackIt.getNext()->getAssociatedNode();
			if (nd)
				nd->resetToInitialState();
        }

        Animation::NumericTrackIterator numTrackIt = anim->getNumericTrackIterator();
        while(numTrackIt.hasMoreElements())
        {
            const AnimableValuePtr& animPtr = numTrackIt.getNext()->getAssociatedAnimable();
			if (!animPtr.isNull())
				animPtr->resetToBaseValue();
        }
    }

	// this should allow blended animations
	stateIt = mAnimationStates.getEnabledAnimationStateIterator();
	while (stateIt.hasMoreElements())
	{
		const AnimationState* state = stateIt.getNext();
		Animation* anim = getAnimation(state->getAnimationName());
		// Apply the animation
		anim->apply(state->getTimePosition(), state->getWeight());
	}
}

 遍历所有Enabled为true的动画状态,调用node的resetToInitialState()和AnimableValue的resetToBaseValue()方法,分辨对节点动画和数组动画进行reset,最后调用Animation的apply方法进行播放动画。

 

分享到:
评论

相关推荐

    SceneManager U3D

    老的scenemanager,特殊之处在于有很多场景切换效果可以参考

    Additive SceneManager

    unity叠加场景的专用插件,场景切换实例。 unity叠加场景的专用插件,场景切换实例 unity叠加场景的专用插件,场景切换实例

    SceneManager插件

    Scene Manager提供了2个场景的概念:Screen和Level Screen:即相互之间没有关联的场景模块(例如登陆场景,主菜单场景,游戏场景之间的关系),其之间并没有严格的先后关系,更接近于Unity3d中Scene的概念 ...

    p5.SceneManager:适用于p5.js游戏和应用程序的场景管理器

    p5.j​​s SceneManager p5.j​​s SceneManager被全世界无数的p5.js开发人员用来向其p5.js草图添加场景管理功能。 如果您在项目中使用“ p5.js SceneManager”,那么如果您与我共享项目的详细信息将非常有用(我...

    Unity 3D开发-SceneManager场景管理(异步使用同一个过渡场景)

    有同步SceneManager.LoadScene()和异步SceneManager.LoadSceneAsync()两种方法,同步的话一般就会卡住界面直到加载完成,使用异步的话一般都做一个加载的进度条,每次切换的时候都需要一个加载动画,所以需要建一个...

    [编辑器扩展] SceneManager方便快捷的场景管理插件

    [编辑器扩展] SceneManager方便快捷的场景管理插件;官网35美金

    Ogre场景管理器SceneManager类

    学习ogre非常好的资料,本人从网上搜集下来,特贡献出来供大家分享,此文章对我的学习帮助很大,希望对大家有所帮助.

    SceneManager:Love2D的场景管理库

    场景管理器Love2D的场景管理库该软件目前正在开发中,不建议一般使用。

    TDDP_FluidTimestep.js

    修改位置:第63行:SceneManager._dt = 1.0 / 60; // 除数即为欲修改至的FPS 以下为作者注释: /*: * @plugindesc 1.0.2 Fixes MV's framerate dependent timestepping. Makes the gamespeed the same regardless ...

    purescript-phaser:PureScript的Phaser 3绑定

    - createGame {width: 400, height: 400} sceneManager <- getSceneManager game scene <- addScene "testScene" { init: \_ _ -> log "init!" , create: \scene _ -> do img <- addImage "test" {x: 40.0,

    metrogram:东京地铁实时模拟

    Metrogram 版本 1.0.0 lastupdate 2014.11.13 作者:Hiroshi KOI 作者网址: : 麻省理工学院许可证版权所有 (c) 2014 nulldesign.jp 特此授予任何人免费获得本软件副本和相关文档文件(“SceneManager”)的许可,不...

    unity实现2D小游戏FlappyBird-2D

    (3)Start按钮,SceneManager.LoadScene()进入游戏场景,通过TileMap绘制场景,添加TileMap碰撞体,用于碰撞检测。Player添加刚体和碰撞体,空格键施加力,使得玩家向上。场景移动通过时间Time.deltaTime的叠加,给...

    Unity AssetBundle 资源同步/异步加载管理器

    基于Unity封装的AB包资源管理器,实现同步加载/异步加载AB包以及依赖包,详细可以到我的博客查看文章,里面也有完整代码。

    Loading Screen 1.4.5_zyx.zip

    而且它的操作非常简单,你只需写一行代码供脚本使用即可,而不必通过 SceneManager.LoadScene() ;。 功能: ◆ 完整的 UGUI 系统。 ◆ 在场景间平滑的过渡。 ◆ 异步和伪加载。 ◆ 背景过渡。 ◆ 游戏提示系统。 ◆...

    OGRE初中级教程

    官方教程的中文翻译 下一步创建一个 Entity ,通过调用 SceneManager 的 createEntity 方法来创建: Entity *ent1 = mSceneMgr->createEntity( "Robot", "robot.mesh" );

    强大的Unity对象池工具插件-ObjectPooling V2

    加载场景方法,这样您就不必每次都键入UnityEngine.SceneManagement.SceneManager.LoadScene()。产生的对象重置配置(目前将使您控制重置Rigidbody、Rigidbody2D和SpriteRenderer回到它们的预制件状态,将根据需求...

    ChromeAudioVisualizerExtension:ChromeChrome合金的Audio Visualizer扩展

    然后,您在update方法中拥有东西吗(AudioScenes命名空间中的所有场景都会被SceneManager自动拾取,因此您应该在扩展场景下拉列表中看到它)g.ctx是画布上下文,而g.byteFrequency是可用于在场景

    Scopic3DViewer

    Scopic3DViewer 在QT6(6.0.1)C ++中实现 在Windows 10环境中测试(QT 6.0.1 MSVC2019 64位) 支持切换网格视图和坐标轴 通过拖动鼠标进行相机导航:(平... GUI不支持“移除/删除形状”,但SceneManager类已支持

    OGRE 3D v1.4.0中文手册

    2.3 SceneManager 对象 ............................................... 21 2.4 ResourceGroupManager 对象 ................................ 23 2.5 Mesh 对象 ................................................

Global site tag (gtag.js) - Google Analytics