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() TweenSet::~TweenSet()
{ {
std::map<int, TweenSets *>::iterator it; DestroyTweens();
}
it = OnMenuEnterTweens.begin();
while(it != OnMenuEnterTweens.end()) void TweenSet::DestroyTweens()
{ {
delete it->second; std::map<std::string, std::map<int, TweenSets *>>::iterator it = TweenMap.begin();
OnMenuEnterTweens.erase(it);
it = OnMenuEnterTweens.begin();
}
it = OnMenuExitTweens.begin(); while(it != TweenMap.end())
while(it != OnMenuExitTweens.end())
{ {
delete it->second; std::map<int, TweenSets *>::iterator it2 = (it->second).begin();
OnMenuExitTweens.erase(it);
it = OnMenuExitTweens.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; return GetTween(tween, -1);
}
TweenSet::TweenSets *TweenSet::GetOnExitTweens()
{
return &OnExitTweens;
}
TweenSet::TweenSets *TweenSet::GetOnIdleTweens()
{
return &OnIdleTweens;
}
TweenSet::TweenSets *TweenSet::GetOnHighlightEnterTweens()
{
return &OnHighlightEnterTweens;
}
TweenSet::TweenSets *TweenSet::GetOnHighlightExitTweens()
{
return &OnHighlightExitTweens;
} }
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: public:
~TweenSet(); ~TweenSet();
typedef std::vector<std::vector<Tween *> *> TweenSets; typedef std::vector<std::vector<Tween *> *> TweenSets;
//todo: delete the tweens in a destructor
TweenSets *GetOnEnterTweens(); TweenSets *GetTween(std::string tween);
TweenSets *GetOnExitTweens(); TweenSets *GetTween(std::string tween, int index);
TweenSets *GetOnIdleTweens(); void SetTween(std::string tween, int index, TweenSets *set);
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);
private: private:
TweenSets OnEnterTweens; TweenSets *FindTween(std::map<int, TweenSets *> &tweens, int index);
TweenSets OnExitTweens; void TweenSet::DestroyTweens();
TweenSets OnIdleTweens;
TweenSets OnHighlightEnterTweens; std::map<std::string, std::map<int, TweenSets *>> TweenMap;
TweenSets OnHighlightExitTweens;
TweenSets OnMenuScrollTweens;
std::map<int, TweenSets *> OnMenuEnterTweens;
std::map<int, TweenSets *> OnMenuExitTweens;
}; };

View File

