using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using RecrownedAthenaeum.Camera; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RecrownedAthenaeum.UI.Book { public class Book { Camera2D camera; Page targetPage; Rectangle dimensions; Dictionary pages = new Dictionary(); /// /// Should be called whenever a valid camera and dimensions for the book exist. /// Initializes book with given parameters. /// /// Camera game is currently using. /// Dimensions of the book and the dimensions the pages will use. public void Initiate(Camera2D camera, Rectangle dimensions) { this.camera = camera; this.dimensions = dimensions; } public void Draw(SpriteBatch batch) { for (int pageIndex = 0; pageIndex < pages.Count; pageIndex++) { Page page = pages.ElementAt(pageIndex).Value; page.Draw(batch); } } public void Update(GameTime gameTime) { if (targetPage != null) { Vector2 position; Rectangle targetBounds = targetPage.bounds; position.X = targetBounds.X + (targetBounds.Width * 0.5f); position.Y = targetBounds.Y + (targetBounds.Height * 0.5f); camera.LinearInterpolationToPosition(0.4f, position, (float)gameTime.ElapsedGameTime.TotalSeconds); if (camera.Position == position) { targetPage = null; } } for (int pageIndex = 0; pageIndex < pages.Count; pageIndex++) { Page page = pages.ElementAt(pageIndex).Value; if (page.NeedsSizeUpdate) page.ApplySize(dimensions.Width, dimensions.Height); page.Update(gameTime); } } public void AddPages(params Page[] pages) { foreach (Page page in pages) { this.pages.Add(page.Name, page); } } public void RemovePage(Page page) { RemovePage(page.Name); } public void RemovePage(string name) { pages.Remove(name); } public void LerpToPage(Page page) { targetPage = page; } public void GoToPage(Page page) { Rectangle targetBounds = page.bounds; camera.Position.X = targetBounds.X + (targetBounds.Width * 0.5f); camera.Position.Y = targetBounds.Y + (targetBounds.Height * 0.5f); } } }