/// <summary> /// Function initializes the catapult instance and loads the animations from XML definition sheet /// </summary> public override void Initialize() { // Define initial state of the catapult IsActive = true; AnimationRunning = false; currentState = CatapultState.Idle; stallUpdateCycles = 0; // Load multiple animations form XML definition XDocument doc = null; #if ANDROID using(var stream = Game.Activity.Assets.Open(@"Content/Textures/Catapults/AnimationsDef.xml")) { doc = XDocument.Load(stream); } #else doc = XDocument.Load("Content/Textures/Catapults/AnimationsDef.xml"); #endif XName name = XName.Get("Definition"); var definitions = doc.Document.Descendants(name); // Loop over all definitions in XML foreach (var animationDefinition in definitions) { bool? toLoad = null; bool val; if (bool.TryParse(animationDefinition.Attribute("IsAI").Value, out val)) toLoad = val; // Check if the animation definition need to be loaded for current catapult if (toLoad == isAI || null == toLoad) { // Get a name of the animation string animatonAlias = animationDefinition.Attribute("Alias").Value; Texture2D texture = curGame.Content.Load<Texture2D>(animationDefinition.Attribute("SheetName").Value); // Get the frame size (width & height) Point frameSize = new Point(); frameSize.X = int.Parse(animationDefinition.Attribute("FrameWidth").Value); frameSize.Y = int.Parse(animationDefinition.Attribute("FrameHeight").Value); // Get the frames sheet dimensions Point sheetSize = new Point(); sheetSize.X = int.Parse(animationDefinition.Attribute("SheetColumns").Value); sheetSize.Y = int.Parse(animationDefinition.Attribute("SheetRows").Value); // If definition has a "SplitFrame" - means that other animation should start here - load it if (null != animationDefinition.Attribute("SplitFrame")) splitFrames.Add(animatonAlias, int.Parse(animationDefinition.Attribute("SplitFrame").Value)); // Defing animation speed TimeSpan frameInterval = TimeSpan.FromSeconds((float)1 / int.Parse(animationDefinition.Attribute("Speed").Value)); Animation animation = new Animation(texture, frameSize, sheetSize); // If definition has an offset defined - means that it should be rendered relatively // to some element/other animation - load it if (null != animationDefinition.Attribute("OffsetX") && null != animationDefinition.Attribute("OffsetY")) { animation.Offset = new Vector2(int.Parse(animationDefinition.Attribute("OffsetX").Value), int.Parse(animationDefinition.Attribute("OffsetY").Value)); } animations.Add(animatonAlias, animation); } } // Load the textures idleTexture = curGame.Content.Load<Texture2D>(idleTextureName); // Initialize the projectile Vector2 projectileStartPosition; if (isAI) projectileStartPosition = new Vector2(630, 340); else projectileStartPosition = new Vector2(175, 340); projectile = new Projectile(curGame, spriteBatch, "Textures/Ammo/rock_ammo", projectileStartPosition, animations["Fire"].FrameSize.Y, isAI, gravity); projectile.Initialize(); // Initialize randomizer random = new Random(); base.Initialize(); }