bool Animation::reset(AnimState &state, const NifOgre::TextKeyMap &keys, const std::string &groupname, const std::string &start, const std::string &stop, float startpoint) { const NifOgre::TextKeyMap::const_iterator groupstart = findGroupStart(keys, groupname); std::string starttag = groupname+": "+start; NifOgre::TextKeyMap::const_iterator startkey(groupstart); while(startkey != keys.end() && startkey->second != starttag) startkey++; if(startkey == keys.end() && start == "loop start") { starttag = groupname+": start"; startkey = groupstart; while(startkey != keys.end() && startkey->second != starttag) startkey++; } if(startkey == keys.end()) return false; const std::string stoptag = groupname+": "+stop; NifOgre::TextKeyMap::const_iterator stopkey(groupstart); while(stopkey != keys.end() // We have to ignore extra garbage at the end. // The Scrib's idle3 animation has "Idle3: Stop." instead of "Idle3: Stop". // Why, just why? :( && (stopkey->second.size() < stoptag.size() || stopkey->second.substr(0,stoptag.size()) != stoptag)) stopkey++; if(stopkey == keys.end()) return false; if(startkey->first > stopkey->first) return false; state.mStartTime = startkey->first; state.mLoopStartTime = startkey->first; state.mLoopStopTime = stopkey->first; state.mStopTime = stopkey->first; state.mTime = state.mStartTime + ((state.mStopTime - state.mStartTime) * startpoint); if(state.mTime > state.mStartTime) { const std::string loopstarttag = groupname+": loop start"; const std::string loopstoptag = groupname+": loop stop"; NifOgre::TextKeyMap::const_iterator key(groupstart); while(key->first <= state.mTime && key != stopkey) { if(key->second == loopstarttag) state.mLoopStartTime = key->first; else if(key->second == loopstoptag) state.mLoopStopTime = key->first; key++; } } return true; }
//waitTime(t) : wait t milliseconds int waitTime(int t) { Uint32 ticks; ticks=SDL_GetTicks()+t; while(ticks>SDL_GetTicks()){ SDL_Delay(5); getevent(); if (stopkey()==-1)return -1; if (autotimer()!=0)return -1; } return 0; }