Support for other tweens to trigger only when specific menu is selected (using menuIndex attribute).

This commit is contained in:
emb 2015-02-02 22:08:34 -06:00
parent 4a77e3b6a1
commit 5790f76f4e
6 changed files with 82 additions and 148 deletions

View File

@ -18,103 +18,57 @@
TweenSet::~TweenSet()
{
std::map<int, TweenSets *>::iterator it;
it = OnMenuEnterTweens.begin();
while(it != OnMenuEnterTweens.end())
{
delete it->second;
OnMenuEnterTweens.erase(it);
it = OnMenuEnterTweens.begin();
}
DestroyTweens();
}
void TweenSet::DestroyTweens()
{
std::map<std::string, std::map<int, TweenSets *>>::iterator it = TweenMap.begin();
it = OnMenuExitTweens.begin();
while(it != OnMenuExitTweens.end())
while(it != TweenMap.end())
{
delete it->second;
OnMenuExitTweens.erase(it);
it = OnMenuExitTweens.begin();
std::map<int, TweenSets *>::iterator it2 = (it->second).begin();
while(it2 != (it->second).end())
{
delete it2->second;
(it->second).erase(it2);
it2 = (it->second).begin();
}
it =TweenMap.begin();
}
}
TweenSet::TweenSets *TweenSet::GetOnEnterTweens()
TweenSet::TweenSets *TweenSet::GetTween(std::string tween)
{
return &OnEnterTweens;
}
TweenSet::TweenSets *TweenSet::GetOnExitTweens()
{
return &OnExitTweens;
}
TweenSet::TweenSets *TweenSet::GetOnIdleTweens()
{
return &OnIdleTweens;
}
TweenSet::TweenSets *TweenSet::GetOnHighlightEnterTweens()
{
return &OnHighlightEnterTweens;
}
TweenSet::TweenSets *TweenSet::GetOnHighlightExitTweens()
{
return &OnHighlightExitTweens;
return GetTween(tween, -1);
}
TweenSet::TweenSets *TweenSet::GetOnMenuEnterTweens()
TweenSet::TweenSets *TweenSet::GetTween(std::string tween, int index)
{
return GetOnMenuEnterTweens(-1);
return FindTween(TweenMap[tween], index);
}
TweenSet::TweenSets *TweenSet::GetOnMenuEnterTweens(int index)
{
if(OnMenuEnterTweens.find(index) == OnMenuEnterTweens.end())
{
index = -1;
if(OnMenuEnterTweens.find(index) == OnMenuEnterTweens.end())
{
TweenSets *set = new TweenSets();
OnMenuEnterTweens[index] = set;
}
}
return OnMenuEnterTweens[index];
}
TweenSet::TweenSets *TweenSet::GetOnMenuScrollTweens()
{
return &OnMenuScrollTweens;
}
TweenSet::TweenSets *TweenSet::GetOnMenuExitTweens()
{
return GetOnMenuExitTweens(-1);
}
TweenSet::TweenSets *TweenSet::GetOnMenuExitTweens(int index)
{
if(OnMenuExitTweens.find(index) == OnMenuExitTweens.end())
{
index = -1;
if(OnMenuExitTweens.find(index) == OnMenuExitTweens.end())
{
TweenSets *set = new TweenSets();
OnMenuExitTweens[index] = set;
}
}
return OnMenuExitTweens[index];
}
void TweenSet::SetOnMenuEnterTweens(int index, TweenSets *set)
{
OnMenuEnterTweens[index] = set;
}
void TweenSet::SetOnMenuExitTweens(int index, TweenSets *set)
void TweenSet::SetTween(std::string tween, int index, TweenSets *set)
{
OnMenuExitTweens[index] = set;
TweenMap[tween][index] = set;
}
TweenSet::TweenSets *TweenSet::FindTween(std::map<int, TweenSets *> &tweens, int index)
{
if(tweens.find(index) == tweens.end())
{
index = -1;
if(tweens.find(index) == tweens.end())
{
TweenSets *set = new TweenSets();
tweens[index] = set;
}
}
return tweens[index];
}

View File

