public bool ReadFromFile(string fName) { if (fName != "") { if (System.IO.File.Exists(fName)) { XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.IgnoreWhitespace = true; settings.IgnoreComments = true; XmlReader reader = XmlReader.Create(fName, settings); while (reader.Read()) { if (reader.IsStartElement("mainInfo")) { reader.ReadStartElement("mainInfo"); reader.ReadStartElement("width"); width = reader.ReadContentAsInt(); reader.ReadEndElement(); reader.ReadStartElement("heigth"); heigth = reader.ReadContentAsInt(); reader.ReadEndElement(); levelItems = new List <Item> [width, heigth]; } else if (reader.IsStartElement("Item")) { reader.ReadStartElement("Item"); reader.ReadStartElement("x"); int x = reader.ReadContentAsInt(); reader.ReadEndElement(); reader.ReadStartElement("y"); int y = reader.ReadContentAsInt(); reader.ReadEndElement(); reader.ReadStartElement("code"); int code = reader.ReadContentAsInt(); reader.ReadEndElement(); if (levelItems[x, y] == null) { levelItems[x, y] = new List <Item>(); } Item newItem = ItemsCollection.GetItemByCode(code); newItem.XPos = x; newItem.YPos = y; levelItems[x, y].Add(newItem); } } reader.Close(); return(true); } } return(false); }
public void MoveAction(Graphics g, MoveDirections moveDirections) { if (finished) { return; } if (secondsCounterTimer.Enabled == false) { secondsCounterTimer.Enabled = true; } // проверяем есть ли кого двигать if (currManPosX == -1 || currManPosY == -1) { bool founded = false; // выполняем проход по элементам и ищем человечка for (int i = 0; i < width; i++) { for (int j = 0; j < heigth; j++) { if (levelItems[i, j] != null) { foreach (Item itm in levelItems[i, j]) { if (itm.ItemType == ItemType.Man) { founded = true; currManPosX = itm.XPos; currManPosY = itm.YPos; } } } } } if (!founded) { throw new Exception("Некого двигать!"); } } int offsetX = 0, offsetY = 0; switch (moveDirections) { case MoveDirections.Rigth: offsetX = 1; if (currManPosX + offsetX >= width) { return; } break; case MoveDirections.Left: offsetX = -1; if (currManPosX + offsetX < 0) { return; } break; case MoveDirections.Up: offsetY = -1; if (currManPosY + offsetY < 0) { return; } break; case MoveDirections.Down: offsetY = 1; if (currManPosY + offsetY >= heigth) { return; } break; } if (levelItems[currManPosX + offsetX, currManPosY + offsetY] != null) { foreach (Item item in levelItems[currManPosX + offsetX, currManPosY + offsetY]) { if (item.ItemType == ItemType.Wall) // стенка? { return; } if (item.ItemType == ItemType.Package) // коробка и ее необходимо сдвинуть... { bool move = false; switch (moveDirections) { case MoveDirections.Rigth: offsetX = 1; if (currManPosX + (offsetX * 2) >= width) { return; } break; case MoveDirections.Left: offsetX = -1; if (currManPosX + (offsetX * 2) < 0) { return; } break; case MoveDirections.Up: offsetY = -1; if (currManPosY + (offsetY * 2) < 0) { return; } break; case MoveDirections.Down: offsetY = 1; if (currManPosY + (offsetY * 2) >= heigth) { return; } break; } //проверяем возможность движения коробки вправо // если коробку не куда двигать, отменяем действие if (levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)] != null) { foreach (Item itm in levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)]) { if (itm.ItemType == ItemType.Wall) // стенка? { return; } if (itm.ItemType == ItemType.Package) // другая коробка? { return; } } move = true; } if (move) // двигаем! { Item PckgToDel = null; // у старой позиции удаляем коробку foreach (Item itm in levelItems[currManPosX + offsetX, currManPosY + offsetY]) { if (item.ItemType == ItemType.Package) { PckgToDel = item; } } if (PckgToDel != null) { levelItems[currManPosX + offsetX, currManPosY + offsetY].Remove(PckgToDel); } // добавляем коробку в новое положение // проверяем есть ли во всех элементах goal, если есть то вид коробки нужно изменить // создаем новый вид человечка в соответствии с направлением движения Item newBoxItem; switch (item.Code) { case 4: case 6: newBoxItem = new Item(ItemsCollection.GetItemByCode(4)); foreach (Item itm in levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)]) { if (itm.Code == 5) { newBoxItem = new Item(ItemsCollection.GetItemByCode(6)); } } break; case 27: case 29: newBoxItem = new Item(ItemsCollection.GetItemByCode(27)); foreach (Item itm in levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)]) { if (itm.Code == 28) { newBoxItem = new Item(ItemsCollection.GetItemByCode(29)); } } break; case 30: case 32: newBoxItem = new Item(ItemsCollection.GetItemByCode(30)); foreach (Item itm in levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)]) { if (itm.Code == 31) { newBoxItem = new Item(ItemsCollection.GetItemByCode(32)); } } break; default: return; } newBoxItem.XPos = currManPosX + (offsetX * 2); newBoxItem.YPos = currManPosY + (offsetY * 2); levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)].Add(newBoxItem); RedrawItemAtCoords(g, currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)); break; } else { return; } } } Item ManToDel = null; // у старой позиции удаляем человечка foreach (Item item in levelItems[currManPosX, currManPosY]) { if (item.ItemType == ItemType.Man) { ManToDel = item; } } if (ManToDel != null) { levelItems[currManPosX, currManPosY].Remove(ManToDel); } RedrawItemAtCoords(g, currManPosX, currManPosY); // перерисовывает старую позицию уже без человечка // создаем новый вид человечка в соответствии с направлением движения Item newManItem = null; switch (moveDirections) { case MoveDirections.Rigth: newManItem = new Item(ItemsCollection.GetItemByCode(23)); break; case MoveDirections.Left: newManItem = new Item(ItemsCollection.GetItemByCode(24)); break; case MoveDirections.Up: newManItem = new Item(ItemsCollection.GetItemByCode(22)); break; case MoveDirections.Down: newManItem = new Item(ItemsCollection.GetItemByCode(25)); break; } currManPosX = currManPosX + offsetX; currManPosY = currManPosY + offsetY; newManItem.XPos = currManPosX; newManItem.YPos = currManPosY; // добавляем человечка на новой позиции levelItems[currManPosX, currManPosY].Add(newManItem); RedrawItemAtCoords(g, currManPosX, currManPosY); movesCnt++; isFinished(); } }