Files
wagic/projects/mtg/src/GridDeckView.cpp
2013-12-05 23:06:32 +01:00

176 lines
4.1 KiB
C++

#include "GridDeckView.h"
const float GridDeckView::scroll_animation_duration = 0.3f;
const float GridDeckView::slide_animation_duration = 0.4f;
const float GridDeckView::card_scale_small = 0.48f;
const float GridDeckView::card_scale_big = 0.7f;
GridDeckView::GridDeckView()
: DeckView(16), mCols(8), mRows(2), mSlide(0), mScrollOffset(0), mCurrentSelection(-1)
{
}
GridDeckView::~GridDeckView()
{
}
void GridDeckView::Reset()
{
mSlide.finish();
mScrollOffset.finish();
mCurrentSelection = 0;
}
void GridDeckView::UpdateViewState(float dt)
{
if(!mScrollOffset.finished())
{
mScrollOffset.update(dt);
if(mScrollOffset.finished())
{
if(mScrollOffset.start_value > mScrollOffset.value)
{
deck()->next();
deck()->next();
mCurrentSelection = (mCurrentSelection >= 6) ? mCurrentSelection - 2 : -1;
}
else if(mScrollOffset.start_value < mScrollOffset.value)
{
deck()->prev();
deck()->prev();
mCurrentSelection = (mCurrentSelection >= 0 && mCurrentSelection < 10) ? mCurrentSelection + 2 : -1;
}
reloadIndexes();
mScrollOffset.value = 0;
}
dirtyCardPos = true;
}
if(!mSlide.finished())
{
mSlide.update(dt);
if(mSlide.value < mSlide.start_value){
//going downwards
if(mSlide.value < -1.0f){
mSlide.translate(2.0f);
SwitchFilter(1);
}
} else if(mSlide.value > mSlide.start_value){
//upwards
if(mSlide.value > 1.0f){
mSlide.translate(-2.0f);
SwitchFilter(-1);
}
}
dirtyCardPos = true;
}
}
void GridDeckView::UpdateCardPosition(CardRep &rep, int index)
{
int col = index / mRows;
int row = index % mRows;
float colWidth = SCREEN_WIDTH_F / (mCols - 3);
float rowHeight = SCREEN_HEIGHT_F / mRows;
rep.x = (col + mScrollOffset.value) * colWidth - colWidth;
rep.y = row * rowHeight + mSlide.value*SCREEN_HEIGHT + rowHeight/2;
if(mCurrentSelection == index)
{
rep.scale = card_scale_big;
if(row == 0){
rep.y += rowHeight * (card_scale_big - card_scale_small);
}else{
rep.y -= rowHeight * (card_scale_big - card_scale_small);
}
}else{
rep.scale = card_scale_small;
}
}
void GridDeckView::Render()
{
for(int i = 0; i < int(mCards.size()); ++i)
{
WResourceManager::Instance()->RetrieveCard(getCardRep(i).card);
if(mCurrentSelection != i)
{
renderCard(i, 255);
}
}
if(2 <= mCurrentSelection && mCurrentSelection < 12){
renderCard(mCurrentSelection, 255);
}
}
MTGCard * GridDeckView::Click(int x, int y)
{
int n = getCardIndexNextTo(x, y);
last_user_activity = 0;
if(mScrollOffset.finished() && mSlide.finished())
{ //clicked and no animations running
if(n == mCurrentSelection)
{
return getActiveCard();
}
else if(n < 4)
{
changePosition(-1);
}
else if(n >= 12)
{
changePosition(1);
}
else
{
mCurrentSelection = n;
dirtyCardPos = true;
}
}
return NULL;
}
void GridDeckView::changePosition(int offset)
{
if(offset < 0){
mScrollOffset.start( 1.0f, scroll_animation_duration);
}else if(offset > 0){
mScrollOffset.start(-1.0f, scroll_animation_duration);
}
last_user_activity = 0;
}
void GridDeckView::changeFilter(int offset)
{
if(offset < 0){
mSlide.start(-2.0f, slide_animation_duration);
}else if(offset > 0){
mSlide.start(2.0f, slide_animation_duration);
}
last_user_activity = 0;
}
MTGCard* GridDeckView::getActiveCard()
{
if(mCurrentSelection >= 0 && mCurrentSelection < int(mCards.size()))
{
return mCards[mCurrentSelection].card;
}
else
{
return NULL;
}
}