Refactor gamestatedeckviewer and add a grid view suited...

for bigger screens.
This commit is contained in:
Tobias Loose
2013-12-04 21:57:01 +01:00
parent e90f6fe224
commit 667b95f2b8
24 changed files with 845 additions and 447 deletions

View File

@@ -0,0 +1,184 @@
#include "CarouselDeckView.h"
const float CarouselDeckView::scroll_speed = 5.0f;
CarouselDeckView::CarouselDeckView() :
DeckView(10), mRotation(0), mSlide(0), mScrollTarget(2), mStage(NONE)
{
}
CarouselDeckView::~CarouselDeckView()
{}
void CarouselDeckView::UpdateViewState(float dt)
{
switch(mStage)
{
case SCROLL_TO_SELECTED:
if(mScrollTarget < 2){ //scroll left
mRotation -= dt * scroll_speed;
if(mRotation <= -1.0f)
{
mRotation += 1.0f;
deck()->prev();
reloadIndexes();
mScrollTarget += 1;
}
}else if(mScrollTarget > 2){
mRotation += dt * scroll_speed;
if(mRotation >= 1.0f)
{
mRotation -= 1.0f;
deck()->next();
reloadIndexes();
mScrollTarget -= 1;
}
}else if(mScrollTarget == 2){
mRotation = 0;
mStage = NONE;
}
dirtyCardPos = true;
break;
case SLIDE_DOWN:
mSlide -= 0.05f;
if (mSlide < -1.0f)
{
dirtyFilters = true;
mSlide = 1;
}
else if (mSlide > 0 && mSlide < 0.05)
{
mStage = NONE;
mSlide = 0;
}
dirtyCardPos = true;
break;
case SLIDE_UP:
mSlide += 0.05f;
if (mSlide > 1.0f)
{
dirtyFilters = true;
mSlide = -1;
}
else if (mSlide < 0 && mSlide > -0.05)
{
mStage = NONE;
mSlide = 0;
}
dirtyCardPos = true;
break;
default:
mStage = NONE;
break;
}
}
void CarouselDeckView::UpdateCardPosition(CardRep &rep, int index)
{
float rotation = mRotation + 8 - index;
rep.x = x_center + cos((rotation) * M_PI / 12) * (right_border - x_center);
rep.scale = max_scale / 1.12f * cos((rep.x - x_center) * 1.5f / (right_border - x_center)) + 0.2f * max_scale * cos(
cos((rep.x - x_center) * 0.15f / (right_border - x_center)));
rep.y = (SCREEN_HEIGHT_F) / 2.0f + SCREEN_HEIGHT_F * mSlide * (rep.scale + 0.2f);
}
void CarouselDeckView::Reset()
{
mRotation = 0;
mSlide = 0;
mScrollTarget = 2;
mStage = NONE;
DeckView::Reset();
}
void CarouselDeckView::Render()
{
// even though we want to draw the cards in a particular z order for layering, we want to prefetch them
// in a different order, ie the center card should appear first, then the adjacent ones
if (WResourceManager::Instance()->IsThreaded())
{
WResourceManager::Instance()->RetrieveCard(getCardRep(0).card);
WResourceManager::Instance()->RetrieveCard(getCardRep(3).card);
WResourceManager::Instance()->RetrieveCard(getCardRep(4).card);
WResourceManager::Instance()->RetrieveCard(getCardRep(2).card);
WResourceManager::Instance()->RetrieveCard(getCardRep(5).card);
WResourceManager::Instance()->RetrieveCard(getCardRep(1).card);
WResourceManager::Instance()->RetrieveCard(getCardRep(6).card);
}
renderCard(6);
renderCard(5);
renderCard(4);
renderCard(0);
if (mRotation < 0.5 && mRotation > -0.5)
{
renderCard(1);
renderCard(3);
renderCard(2);
}
else if (mRotation < -0.5)
{
renderCard(3);
renderCard(2);
renderCard(1);
}
}
MTGCard * CarouselDeckView::Click(int x, int y)
{
int n = getCardIndexNextTo(x, y);
last_user_activity = 0;
//clicked active card, and no animation is running
if(n == 2 && mStage == NONE)
{
return getActiveCard();
}
//clicked not the active card, start animation:s
if(n != 2 && mStage == NONE)
{
mScrollTarget = n;
mStage = SCROLL_TO_SELECTED;
}
return NULL;
}
bool CarouselDeckView::Button(Buttons button)
{
switch(button)
{
case JGE_BTN_LEFT:
mScrollTarget -= 1;
mStage = SCROLL_TO_SELECTED;
last_user_activity = 0;
break;
case JGE_BTN_RIGHT:
mScrollTarget += 1;
mStage = SCROLL_TO_SELECTED;
last_user_activity = 0;
break;
case JGE_BTN_UP:
mStage = SLIDE_UP;
SwitchFilter(1);
last_user_activity = 0;
break;
case JGE_BTN_DOWN:
mStage = SLIDE_DOWN;
SwitchFilter(-1);
last_user_activity = 0;
break;
default:
return false;
}
return true;
}
MTGCard *CarouselDeckView::getActiveCard()
{
return getCardRep(2).card;
}