@ -180,7 +180,7 @@ void Component::Update(float dt)
case ENTER: case ENTER:
CurrentTweens = Tweens->GetOnHighlightEnterTweens(); CurrentTweens = Tweens->GetTween("enter", MenuEnterIndex);
CurrentAnimationState = HIGHLIGHT_ENTER; CurrentAnimationState = HIGHLIGHT_ENTER;
break; break;
@ -190,7 +190,7 @@ void Component::Update(float dt)
break; break;
case HIGHLIGHT_ENTER: case HIGHLIGHT_ENTER:
CurrentTweens = Tweens->GetOnIdleTweens(); CurrentTweens = Tweens->GetTween("idle", MenuEnterIndex);
CurrentAnimationState = IDLE; CurrentAnimationState = IDLE;
break; break;
@ -204,29 +204,29 @@ void Component::Update(float dt)
else if(MenuEnterRequested) else if(MenuEnterRequested)
{ {
MenuEnterRequested = false; MenuEnterRequested = false;
CurrentTweens = Tweens->GetOnMenuEnterTweens(MenuEnterIndex); CurrentTweens = Tweens->GetTween("menuEnter", MenuEnterIndex);
CurrentAnimationState = MENU_ENTER; CurrentAnimationState = MENU_ENTER;
} }
else if(MenuScrollRequested) else if(MenuScrollRequested)
{ {
MenuScrollRequested = false; MenuScrollRequested = false;
CurrentTweens = Tweens->GetOnMenuScrollTweens(); CurrentTweens = Tweens->GetTween("menuScroll", MenuEnterIndex);
CurrentAnimationState = MENU_SCROLL; CurrentAnimationState = MENU_SCROLL;
} }
else if(MenuExitRequested) else if(MenuExitRequested)
{ {
MenuExitRequested = false; MenuExitRequested = false;
CurrentTweens = Tweens->GetOnMenuExitTweens(MenuExitIndex); CurrentTweens = Tweens->GetTween("menuExit", MenuEnterIndex);
CurrentAnimationState = MENU_EXIT; CurrentAnimationState = MENU_EXIT;
} }
else if(IsScrollActive() || NewItemSelected || ExitRequested) else if(IsScrollActive() || NewItemSelected || ExitRequested)
{ {
CurrentTweens = Tweens->GetOnHighlightExitTweens(); CurrentTweens = Tweens->GetTween("highlightExit", MenuEnterIndex);
CurrentAnimationState = HIGHLIGHT_EXIT; CurrentAnimationState = HIGHLIGHT_EXIT;
} }
else else
{ {
CurrentTweens = Tweens->GetOnIdleTweens(); CurrentTweens = Tweens->GetTween("idle", MenuEnterIndex);
CurrentAnimationState = IDLE; CurrentAnimationState = IDLE;
} }
break; break;
@ -238,14 +238,14 @@ void Component::Update(float dt)
if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_WAIT)) if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_WAIT))
{ {
CurrentTweens = Tweens->GetOnHighlightExitTweens(); CurrentTweens = Tweens->GetTween("highlightExit", MenuEnterIndex);
CurrentAnimationState = HIGHLIGHT_EXIT; CurrentAnimationState = HIGHLIGHT_EXIT;
} }
else if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_EXIT)) else if(ExitRequested && (CurrentAnimationState == HIGHLIGHT_EXIT))
{ {
CurrentTweens = Tweens->GetOnExitTweens(); CurrentTweens = Tweens->GetTween("exit", MenuEnterIndex);
CurrentAnimationState = EXIT; CurrentAnimationState = EXIT;
ExitRequested = false; ExitRequested = false;
} }
@ -256,7 +256,7 @@ void Component::Update(float dt)
} }
else if(NewItemSelected) else if(NewItemSelected)
{ {
CurrentTweens = Tweens->GetOnHighlightEnterTweens(); CurrentTweens = Tweens->GetTween("highlightEnter", MenuEnterIndex);
CurrentAnimationState = HIGHLIGHT_ENTER; CurrentAnimationState = HIGHLIGHT_ENTER;
HighlightExitComplete = true; HighlightExitComplete = true;
NewItemSelected = false; NewItemSelected = false;
@ -271,18 +271,18 @@ void Component::Update(float dt)
case HIDDEN: case HIDDEN:
if(EnterRequested || ExitRequested) if(EnterRequested || ExitRequested)
{ {
CurrentTweens = Tweens->GetOnEnterTweens(); CurrentTweens = Tweens->GetTween("enter", MenuEnterIndex);
CurrentAnimationState = ENTER; CurrentAnimationState = ENTER;
} }
else if(MenuExitRequested) else if(MenuExitRequested)
{ {
CurrentTweens = Tweens->GetOnMenuExitTweens(); CurrentTweens = Tweens->GetTween("menuExit", MenuEnterIndex);
CurrentAnimationState = MENU_EXIT; CurrentAnimationState = MENU_EXIT;
MenuExitRequested = false; MenuExitRequested = false;
} }
else if(MenuEnterRequested) else if(MenuEnterRequested)
{ {
CurrentTweens = Tweens->GetOnMenuEnterTweens(); CurrentTweens = Tweens->GetTween("menuEnter", MenuEnterIndex);
CurrentAnimationState = MENU_ENTER; CurrentAnimationState = MENU_ENTER;
MenuEnterRequested = false; MenuEnterRequested = false;
@ -290,7 +290,7 @@ void Component::Update(float dt)
else if(MenuScrollRequested) else if(MenuScrollRequested)
{ {
MenuScrollRequested = false; MenuScrollRequested = false;
CurrentTweens = Tweens->GetOnMenuScrollTweens(); CurrentTweens = Tweens->GetTween("menuScroll", MenuEnterIndex);
CurrentAnimationState = MENU_SCROLL; CurrentAnimationState = MENU_SCROLL;
} }
else 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 //todo: delete properly, memory leak (big), proof of concept
c->SetTweens(sets); c->SetTweens(sets);
TweenSets *scrollTween = sets->GetOnMenuScrollTweens(); TweenSets *scrollTween = sets->GetTween("menuScroll");
TweenSets::iterator it = scrollTween->begin(); TweenSets::iterator it = scrollTween->begin();
while(it != scrollTween->end()) while(it != scrollTween->end())

View File

@ -460,36 +460,30 @@ TweenSet *PageBuilder::CreateTweenInstance(xml_node<> *componentXml)
{ {
TweenSet *tweens = new TweenSet(); TweenSet *tweens = new TweenSet();
GetTweenSets(componentXml->first_node("onEnter"), tweens->GetOnEnterTweens()); BuildTweenSets(tweens, componentXml, "onEnter", "enter");
GetTweenSets(componentXml->first_node("onExit"), tweens->GetOnExitTweens()); BuildTweenSets(tweens, componentXml, "onExit", "exit");
GetTweenSets(componentXml->first_node("onIdle"), tweens->GetOnIdleTweens()); BuildTweenSets(tweens, componentXml, "onIdle", "idle");
GetTweenSets(componentXml->first_node("onHighlightEnter"), tweens->GetOnHighlightEnterTweens()); BuildTweenSets(tweens, componentXml, "onHighlightEnter", "highlightEnter");
GetTweenSets(componentXml->first_node("onHighlightExit"), tweens->GetOnHighlightExitTweens()); BuildTweenSets(tweens, componentXml, "onHighlightExit", "highlightExit");
BuildTweenSets(tweens, componentXml, "onMenuEnter", "menuEnter");
for(xml_node<> *menuEnter = componentXml->first_node("onMenuEnter"); menuEnter; menuEnter = menuEnter->next_sibling("onMenuEnter")) BuildTweenSets(tweens, componentXml, "onMenuExit", "menuExit");
{
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);
}
return tweens; 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) ScrollingList * PageBuilder::BuildMenu(xml_node<> *menuXml)
{ {

View File

@ -54,6 +54,7 @@ private:
bool BuildComponents(rapidxml::xml_node<> *layout, Page *page); bool BuildComponents(rapidxml::xml_node<> *layout, Page *page);
void LoadTweens(Component *c, rapidxml::xml_node<> *componentXml); void LoadTweens(Component *c, rapidxml::xml_node<> *componentXml);
TweenSet *CreateTweenInstance(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); ScrollingList * BuildMenu(rapidxml::xml_node<> *menuXml);
void BuildCustomMenu(ScrollingList *menu, rapidxml::xml_node<> *menuXml, rapidxml::xml_node<> *itemDefaults); void BuildCustomMenu(ScrollingList *menu, rapidxml::xml_node<> *menuXml, rapidxml::xml_node<> *itemDefaults);
void BuildVerticalMenu(ScrollingList *menu, rapidxml::xml_node<> *menuXml, rapidxml::xml_node<> *itemDefaults); void BuildVerticalMenu(ScrollingList *menu, rapidxml::xml_node<> *menuXml, rapidxml::xml_node<> *itemDefaults);