@ -27,29 +27,14 @@ class TweenSet
public:
~TweenSet();
typedef std::vector<std::vector<Tween *> *> TweenSets;
//todo: delete the tweens in a destructor
TweenSets *GetOnEnterTweens();
TweenSets *GetOnExitTweens();
TweenSets *GetOnIdleTweens();
TweenSets *GetOnHighlightEnterTweens();
TweenSets *GetOnHighlightExitTweens();
TweenSets *GetOnMenuScrollTweens();
TweenSets *GetOnMenuEnterTweens();
TweenSets *GetOnMenuExitTweens();
TweenSets *GetOnMenuEnterTweens(int index);
TweenSets *GetOnMenuExitTweens(int index);
void SetOnMenuEnterTweens(int index, TweenSets *set);
void SetOnMenuExitTweens(int index, TweenSets *set);
TweenSets *GetTween(std::string tween);
TweenSets *GetTween(std::string tween, int index);
void SetTween(std::string tween, int index, TweenSets *set);
private:
TweenSets OnEnterTweens;
TweenSets OnExitTweens;
TweenSets OnIdleTweens;
TweenSets OnHighlightEnterTweens;
TweenSets OnHighlightExitTweens;
TweenSets OnMenuScrollTweens;
std::map<int, TweenSets *> OnMenuEnterTweens;
std::map<int, TweenSets *> OnMenuExitTweens;
TweenSets *FindTween(std::map<int, TweenSets *> &tweens, int index);
void TweenSet::DestroyTweens();
std::map<std::string, std::map<int, TweenSets *>> TweenMap;
};

View File

