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,特殊之处在于有很多场景切换效果可以参考
unity叠加场景的专用插件,场景切换实例。 unity叠加场景的专用插件,场景切换实例 unity叠加场景的专用插件,场景切换实例
Scene Manager提供了2个场景的概念:Screen和Level Screen:即相互之间没有关联的场景模块(例如登陆场景,主菜单场景,游戏场景之间的关系),其之间并没有严格的先后关系,更接近于Unity3d中Scene的概念 ...
p5.js SceneManager p5.js SceneManager被全世界无数的p5.js开发人员用来向其p5.js草图添加场景管理功能。 如果您在项目中使用“ p5.js SceneManager”,那么如果您与我共享项目的详细信息将非常有用(我...
有同步SceneManager.LoadScene()和异步SceneManager.LoadSceneAsync()两种方法,同步的话一般就会卡住界面直到加载完成,使用异步的话一般都做一个加载的进度条,每次切换的时候都需要一个加载动画,所以需要建一个...
[编辑器扩展] SceneManager方便快捷的场景管理插件;官网35美金
学习ogre非常好的资料,本人从网上搜集下来,特贡献出来供大家分享,此文章对我的学习帮助很大,希望对大家有所帮助.
场景管理器Love2D的场景管理库该软件目前正在开发中,不建议一般使用。
修改位置:第63行:SceneManager._dt = 1.0 / 60; // 除数即为欲修改至的FPS 以下为作者注释: /*: * @plugindesc 1.0.2 Fixes MV's framerate dependent timestepping. Makes the gamespeed the same regardless ...
- createGame {width: 400, height: 400} sceneManager <- getSceneManager game scene <- addScene "testScene" { init: \_ _ -> log "init!" , create: \scene _ -> do img <- addImage "test" {x: 40.0,
Metrogram 版本 1.0.0 lastupdate 2014.11.13 作者:Hiroshi KOI 作者网址: : 麻省理工学院许可证版权所有 (c) 2014 nulldesign.jp 特此授予任何人免费获得本软件副本和相关文档文件(“SceneManager”)的许可,不...
(3)Start按钮,SceneManager.LoadScene()进入游戏场景,通过TileMap绘制场景,添加TileMap碰撞体,用于碰撞检测。Player添加刚体和碰撞体,空格键施加力,使得玩家向上。场景移动通过时间Time.deltaTime的叠加,给...
基于Unity封装的AB包资源管理器,实现同步加载/异步加载AB包以及依赖包,详细可以到我的博客查看文章,里面也有完整代码。
而且它的操作非常简单,你只需写一行代码供脚本使用即可,而不必通过 SceneManager.LoadScene() ;。 功能: ◆ 完整的 UGUI 系统。 ◆ 在场景间平滑的过渡。 ◆ 异步和伪加载。 ◆ 背景过渡。 ◆ 游戏提示系统。 ◆...
官方教程的中文翻译 下一步创建一个 Entity ,通过调用 SceneManager 的 createEntity 方法来创建: Entity *ent1 = mSceneMgr->createEntity( "Robot", "robot.mesh" );
加载场景方法,这样您就不必每次都键入UnityEngine.SceneManagement.SceneManager.LoadScene()。产生的对象重置配置(目前将使您控制重置Rigidbody、Rigidbody2D和SpriteRenderer回到它们的预制件状态,将根据需求...
然后,您在update方法中拥有东西吗(AudioScenes命名空间中的所有场景都会被SceneManager自动拾取,因此您应该在扩展场景下拉列表中看到它)g.ctx是画布上下文,而g.byteFrequency是可用于在场景
Scopic3DViewer 在QT6(6.0.1)C ++中实现 在Windows 10环境中测试(QT 6.0.1 MSVC2019 64位) 支持切换网格视图和坐标轴 通过拖动鼠标进行相机导航:(平... GUI不支持“移除/删除形状”,但SceneManager类已支持
2.3 SceneManager 对象 ............................................... 21 2.4 ResourceGroupManager 对象 ................................ 23 2.5 Mesh 对象 ................................................