MenuIndex tag to allow for other components to have animations based on menu selection.

This commit is contained in:
emb 2015-01-31 14:51:39 -06:00
parent 08b4aaec5e
commit 2cfcf0d713
6 changed files with 153 additions and 17 deletions

View File

@ -16,6 +16,26 @@
#include "TweenSet.h"
TweenSet::~TweenSet()
{
std::map<int, TweenSets *>::iterator it;
it = OnMenuEnterTweens.begin();
while(it != OnMenuEnterTweens.end())
{
delete it->second;
OnMenuEnterTweens.erase(it);
it = OnMenuEnterTweens.begin();
}
it = OnMenuExitTweens.begin();
while(it != OnMenuExitTweens.end())
{
delete it->second;
OnMenuExitTweens.erase(it);
it = OnMenuExitTweens.begin();
}
}
TweenSet::TweenSets *TweenSet::GetOnEnterTweens()
{
@ -37,16 +57,64 @@ TweenSet::TweenSets *TweenSet::GetOnHighlightExitTweens()
{
return &OnHighlightExitTweens;
}
TweenSet::TweenSets *TweenSet::GetOnMenuEnterTweens()
{
return &OnMenuEnterTweens;
return GetOnMenuEnterTweens(-1);
}
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 &OnMenuExitTweens;
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)
{
OnMenuExitTweens[index] = set;
}

View File

@ -18,24 +18,29 @@
#include "Tween.h"
#include <string>
#include <vector>
#include <map>
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 *GetOnMenuEnterTweens();
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:
TweenSets OnEnterTweens;
@ -43,8 +48,8 @@ private:
TweenSets OnIdleTweens;
TweenSets OnHighlightEnterTweens;
TweenSets OnHighlightExitTweens;
TweenSets OnMenuEnterTweens;
TweenSets OnMenuScrollTweens;
TweenSets OnMenuExitTweens;
std::map<int, TweenSets *> OnMenuEnterTweens;
std::map<int, TweenSets *> OnMenuExitTweens;
};

View File

