public XmlWrite() { // initialise levelFolder StaticVariables.execFolder = AppDomain.CurrentDomain.BaseDirectory; StaticVariables.levelFolder = StaticVariables.execFolder; // create world this.w = new World(10, 10); // fill world this.w.FillWorld(TERRAIN.grass_normal, new Size(10, 10)); // initialize player this.w.InitPlayer(new PointF(5, 5)); this.p = w.getPlayer(); LevelWriter.saveWorld(this.w, this.file); beforelist = new TerrainTile[w.getTerrain().Count]; before = new Entity[w.getEntities().Count]; // save beforlist w.getTerrain().CopyTo(beforelist); w.getEntities().CopyTo(before); world = new World(10, 10); world.loadLevel(this.file); afterlist = new TerrainTile[world.getTerrain().Count]; after = new Entity[world.getEntities().Count]; // save afterlist world.getTerrain().CopyTo(afterlist); world.getEntities().CopyTo(after); }
public static void saveWorld(World world, String fileName) { List<TerrainTile> tiles = world.getTerrain (); List<Entity> entities = world.getEntities (); Size size = world.getSize (); using (XmlWriter writer = XmlWriter.Create(Path.Combine(StaticVariables.levelFolder, fileName + ".xml"))) { writer.WriteStartDocument(); writer.WriteStartElement("world"); writer.WriteStartElement("size"); writer.WriteElementString(xmlVar.Width, size.Width.ToString()); writer.WriteElementString(xmlVar.Height, size.Width.ToString()); writer.WriteEndElement(); writer.WriteStartElement("tiles"); foreach (TerrainTile tile in tiles) { writer.WriteStartElement(xmlVar.Tile); writer.WriteElementString(xmlVar.ID, tile.getID().ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteStartElement("entities"); foreach (Entity e in entities) { writer.WriteStartElement(xmlVar.Entity); writer.WriteElementString(xmlVar.ID, e.getID().ToString()); writer.WriteElementString(xmlVar.Type, ((int)e.getType()).ToString()); writer.WriteElementString(xmlVar.SpriteID, e.getSpriteID().ToString()); writer.WriteElementString("x", e.getLocation().X.ToString()); writer.WriteElementString("y", e.getLocation().Y.ToString()); writer.WriteElementString(xmlVar.Solid, e.getSolid().ToString()); writer.WriteElementString(xmlVar.DrawOrder, e.getDrawOrder().ToString()); writer.WriteElementString(xmlVar.BoudingBox, e.getBoundingBox().ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndDocument(); } }
/// <summary> /// Drop first item in inventory back into the world /// </summary> /// <param name="world"></param> public void DropItem(World world) { PointF dropLocation = GetLocationInFrontOfPlayer(); // Check if item can be dropped on target from dropLocation bool isLand = world.getTerraintile(dropLocation).IsWalkable; bool hasSolidEntitiesOnTarget = world.checkCollision(this, dropLocation); List<Entity> entitiesOnTerrainTile = world.getEntitiesOnTerrainTile(location); List<Entity> entitiesOnTargetTerrainTile = world.getEntitiesOnTerrainTile(dropLocation); bool hasWaterlilyOnTarget = entitiesOnTargetTerrainTile.Exists(e => e.getSpriteID() == (int) SPRITES.waterlily); // If no item exists in inventory or // there is a solid target on dropLocation or // targettile is not land, return if (!Inventory.Any() || hasSolidEntitiesOnTarget || (!isLand && !hasWaterlilyOnTarget)) return; // If item is key, lock door if (Inventory[0].Entity is Key) { // If player is standing in a door, cancel action if (entitiesOnTerrainTile.Exists(e => e is Door)) return; world.LockDoor((Key)Inventory[0].Entity); } // Set droplocation on item Inventory[0].Entity.setLocation(dropLocation); // Push item in world objects list world.getEntities().Add(Inventory[0].Entity); // Remove item from inventory Inventory.RemoveAt(0); }
/// <summary> /// Pickup first item on given tile /// </summary> /// <param name="w"></param> public void PickupItems(World w) { if (Inventory.Count >= 10) return; // Get a list with nonSolid entities on terrain tile and filter for bananas or keys List<Entity> EntitiesOnTile = w.getEntitiesOnTerrainTile(getLocation(), true) .Where(e => e.getType() == ENTITIES.fruit || e.getType() == ENTITIES.key) .ToList(); // If there's nothing in the list of entities, return; if (EntitiesOnTile.Count == 0) return; // Add first item of list to inventory Inventory.Add(new Item(EntitiesOnTile[0])); // If key is picked up, unlock door if (EntitiesOnTile[0] is Key) w.UnlockDoor((Key)EntitiesOnTile[0]); // Remove item from world w.getEntities().Remove(EntitiesOnTile[0]); }
/// <summary> /// Moves the player to the given relative location /// </summary> /// <param name="sender"></param> /// <param name="relativeLocation"></param> public override void move(World sender, PointF relativeLocation) { float moveLocationX = location.X + relativeLocation.X; float moveLocationY = location.Y + relativeLocation.Y; PointF targetPoint = new PointF(moveLocationX, moveLocationY); TerrainTile targetTile = sender.getTerraintile (targetPoint); // If terrain contains solid objects OR if tile has no walkable entity on a non-walkable tile if (targetTile == null || sender.checkCollision(this, targetPoint) || !targetTile.IsWalkable && !sender.checkCollision(this, targetPoint, false)) return; location.X = (float)Math.Round(moveLocationX, 1); location.Y = (float)Math.Round(moveLocationY, 1); //Check if the player is moving on a entity and call oncolission of that entity List<Entity> entities = sender.getEntities(); for(int i = 0; i < entities.Count; i++) { if(sender.checkCollision(this, entities[i]) && entities[i].getType() != ENTITIES.player) { entities[i].onCollision(this); } } }