void CStatsSession::CreateCopyAnimation (const RECT &rcRect, int iDuration, IAnimatron **retpAni) // CreateCopyAnimation // // Flashes a rect to indicate that the information was copied { const CVisualPalette &VI = m_HI.GetVisuals(); IAnimatron *pAni; CAniRect::Create(CVector(rcRect.left, rcRect.top), CVector(RectWidth(rcRect), RectHeight(rcRect)), VI.GetColor(colorTextFade), 255, &pAni); // Fade it CLinearFade *pFader = new CLinearFade; pFader->SetParams(iDuration, 0, iDuration, 128); pAni->AnimateProperty(PROP_OPACITY, pFader, 0); // Done *retpAni = pAni; }
void CreateGameStatsAnimation (const CGameStats &GameStats, const RECT rcRect, int xCenterLine, IAnimatron **retpAni) // CreateGameStatsAnimation // // Create animation showing all the stats { int i; const CString &sDefaultSectionName = GameStats.GetDefaultSectionName(); // Get some resources const CVisualPalette &VI = g_pHI->GetVisuals(); WORD wTextHighlightColor = VI.GetColor(colorTextHighlight); WORD wTextFadeColor = VI.GetColor(colorTextFade); const CG16bitFont &SubTitleFont = VI.GetFont(fontSubTitle); const CG16bitFont &HeaderFont = VI.GetFont(fontHeader); const CG16bitFont &LargeFont = VI.GetFont(fontLarge); // Figure out the position int x = xCenterLine; int y = rcRect.top; int yEnd = rcRect.bottom - HeaderFont.GetHeight(); int cxWidth = rcRect.right - x; // Adjust because scroller does not clip at the bottom int cyHeight = yEnd - y; // Create a scrolling area and a list scroller CAniVScroller *pAni = new CAniVScroller; pAni->SetPropertyVector(CONSTLIT("position"), CVector((Metric)x, (Metric)y)); pAni->SetPropertyMetric(CONSTLIT("viewportHeight"), (Metric)cyHeight); pAni->SetPropertyMetric(CONSTLIT("fadeEdgeHeight"), (Metric)(cyHeight / 8)); CListScroller *pScroller = new CListScroller; pAni->AnimateProperty(PROP_SCROLL_POS, pScroller, 0, ID_GAME_STAT_SCROLLER); // The first scroll position is the list at the bottom, offscreen pScroller->AddScrollPos(-cyHeight); // Add a rect that we use to highlight selection. // We add it first because it paints behind everything IAnimatron *pRect; CAniRect::Create(CVector(0.0, 0.0), CVector(0.0, 0.0), wTextFadeColor, 0, &pRect); pRect->SetID(ID_GAME_STAT_SELECT_RECT); pAni->AddLine(pRect); // Some offsets int yNameOffset = HeaderFont.GetAscent() - LargeFont.GetAscent(); // Add the text CString sPrevSection = CONSTLIT("(start)"); for (i = 0; i < GameStats.GetCount(); i++) { IAnimatron *pText; // Get the stats CString sName; CString sValue; CString sSection; GameStats.GetEntry(i, &sName, &sValue, &sSection); // Compute the vertical position of this line Metric yLine = pAni->GetHeight(); // If necessary, add a new section header if (!strEquals(sSection, sPrevSection)) { if (i != 0) yLine += SubTitleFont.GetHeight(); CAniText::Create(strToLower(sSection.IsBlank() ? sDefaultSectionName : sSection), CVector(0.0, yLine), &SubTitleFont, CG16bitFont::AlignCenter, wTextFadeColor, &pText); pAni->AddLine(pText); yLine += 2 * SubTitleFont.GetHeight(); sPrevSection = sSection; } // Each scroll position places the line 1/3 of the way down pScroller->AddScrollPos(yLine - (cyHeight / 3), yLine); // Right-justify the name Metric xSpacing = 10.0; Metric xName = (sValue.IsBlank() ? -(LargeFont.MeasureText(sName) / 2) : -(LargeFont.MeasureText(sName) + xSpacing)); // Add two text lines CAniText::Create(sName, CVector(xName, yLine + yNameOffset), &LargeFont, 0, wTextHighlightColor, &pText); pAni->AddLine(pText); if (!sValue.IsBlank()) { // Wrap, if necessary TArray<CString> Lines; HeaderFont.BreakText(sValue, (rcRect.right - xCenterLine) - 2 * (int)xSpacing, &Lines); for (int j = 0; j < Lines.GetCount(); j++) { CAniText::Create(Lines[j], CVector(xSpacing, yLine + j * HeaderFont.GetHeight()), &HeaderFont, 0, wTextFadeColor, &pText); pAni->AddLine(pText); } } } // The last position is the list scrolled off top pScroller->AddScrollPos(pAni->GetHeight()); // Initiate scroll from start to end pScroller->SetScrollToPos(-1, 1.0); // Create animation that fades out the whole list after a while CLinearFade *pFader = new CLinearFade; pFader->SetParams(pScroller->GetDuration() + GAME_STAT_DURATION, 0, 30); pAni->AnimateProperty(PROP_OPACITY, pFader, 0, ID_GAME_STAT_FADER); // Done *retpAni = pAni; }
void CTextCrawlSession::CreateCrawlAnimation (const CString &sText, const RECT &rcRect, IAnimatron **retpAni) // CreateCrawlAnimation // // Creates the prologue and epilogue animation { int i; const CVisualPalette &VI = m_HI.GetVisuals(); const CG16bitFont &SubTitleFont = VI.GetFont(fontSubTitle); CG32bitPixel rgbColor = VI.GetColor(colorTextAltHighlight); // Adjust because scroller does not clip at the bottom int cyHeight = RectHeight(rcRect) - SubTitleFont.GetHeight(); // Create a scroller CAniVScroller *pAni = new CAniVScroller; pAni->SetPropertyVector(PROP_POSITION, CVector((Metric)rcRect.left, (Metric)rcRect.top)); pAni->SetPropertyMetric(PROP_VIEWPORT_HEIGHT, (Metric)cyHeight); pAni->SetPropertyMetric(PROP_FADE_EDGE_HEIGHT, (Metric)(cyHeight / 8)); // Add the text TArray<CString> Lines; SubTitleFont.BreakText(sText, RectWidth(rcRect), &Lines); for (i = 0; i < Lines.GetCount(); i++) { IAnimatron *pText; CAniText::Create(Lines[i], CVector(0.0, pAni->GetHeight()), &SubTitleFont, 0, rgbColor, &pText); pAni->AddLine(pText); } // Scroll from the bottom until the text is centered. // Compute the center position (remember that coordinates are cartessian; down is negative) int yPos = -((RectHeight(rcRect) - (SubTitleFont.GetHeight() * Lines.GetCount())) / 2); CLinearMetric *pScroller = new CLinearMetric; pScroller->SetParams(-cyHeight, yPos, CRAWL_SPEED); pScroller->AddListener(EVENT_ON_ANIMATION_DONE, this, CMD_SHOW_OK_BUTTON); pAni->AnimateProperty(PROP_SCROLL_POS, pScroller, 0); // After the scrolling is done, fade-out CLinearFade *pFader = new CLinearFade; pFader->SetParams(pScroller->GetDuration() + CRAWL_DURATION, 0, 30); pAni->AnimateProperty(PROP_OPACITY, pFader, 0); // Done *retpAni = pAni; }
void SelectGameStat (IAnimatron *pAni, int iStatPos, int cxWidth, int iDuration) // SelectGameStat // // Selects the next game stat { const CVisualPalette &VI = g_pHI->GetVisuals(); int cySelection = VI.GetFont(fontHeader).GetHeight(); // Get the scroller CListScroller *pScroller; if (!pAni->FindAnimation(ID_GAME_STAT_SCROLLER, (IPropertyAnimator **)&pScroller)) return; int iPos = pScroller->GetCurScrollPos(); // Handle special positions switch (iStatPos) { case GAME_STAT_POSITION_NEXT: iStatPos = iPos + 1; break; case GAME_STAT_POSITION_PREV: iStatPos = iPos - 1; break; case GAME_STAT_POSITION_NEXT_PAGE: iStatPos = iPos + 8; break; case GAME_STAT_POSITION_PREV_PAGE: iStatPos = iPos - 8; break; case GAME_STAT_POSITION_HOME: iStatPos = 1; break; case GAME_STAT_POSITION_END: iStatPos = pScroller->GetCount() - 2; break; } // Make sure we're in bounds int iNewPos = Max(1, Min(iStatPos, pScroller->GetCount() - 2)); // Set the scroll position pScroller->SetScrollToPos(iNewPos, -6.0); // Fader CLinearFade *pFader; if (!pAni->FindAnimation(ID_GAME_STAT_FADER, (IPropertyAnimator **)&pFader)) return; if (iDuration == durationInfinite) pFader->SetParams(durationInfinite, 0, 0); else pFader->SetParams(pScroller->GetDuration() + iDuration, 0, 30); // Set the selection to the proper spot IAnimatron *pSelRect; if (pAni->FindElement(ID_GAME_STAT_SELECT_RECT, &pSelRect)) { Metric yPos; pScroller->GetScrollPos(iNewPos, &yPos); pSelRect->SetPropertyVector(PROP_POSITION, CVector(-cxWidth / 2, yPos)); pSelRect->SetPropertyVector(PROP_SCALE, CVector(cxWidth, cySelection)); pSelRect->SetPropertyOpacity(PROP_OPACITY, GAME_STAT_SELECTION_OPACITY); } }