/// <summary> /// Передвижение змейки /// </summary> private void _moveSnake() { _wasMove = true; //Потенциальная точка в игровом поле (где окажется голова змейки) MatrixIdModel newCoods = new MatrixIdModel() { x = (SnakeCoods[0].x + (int)MotionVector.x), y = (SnakeCoods[0].y + (int)MotionVector.y) }; //Проверка потенциальной точки switch (GameMatrix[newCoods.x][newCoods.y].CellState) { case Initialize.EnumСell.Food: newCoods = _willEatFood(newCoods); break; case Initialize.EnumСell.Block: // Змейка врезалась и погибла StateController.ChangeState(StateController.EnumStateType.DieSnake); return; case Initialize.EnumСell.Teleport: // Змейка телепортировалась (край карты) newCoods = GameMatrix[newCoods.x][newCoods.y].TeleportPosition; break; } // Передвижение for (int i = 0; i < SnakeCoods.Count; i++) { var snakePartGO = GameMatrix[SnakeCoods[i].x][SnakeCoods[i].y].CellGO; // Перемещаем часть змейки snakePartGO.transform.position = GameMatrix[newCoods.x][newCoods.y].Position; GameMatrix[newCoods.x][newCoods.y].CellGO = snakePartGO; GameMatrix[newCoods.x][newCoods.y].CellState = Initialize.EnumСell.Block; // Очищаем освободившеюся часть GameMatrix[SnakeCoods[i].x][SnakeCoods[i].y].CellGO = null; GameMatrix[SnakeCoods[i].x][SnakeCoods[i].y].CellState = Initialize.EnumСell.Empty; var currentCood = newCoods; // Изменяем потенциальную точку newCoods = SnakeCoods[i]; // Изменяем координаты змейки SnakeCoods[i] = currentCood; } // Змейка сьела фрукт и должна вырости if (GameMatrix[newCoods.x][newCoods.y].Ate) { GameMatrix[newCoods.x][newCoods.y].Ate = false; StateController.StartSnakeState.CreateSnakePoint(newCoods); } }
/// <summary> /// Создание части змейки /// </summary> /// <param name="coods"></param> /// <param name="head"></param> public void CreateSnakePoint(MatrixIdModel coods, bool head = false) { GameObject newGO = (head ? new GameObject("SnakeHead") : new GameObject("SnakeBody")); newGO.AddComponent <Image>().color = (head ? Color.yellow : Color.white); newGO.GetComponent <RectTransform>().sizeDelta = SnakePartSize; newGO.transform.SetParent(TSnakeParent); newGO.transform.position = StateController.MoveSnakeState.GameMatrix[(int)coods.x][(int)coods.y].Position; StateController.MoveSnakeState.GameMatrix[coods.x][coods.y].CellGO = newGO; StateController.MoveSnakeState.GameMatrix[coods.x][coods.y].CellState = Initialize.EnumСell.Block; StateController.MoveSnakeState.SnakeCoods.Add(new MatrixIdModel() { x = coods.x, y = coods.y }); }
/// <summary> /// Поедание "фрукта" /// </summary> /// <param name="coordinates"></param> /// <returns> возвращаем возможно изменённый newCoods </returns> private MatrixIdModel _willEatFood(MatrixIdModel coordinates) { bool willReturn = (GameMatrix[coordinates.x][coordinates.y].Food == Initialize.EnumFood.SwitchFood); StateController.EatSnakeState.EatedFoodCood = coordinates; StateController.ChangeState(StateController.EnumStateType.EatSnake); //Если фрукт был - switch, изменяем потенциальную точку if (willReturn) { coordinates = new MatrixIdModel() { x = (SnakeCoods[0].x + (int)MotionVector.x), y = (SnakeCoods[0].y + (int)MotionVector.y) }; } return(coordinates); }