public void MoveTo(Creature player, Creature.Direction direction) //перемещает игрока в выбранном направлении { Cell currentCell = GetCell(player.xPos, player.yPos); Cell nextCell = GetNearCell(currentCell, direction); if ((nextCell != null) && (player.currentState != Creature.State.Moving)) // если следующая клетка существует и игрок не двигается, то... { if ((nextCell.Type == Cell.cellType.Open) || (nextCell.Type == Cell.cellType.RedFinish) || (nextCell.Type == Cell.cellType.BlueFinish)) { if (nextCell.isBusy) //если следующая клетка занята кем-то, то переместить его в том же направлении { MoveTo(nextCell.getObject(), direction); //запустить функцию перемещения для объекта, стоящего на следующей клетке if (!nextCell.isBusy) //если после смещения объекта со следующей клетки она освободилась, то спокойно перемещаемся на нее { player.MovingTo(direction); nextCell.setObject(player); player.xPos = nextCell.xPos; player.yPos = nextCell.yPos; currentCell.clearCell(); } } else //если свободна, то спокойно перемещаемся { player.MovingTo(direction); //записать в информацию игрока направление его движения и состояние движения nextCell.setObject(player); //записать игрока в следующую клетку player.xPos = nextCell.xPos; //записать координаты следующей клетки в координаты игрока player.yPos = nextCell.yPos; currentCell.clearCell(); //освободить текущую клетку } } } }
public Cell GetNearCell(Cell currentCell, Creature.Direction direction) //возвращает клетку, которая находится в выбранном направлении от текущей клетки { switch (direction) { case Creature.Direction.Right: return(grid.Find(z => z.xPos == currentCell.xPos + 1 && z.yPos == currentCell.yPos)); case Creature.Direction.Left: return(grid.Find(z => z.xPos == currentCell.xPos - 1 && z.yPos == currentCell.yPos)); case Creature.Direction.Up: return(grid.Find(z => z.xPos == currentCell.xPos && z.yPos == currentCell.yPos - 1)); case Creature.Direction.Down: return(grid.Find(z => z.xPos == currentCell.xPos && z.yPos == currentCell.yPos + 1)); default: return(grid.Find(z => z.xPos == currentCell.xPos && z.yPos == currentCell.yPos)); } }