public static SpriteAnimationData CreateAnimation(Texture2D atlas, ref SpriteAnimationConfig config) { SpriteAnimationData result = null; if (config.TileCount > 0 || config.TileDim.X > 0 || config.TileDim.Y > 0) { result = new SpriteAnimationData() { Config = config }; result.Frames.Capacity = config.TileCount; int numCols = atlas.Width / config.TileDim.X; int numRows = atlas.Height / config.TileDim.Y; result.TileSheet = atlas; int spriteIndex = 0; for (int row = 0; row < numRows; row++) { for (int col = 0; col < numCols; col++, spriteIndex++) { if (spriteIndex >= config.TileCount) { goto DONE_LABEL; } SpriteAnimationFrame frame = new SpriteAnimationFrame { Offset = new Point(col, row) * config.TileDim }; result.Frames.Add(frame); } } DONE_LABEL :; } return(result); }
public static SpriteAnimationData GetAnimation(SpriteAnimationType animType) { Debug.Assert(_content != null, "Not initialized."); SpriteAnimationData result = _known[(int)animType]; if (result == null) { const float owliverHotspotY = 170.0f; SpriteAnimationConfig config = SpriteAnimationConfig.Default; switch (animType) { case SpriteAnimationType.Owliver_Idle_Stick_Left: { config.TileSheetName = "owliver_idle_front_left_spritesheet"; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(125, owliverHotspotY); } break; case SpriteAnimationType.Owliver_Idle_Stick_Right: { config.TileSheetName = "owliver_idle_front_left_spritesheet"; config.SpriteEffects = SpriteEffects.FlipHorizontally; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(129, owliverHotspotY); } break; case SpriteAnimationType.Owliver_Walk_Stick_Left: { config.TileSheetName = "owliver_walk_front_left_spritesheet"; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(125, owliverHotspotY); } break; case SpriteAnimationType.Owliver_Walk_Stick_Right: { config.TileSheetName = "owliver_walk_front_left_spritesheet"; config.SpriteEffects = SpriteEffects.FlipHorizontally; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(129, owliverHotspotY); } break; case SpriteAnimationType.Owliver_Attack_Stick_Left: { config.TileSheetName = "owliver_attack_spritesheet"; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(169, owliverHotspotY); config.TileCount = 5; config.PingPong = false; config.NumLoopsToPlay = 1; } break; case SpriteAnimationType.Owliver_Attack_Stick_Right: { config.TileSheetName = "owliver_attack_spritesheet"; config.SpriteEffects = SpriteEffects.FlipHorizontally; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(86, owliverHotspotY); config.TileCount = 5; config.PingPong = false; config.NumLoopsToPlay = 1; } break; case SpriteAnimationType.Owliver_Idle_FishingRod_Left: { config.TileSheetName = "owliver_idle_fishingrod_spritesheet"; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(125, owliverHotspotY); } break; case SpriteAnimationType.Owliver_Idle_FishingRod_Right: { config.TileSheetName = "owliver_idle_fishingrod_spritesheet"; config.SpriteEffects = SpriteEffects.FlipHorizontally; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(129, owliverHotspotY); } break; case SpriteAnimationType.Owliver_Walk_FishingRod_Left: { config.TileSheetName = "owliver_walk_fishingrod_spritesheet"; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(125, owliverHotspotY); } break; case SpriteAnimationType.Owliver_Walk_FishingRod_Right: { config.TileSheetName = "owliver_walk_fishingrod_spritesheet"; config.SpriteEffects = SpriteEffects.FlipHorizontally; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(129, owliverHotspotY); } break; case SpriteAnimationType.Owliver_Attack_FishingRod_Left: { config.TileSheetName = "owliver_attack_fishingrod_spritesheet"; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(169, owliverHotspotY); config.TileCount = 5; config.PingPong = false; config.NumLoopsToPlay = 1; } break; case SpriteAnimationType.Owliver_Attack_FishingRod_Right: { config.TileSheetName = "owliver_attack_fishingrod_spritesheet"; config.SpriteEffects = SpriteEffects.FlipHorizontally; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(86, owliverHotspotY); config.TileCount = 5; config.PingPong = false; config.NumLoopsToPlay = 1; } break; case SpriteAnimationType.Slurp_Idle_Left: { config.TileSheetName = "slurp_spritesheet"; config.TileCount = 7; config.TileDim = new Point(210, 270); config.Hotspot = 0.5f * config.TileDim.ToVector2(); config.Scale = Global.SlurpScale; } break; case SpriteAnimationType.Slurp_Idle_Right: { config.SpriteEffects = SpriteEffects.FlipHorizontally; } goto case SpriteAnimationType.Slurp_Idle_Left; case SpriteAnimationType.Singer_Idle_Left: { // TODO(manu) config.TileSheetName = "slurp_spritesheet"; config.TileCount = 7; config.TileDim = new Point(210, 270); config.Hotspot = 0.5f * config.TileDim.ToVector2(); config.Scale = Global.SingerScale; config.SpriteEffects |= SpriteEffects.FlipVertically; } break; case SpriteAnimationType.Singer_Idle_Right: { config.SpriteEffects |= SpriteEffects.FlipHorizontally; } goto case SpriteAnimationType.Singer_Idle_Left; case SpriteAnimationType.Shopkeeper_Idle_Front: { config.TileSheetName = "shopkeeper_spritesheet"; config.Scale = Global.OwliverScale; config.Hotspot = new Vector2(137, 236); } break; case SpriteAnimationType.Shop: { config.TileSheetName = "shop_spritesheet"; config.TileDim = new Point(512); config.Hotspot = new Vector2(261, 415); } break; case SpriteAnimationType.PriceTag_20: { config.TileSheetName = "pricetag_20_spritesheet"; config.TileDim = new Point(128); config.Hotspot = new Vector2(61, 100); } break; case SpriteAnimationType.PriceTag_100: { config.TileSheetName = "pricetag_100_spritesheet"; config.TileDim = new Point(128); config.Hotspot = new Vector2(61, 100); } break; case SpriteAnimationType.Gate_Closed: { config.TileSheetName = "gate_spritesheet"; config.TileDim = new Point(1024); config.Hotspot = new Vector2(560); } break; case SpriteAnimationType.Gate_Open: { config.TileSheetName = "gate_open_spritesheet"; config.TileDim = new Point(1024); config.Hotspot = new Vector2(560); } break; case SpriteAnimationType.Tankton_Idle_Left: { config.SpriteEffects = SpriteEffects.FlipHorizontally; } goto case SpriteAnimationType.Tankton_Idle_Right; case SpriteAnimationType.Tankton_Idle_Right: { config.TileSheetName = "boss_spritesheet"; config.TileDim = new Point(512); config.Hotspot = new Vector2(256, 450); config.Scale = Global.TanktonScale; config.PingPong = false; config.SecondsPerFrame *= 2; } break; case SpriteAnimationType.Fir_Idle: { config.TileSheetName = "fir_spritesheet"; config.Hotspot = new Vector2(136, 235); } break; case SpriteAnimationType.FirAlt_Idle: { config.TileSheetName = "fir_spritesheet"; config.Hotspot = new Vector2(128, 17); } break; case SpriteAnimationType.Conifer_Idle: { config.TileSheetName = "conifer_spritesheet"; config.Hotspot = new Vector2(134, 233); } break; case SpriteAnimationType.ConiferAlt_Idle: { config.TileSheetName = "conifer_spritesheet"; config.Hotspot = new Vector2(135, 18); } break; case SpriteAnimationType.Oak_Idle: { config.TileSheetName = "oak_spritesheet"; config.Hotspot = new Vector2(126, 224); } break; case SpriteAnimationType.Orange_Idle: { config.TileSheetName = "orange_spritesheet"; config.Hotspot = new Vector2(127, 227); } break; case SpriteAnimationType.Bush_Idle: { config.TileSheetName = "bush_spritesheet"; config.Hotspot = new Vector2(130, 212); } break; case SpriteAnimationType.Key_Gold: { config.TileSheetName = "key_spritesheet"; config.TileDim = new Point(128); config.Hotspot = 0.5f * config.TileDim.ToVector2(); config.Scale = new Vector2(0.5f); } break; case SpriteAnimationType.Bonbon_Gold: { config.TileSheetName = "bonbon_gold"; config.TileDim = new Point(64); config.Hotspot = new Vector2(32); } break; case SpriteAnimationType.Bonbon_Red: { config.TileSheetName = "bonbon_red"; config.TileDim = new Point(64); config.Hotspot = new Vector2(32); } break; case SpriteAnimationType.FruitBowl: { config.TileSheetName = "fruitbowl_spritesheet"; config.TileDim = new Point(128); config.Hotspot = new Vector2(62, 82); } break; case SpriteAnimationType.Stick_Left: { config.TileSheetName = "stick_spritesheet"; config.TileDim = new Point(128); config.Hotspot = new Vector2(94, 92); } break; case SpriteAnimationType.FishingRod_Left: { config.TileSheetName = "fishingrod_spritesheet"; config.TileDim = new Point(128); config.Hotspot = new Vector2(106, 104); } break; case SpriteAnimationType.Cross: { config.TileSheetName = "cross"; config.TileDim = new Point(64); config.Hotspot = new Vector2(32); config.Scale = new Vector2(0.5f); } break; case SpriteAnimationType.Digit0: case SpriteAnimationType.Digit1: case SpriteAnimationType.Digit2: case SpriteAnimationType.Digit3: case SpriteAnimationType.Digit4: case SpriteAnimationType.Digit5: case SpriteAnimationType.Digit6: case SpriteAnimationType.Digit7: case SpriteAnimationType.Digit8: case SpriteAnimationType.Digit9: { int digit = animType - SpriteAnimationType.Digit0; config.TileSheetName = $"digits/{digit}"; config.TileDim = new Point(64); config.Hotspot = new Vector2(32); config.Scale = new Vector2(0.5f); // TODO(manu): Remove this once we have all digits. if (digit > 2) { config.TileSheetName = $"cross"; } } break; case SpriteAnimationType.OwlHealthIcon: { config.TileSheetName = "health_icon_spritesheet"; config.TileDim = new Point(128); config.Hotspot = 0.5f * config.TileDim.ToVector2(); config.Scale = new Vector2(0.5f); } break; default: throw new ArgumentException("Unknown sprite animation type."); } if (config.TileSheetName != null) { result = CreateAnimation(ref config); _known[(int)animType] = result; } } return(result); }
public static SpriteAnimationData CreateAnimation(ref SpriteAnimationConfig config) { Texture2D atlas = _content.Load <Texture2D>(config.TileSheetName); return(CreateAnimation(atlas, ref config)); }
public static SpriteAnimationData CreateAnimation(SpriteAnimationConfig config) { return(CreateAnimation(ref config)); }