@ -180,7 +180,7 @@ void Component::Update(float dt)
case ENTER:
CurrentTweens = Tweens->GetOnHighlightEnterTweens();
CurrentTweens = Tweens->GetTween("enter", MenuEnterIndex);
CurrentAnimationState = HIGHLIGHT_ENTER;
break;
@ -190,7 +190,7 @@ void Component::Update(float dt)
break;
case HIGHLIGHT_ENTER:
CurrentTweens = Tweens->GetOnIdleTweens();
CurrentTweens = Tweens->GetTween("idle", MenuEnterIndex);
CurrentAnimationState = IDLE;
break;
@ -204,29 +204,29 @@ void Component::Update(float dt)
else if(MenuEnterRequested)
{
MenuEnterRequested = false;
CurrentTweens = Tweens->GetOnMenuEnterTweens(MenuEnterIndex);
CurrentTweens = Tweens->GetTween("menuEnter", MenuEnterIndex);
CurrentAnimationState = MENU_ENTER;
}
else if(MenuScrollRequested)
{
MenuScrollRequested = false;
CurrentTweens = Tweens->GetOnMenuScrollTweens();
CurrentTweens = Tweens->GetTween("menuScroll", MenuEnterIndex);
CurrentAnimationState = MENU_SCROLL;
}
else if(MenuExitRequested)
{
MenuExitRequested = false;
CurrentTweens = Tweens->GetOnMenuExitTweens(MenuExitIndex);
CurrentTweens = Tweens->GetTween("menuExit", MenuEnterIndex);
CurrentAnimationState = MENU_EXIT;
}
else if(IsScrollActive() || NewItemSelected || ExitRequested)
{
CurrentTweens = Tweens->GetOnHighlightExitTweens();
CurrentTweens = Tweens->GetTween("highlightExit", MenuEnterIndex);
CurrentAnimationState = HIGHLIGHT_EXIT;
}
else
{
CurrentTweens = Tweens->GetOnIdleTweens();
CurrentTweens = Tweens->GetTween("idle", MenuEnterIndex);
CurrentAnimationState = IDLE;
}
break;
@ -238,14 +238,14 @@ void Component::Update(float dt)
if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_WAIT))
{
CurrentTweens = Tweens->GetOnHighlightExitTweens();
CurrentTweens = Tweens->GetTween("highlightExit", MenuEnterIndex);
CurrentAnimationState = HIGHLIGHT_EXIT;
}
else if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_EXIT))
{
CurrentTweens = Tweens->GetOnExitTweens();
CurrentTweens = Tweens->GetTween("exit", MenuEnterIndex);
CurrentAnimationState = EXIT;
ExitRequested = false;
}
@ -256,7 +256,7 @@ void Component::Update(float dt)
}
else if(NewItemSelected)
{
CurrentTweens = Tweens->GetOnHighlightEnterTweens();
CurrentTweens = Tweens->GetTween("highlightEnter", MenuEnterIndex);
CurrentAnimationState = HIGHLIGHT_ENTER;
HighlightExitComplete = true;
NewItemSelected = false;
@ -271,18 +271,18 @@ void Component::Update(float dt)
case HIDDEN:
if(EnterRequested || ExitRequested)
{
CurrentTweens = Tweens->GetOnEnterTweens();
CurrentTweens = Tweens->GetTween("enter", MenuEnterIndex);
CurrentAnimationState = ENTER;
}
else if(MenuExitRequested)
{
CurrentTweens = Tweens->GetOnMenuExitTweens();
CurrentTweens = Tweens->GetTween("menuExit", MenuEnterIndex);
CurrentAnimationState = MENU_EXIT;
MenuExitRequested = false;
}
else if(MenuEnterRequested)
{
CurrentTweens = Tweens->GetOnMenuEnterTweens();
CurrentTweens = Tweens->GetTween("menuEnter", MenuEnterIndex);
CurrentAnimationState = MENU_ENTER;
MenuEnterRequested = false;
@ -290,7 +290,7 @@ void Component::Update(float dt)
else if(MenuScrollRequested)
{
MenuScrollRequested = false;
CurrentTweens = Tweens->GetOnMenuScrollTweens();
CurrentTweens = Tweens->GetTween("menuScroll", MenuEnterIndex);
CurrentAnimationState = MENU_SCROLL;
}
else

View File

@ -522,7 +522,7 @@ void ScrollingList::ResetTweens(Component *c, TweenSet *sets, ViewInfo *currentV
//todo: delete properly, memory leak (big), proof of concept
c->SetTweens(sets);
TweenSets *scrollTween = sets->GetOnMenuScrollTweens();
TweenSets *scrollTween = sets->GetTween("menuScroll");
TweenSets::iterator it = scrollTween->begin();
while(it != scrollTween->end())

View File

@ -460,36 +460,30 @@ TweenSet *PageBuilder::CreateTweenInstance(xml_node<> *componentXml)
{
TweenSet *tweens = new TweenSet();
GetTweenSets(componentXml->first_node("onEnter"), tweens->GetOnEnterTweens());
GetTweenSets(componentXml->first_node("onExit"), tweens->GetOnExitTweens());
GetTweenSets(componentXml->first_node("onIdle"), tweens->GetOnIdleTweens());
GetTweenSets(componentXml->first_node("onHighlightEnter"), tweens->GetOnHighlightEnterTweens());
GetTweenSets(componentXml->first_node("onHighlightExit"), tweens->GetOnHighlightExitTweens());
for(xml_node<> *menuEnter = componentXml->first_node("onMenuEnter"); menuEnter; menuEnter = menuEnter->next_sibling("onMenuEnter"))
{
xml_attribute<> *indexXml = menuEnter->first_attribute("menuIndex");
int index = (indexXml) ? Utils::ConvertInt(indexXml->value()) : -1;
TweenSet::TweenSets *sets = new TweenSet::TweenSets();
GetTweenSets(menuEnter, sets);
tweens->SetOnMenuEnterTweens(index, sets);
}
for(xml_node<> *menuExit = componentXml->first_node("onMenuExit"); menuExit; menuExit = menuExit->next_sibling("onMenuExit"))
{
xml_attribute<> *indexXml = menuExit->first_attribute("menuIndex");
int index = (indexXml) ? Utils::ConvertInt(indexXml->value()) : -1;
TweenSet::TweenSets *sets = new TweenSet::TweenSets();
GetTweenSets(menuExit, sets);
tweens->SetOnMenuExitTweens(index, sets);
}
BuildTweenSets(tweens, componentXml, "onEnter", "enter");
BuildTweenSets(tweens, componentXml, "onExit", "exit");
BuildTweenSets(tweens, componentXml, "onIdle", "idle");
BuildTweenSets(tweens, componentXml, "onHighlightEnter", "highlightEnter");
BuildTweenSets(tweens, componentXml, "onHighlightExit", "highlightExit");
BuildTweenSets(tweens, componentXml, "onMenuEnter", "menuEnter");
BuildTweenSets(tweens, componentXml, "onMenuExit", "menuExit");
return tweens;
}
void PageBuilder::BuildTweenSets(TweenSet *tweens, xml_node<> *componentXml, std::string tagName, std::string tweenName)
{
for(componentXml = componentXml->first_node(tagName.c_str()); componentXml; componentXml = componentXml->next_sibling(tweenName.c_str()))
{
xml_attribute<> *indexXml = componentXml->first_attribute("menuIndex");
int index = (indexXml) ? Utils::ConvertInt(indexXml->value()) : -1;
TweenSet::TweenSets *sets = new TweenSet::TweenSets();
GetTweenSets(componentXml, sets);
tweens->SetTween(tweenName, index, sets);
}
}
ScrollingList * PageBuilder::BuildMenu(xml_node<> *menuXml)
{

View File

@ -54,6 +54,7 @@ private:
bool BuildComponents(rapidxml::xml_node<> *layout, Page *page);
void LoadTweens(Component *c, rapidxml::xml_node<> *componentXml);
TweenSet *CreateTweenInstance(rapidxml::xml_node<> *componentXml);
void BuildTweenSets(TweenSet *tweens, rapidxml::xml_node<> *componentXml, std::string tagName, std::string tweenName);
ScrollingList * BuildMenu(rapidxml::xml_node<> *menuXml);
void BuildCustomMenu(ScrollingList *menu, rapidxml::xml_node<> *menuXml, rapidxml::xml_node<> *itemDefaults);
void BuildVerticalMenu(ScrollingList *menu, rapidxml::xml_node<> *menuXml, rapidxml::xml_node<> *itemDefaults);