@ -40,8 +40,10 @@ void Component::FreeGraphicsMemory()
EnterRequested = false;
ExitRequested = false;
MenuEnterRequested = false;
MenuEnterIndex = -1;
MenuScrollRequested = false;
MenuExitRequested = false;
MenuExitIndex = -1;
NewItemSelected = false;
HighlightExitComplete = false;
@ -90,9 +92,10 @@ void Component::TriggerExitEvent()
void Component::TriggerMenuEnterEvent()
void Component::TriggerMenuEnterEvent(int menuIndex)
{
MenuEnterRequested = true;
MenuEnterIndex = menuIndex;
}
void Component::TriggerMenuScrollEvent()
@ -101,9 +104,10 @@ void Component::TriggerMenuScrollEvent()
}
void Component::TriggerMenuExitEvent()
void Component::TriggerMenuExitEvent(int menuIndex)
{
MenuExitRequested = true;
MenuExitIndex = menuIndex;
}
void Component::TriggerHighlightEvent(Item *selectedItem)
{
@ -200,7 +204,7 @@ void Component::Update(float dt)
else if(MenuEnterRequested)
{
MenuEnterRequested = false;
CurrentTweens = Tweens->GetOnMenuEnterTweens();
CurrentTweens = Tweens->GetOnMenuEnterTweens(MenuEnterIndex);
CurrentAnimationState = MENU_ENTER;
}
else if(MenuScrollRequested)
@ -212,7 +216,7 @@ void Component::Update(float dt)
else if(MenuExitRequested)
{
MenuExitRequested = false;
CurrentTweens = Tweens->GetOnMenuExitTweens();
CurrentTweens = Tweens->GetOnMenuExitTweens(MenuExitIndex);
CurrentAnimationState = MENU_EXIT;
}
else if(IsScrollActive() || NewItemSelected || ExitRequested)

View File

@ -35,8 +35,8 @@ public:
virtual void LaunchExit() {}
void TriggerEnterEvent();
void TriggerExitEvent();
void TriggerMenuEnterEvent();
void TriggerMenuExitEvent();
void TriggerMenuEnterEvent(int menuIndex = -1);
void TriggerMenuExitEvent(int menuIndex = -1);
void TriggerMenuScrollEvent();
void TriggerHighlightEvent(Item *selectedItem);
bool IsIdle();
@ -107,8 +107,10 @@ protected:
bool EnterRequested;
bool ExitRequested;
bool MenuEnterRequested;
int MenuEnterIndex;
bool MenuScrollRequested;
bool MenuExitRequested;
int MenuExitIndex;
bool NewItemSelected;
bool HighlightExitComplete;
bool NewItemSelectedSinceEnter;

View File

@ -329,13 +329,20 @@ bool Page::PushCollection(CollectionInfo *collection)
Collections.push_back(collection);
std::vector<ComponentItemBinding *> *sprites = ComponentItemBindingBuilder::BuildCollectionItems(collection->GetItems());
int menuExitIndex = -1;
int menuEnterIndex = -1;
if(ActiveMenu)
{
ActiveMenu->TriggerMenuExitEvent();
}
if(MenuDepth > 0)
{
menuExitIndex = MenuDepth - 1;
}
ActiveMenu = Menus[MenuDepth];
ActiveMenu->SetCollectionName(collection->GetName());
ActiveMenu->DestroyItems();
ActiveMenu->SetItems(sprites);
@ -343,6 +350,7 @@ bool Page::PushCollection(CollectionInfo *collection)
if(MenuDepth < Menus.size())
{
menuEnterIndex = MenuDepth;
MenuDepth++;
}
@ -351,6 +359,15 @@ bool Page::PushCollection(CollectionInfo *collection)
for(std::vector<Component *>::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it)
{
(*it)->SetCollectionName(collection->GetName());
if(menuEnterIndex >= 0)
{
(*it)->TriggerMenuEnterEvent(menuEnterIndex);
}
if(menuExitIndex >= 0)
{
(*it)->TriggerMenuExitEvent(menuExitIndex);
}
}
}
@ -359,6 +376,9 @@ bool Page::PushCollection(CollectionInfo *collection)
bool Page::PopCollection()
{
int menuExitIndex = -1;
int menuEnterIndex = -1;
if(MenuDepth > 1)
{
if(Collections.size() > 1)
@ -372,15 +392,34 @@ bool Page::PopCollection()
}
MenuDepth--;
menuExitIndex = MenuDepth;
menuEnterIndex = menuExitIndex - 1;
ActiveMenu = Menus[MenuDepth - 1];
if(ActiveMenu)
{
ActiveMenu->TriggerMenuEnterEvent();
}
for(unsigned int i = 0; i < NUM_LAYERS; ++i)
{
for(std::vector<Component *>::iterator it = LayerComponents[i].begin(); it != LayerComponents[i].end(); ++it)
{
if(menuEnterIndex >= 0)
{
(*it)->TriggerMenuEnterEvent(menuEnterIndex);
}
if(menuExitIndex >= 0)
{
(*it)->TriggerMenuExitEvent(menuExitIndex);
}
}
}
return true;
}
return false;
}

View File

@ -465,8 +465,27 @@ TweenSet *PageBuilder::CreateTweenInstance(xml_node<> *componentXml)
GetTweenSets(componentXml->first_node("onIdle"), tweens->GetOnIdleTweens());
GetTweenSets(componentXml->first_node("onHighlightEnter"), tweens->GetOnHighlightEnterTweens());
GetTweenSets(componentXml->first_node("onHighlightExit"), tweens->GetOnHighlightExitTweens());
GetTweenSets(componentXml->first_node("onMenuEnter"), tweens->GetOnMenuEnterTweens());
GetTweenSets(componentXml->first_node("onMenuExit"), tweens->GetOnMenuExitTweens());
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);
}
return tweens;
}
@ -725,7 +744,6 @@ void PageBuilder::BuildViewInfo(xml_node<> *componentXml, ViewInfo *info, xml_no
info->SetX(GetHorizontalAlignment(x, 0));
info->SetY(GetVerticalAlignment(y, 0));
info->SetXOffset( GetHorizontalAlignment(xOffset, 0));
info->SetYOffset( GetVerticalAlignment(yOffset, 0));
float xOriginRelative = GetHorizontalAlignment(xOrigin, 0);