bool AnimationPlayer::deserialize(const ConfigParserPtr& parser) { if(parser->toNode(L"animations")) { if(parser->toFirstChild()) { do { StoryBoardPtr storyboard = MakeSharedPtr<StoryBoard>(); MistString name = parser->getString(L"name"); if(!name.empty()) { bool isdefault = parser->getBool(L"default", false); if(isdefault) setDefault(name); if(parser->toFirstChild()) { do { MistString type = parser->getCurrentNodeName(); // linear animation if(type == L"linear") { MistString prop_name = parser->getString(L"prop"); MistString prop_type = parser->getString(L"prop_type"); void* prop = getProperty(prop_name); if(prop) { create_linear_animation(prop_type, prop, parser, storyboard.get()); } // keyframe animation } else if(type == L"keyframe") { MistString prop_name = parser->getString(L"prop"); MistString prop_type = parser->getString(L"prop_type"); void* prop = getProperty(prop_name); if(prop) { create_key_frame_animation(prop_type, prop, parser, storyboard.get()); // back to parent node parser->toParent(); } } } while(parser->toNextChild()); // back to parent node parser->toParent(); // add storyboard mStoryBoards[name] = storyboard; // connect to finish event storyboard->onComplete() += Bind(this, &AnimationPlayer::onAnimationFinished); } } } while(parser->toNextChild()); parser->toParent(); } parser->toParent(); } else return false; if(!mDefault.empty()) play(mDefault); return true; }