/// <summary> /// Get ammo packs attributes /// </summary> /// <param name="xmlDoc">XML document that contains the attributes</param> public static void LoadAmmoPacksAttributes(XmlDocument xmlDoc, ref GameEntityList sceneObjects) { Debug.Assert(xmlDoc != null); Debug.Assert(sceneObjects != null); //try to get ammopack list XmlNodeList nodeList = xmlDoc.GetElementsByTagName("ammopacks"); if (nodeList.Count > 0) //if XML has ammopacks... { //get list of ammopacks in scene XmlElement nodeElement = (XmlElement)nodeList.Item(0); //List available gun types in project List<String> guntypeNames = new List<String>(Enum.GetNames(typeof(GunType))); Int32[] guntypeValues = (Int32[])Enum.GetValues(typeof(GunType)); //get all ammopacks definitions from XML file foreach (XmlElement xmle in nodeElement.ChildNodes) { AmmoPack ap = new AmmoPack(); String assetName = null; try { assetName = Convert.ToString(xmle.GetAttribute("name")); Int32 position = guntypeNames.IndexOf(xmle.GetAttribute("guntype")); ap.Quantity = Convert.ToInt32(xmle.GetAttribute("quantity")); ap.GunType = (GunType)guntypeValues[position]; } catch (FormatException fe) { Log.Write("BuildObjectsList: FormatExpcetion raised"); Log.Write(fe.Message); } catch (IndexOutOfRangeException ioore) { Log.Write("BuildObjectsList: IndexOutOfRangeException raised"); Log.Write(ioore.Message); } catch (InvalidCastException ice) { Log.Write("BuildObjectsList: InvalidCastExpcetion raised (did you forget some ammopack setting?)"); Log.Write(ice.Message); } sceneObjects.Add(assetName, ap); } } }
/// <summary> /// Get ammo packs attributes /// </summary> /// <param name="xmlDoc">XML document that contains the attributes</param> public static void LoadGunsAttributes(XmlDocument xmlDoc, ref GameEntityList sceneObjects) { Debug.Assert(xmlDoc != null); Debug.Assert(sceneObjects != null); XmlNodeList nodeList = xmlDoc.GetElementsByTagName("guns"); if (nodeList.Count > 0) //if XML has ammopacks... { //get list of guns in scene XmlElement nodeElement = (XmlElement)nodeList.Item(0); //List available gun types in project List<String> guntypeNames = new List<String>(Enum.GetNames(typeof(GunType))); Int32[] guntypeValues = (Int32[])Enum.GetValues(typeof(GunType)); //get all guns definitions from XML file foreach (XmlElement xmle in nodeElement.ChildNodes) { String assetName = null; Gun g = new Gun(); try { assetName = Convert.ToString(xmle.GetAttribute("name")); g.NumberOfBullets = Convert.ToInt32(xmle.GetAttribute("bullets")); //traduz o string em um tipo enumerado Int32 position = guntypeNames.IndexOf(xmle.GetAttribute("guntype")); g.GunType = (GunType)guntypeValues[position]; g.IsRotatable = Convert.ToBoolean(xmle.GetAttribute("isRotatable")); if (g.IsRotatable == true) g.AngleOffset = Convert.ToSingle(xmle.GetAttribute("angleOffset")); String spriteName = Convert.ToString(xmle.GetAttribute("spriteAssetName")); String bulletAssetName = Convert.ToString(xmle.GetAttribute("bulletAssetName")); Model bulletModel = SystemResources.Content.Load<Model>(@bulletAssetName); int bulletLifeTime = Convert.ToInt32(xmle.GetAttribute("bulletLifeTime")); g.Sprite = SystemResources.Content.Load<Texture2D>(@spriteName); g.Bullet = new Bullet(bulletLifeTime, bulletModel.Meshes[0]); g.Bullet.Damage = Convert.ToInt32(xmle.GetAttribute("bulletDamage")); g.Bullet.BulletModel = bulletModel; } catch (InvalidCastException e) { Log.Write("BuildObjectsList: InvalidCastExpcetion raised (did you forget some ammopack setting?)"); Log.Write(e.Message); } sceneObjects.Add(assetName, g); } } }
/// <summary> /// Get med packs attributes /// </summary> /// <param name="xmlDoc">XML document that contains the attributes</param> public static void LoadMedPacksAttributes(XmlDocument xmlDoc, ref GameEntityList sceneObjects) { Debug.Assert(xmlDoc != null); Debug.Assert(sceneObjects != null); //try to get medpack list XmlNodeList nodeList = xmlDoc.GetElementsByTagName("medpacks"); if (nodeList.Count > 0) { XmlElement nodeElement = (XmlElement)nodeList.Item(0); foreach (XmlElement xmle in nodeElement.ChildNodes) { MedPack mp = new MedPack(); String assetName = null; try { assetName = Convert.ToString(xmle.GetAttribute("name")); mp.Quantity = Convert.ToInt32(xmle.GetAttribute("quantity")); } catch (InvalidCastException e) { Log.Write("BuildObjectsList: InvalidCastExpcetion raised (did you forget some medpack setting?)"); Log.Write(e.Message); } sceneObjects.Add(assetName, mp); } } }
/// <summary> /// Check collisions for dynamic objects /// </summary> public virtual void CheckCollisions(GameTime gameTime) { GameEntityList deadObjects = new GameEntityList(); CollisionBox cameraBox = new CollisionBox(this.camera.box); cameraBox.min += this.camera.world.Translation; cameraBox.max += this.camera.world.Translation; cameraBox.min.Y -= this.camera.head_height + this.camera.step_height; cameraBox.max.Y += this.camera.head_height + this.camera.step_height; ///Dynamic objects with player foreach (GameEntity ge in this.sceneObjects.Values) { if (cameraBox.BoxIntersect(ge.Box)) { if (ge is ICatchable) { ((ICatchable)ge).Attach(this.player); deadObjects.Add(ge.ModelMesh.Name, ge); ge.ModelMesh.Tag = null; } else if (ge is IAttachable) { if (ge is GameObjectEntity) this.player.Add((GameObjectEntity)ge); } } ge.Update(gameTime, this.collisionMesh); } foreach (GameEntity ge in deadObjects.Values) { this.sceneObjects.Remove(ge.ModelMesh.Name); } deadObjects.Clear(); ///Enemies with player foreach (Enemy e in this.enemies.Values) { if (e.ActualAnimationState != GameEntityAnimationState.Die) { if (cameraBox.BoxIntersect(e.Box)) { this.SendMessage(player, e, GameEntityMessageType.Hit, gameTime); } } e.Update(gameTime, this.collisionMesh); } ///Bullets with enemies, static objects... foreach (Bullet b in this.bullets) { Vector3 position = b.Position; Vector3 speed = b.Speed; Vector3 new_pos = position + speed * (float)gameTime.ElapsedGameTime.TotalSeconds; this.collisionMesh.PointMove(position, new_pos, 1.0f, 1.0f, 3, out position); //these are discartable, just to pass to the PointIntersect method as out parameters float intersect_distance; Vector3 intersect_position = new Vector3(); Vector3 intersection_normal = new Vector3(); //collision of bullets with static scenario (walls, etc.) if (this.collisionMesh.PointIntersect(position, new_pos, out intersect_distance, out intersect_position, out intersection_normal)) { b.Dead = true; } //collision of bullets with enemies foreach (Enemy e in this.enemies.Values) { if (e.Box.PointInside(b.Position)) { b.Dead = true; SendMessage(b, e, GameEntityMessageType.Damage, gameTime); if (e.Health >= 10) SendMessage(b, e, GameEntityMessageType.Hit, gameTime); } } b.Position = position; b.Speed = speed; } }