void OnClick(SwipeComponent obj) { if (!isSwiping) { MatchElement clickedElement = (MatchElement)obj; if (selectedElement == null) { selectedElement = clickedElement; selectedElement.StartTweenScale(); } else { // одинаковый ряд, проверяем соседство в колонке if (selectedElement.match.Y == clickedElement.match.Y && (Mathf.Abs(selectedElement.match.X - clickedElement.match.X) == 1)) { SwipeObjects(selectedElement, clickedElement); } // одинаковая колонка, проверяем соседство в ряду else if (selectedElement.match.X == clickedElement.match.X && (Mathf.Abs(selectedElement.match.Y - clickedElement.match.Y) == 1)) { SwipeObjects(selectedElement, clickedElement); } // нет соседства, скидываем выбор с первой фишки else { selectedElement.StopTween(); selectedElement = clickedElement; selectedElement.StartTweenScale(); } } } }
void SwipeObjects(MatchElement from, MatchElement to) { isSwiping = true; if (selectedElement != null) { selectedElement.StopTween(); } selectedElement = null; Match3SceneManager.Instance.PlaySwipeSound(); // отсоеденяем от елемента в гриду to.transform.SetParent(gameObject.transform); from.transform.SetParent(gameObject.transform); Vector3 toPos = to.transform.position; Vector3 fromPos = from.transform.position; //свайпаем if (Match3SceneManager.Instance.TryToMatch(from.match, to.match)) // оправляем в клас проверки { //обмениваем значения X и Y int tmpX = from.match.X; int tmpY = from.match.Y; from.match.X = to.match.X; from.match.Y = to.match.Y; to.match.X = tmpX; to.match.Y = tmpY; currentMatchObjects[to.match.X, to.match.Y] = to; currentMatchObjects[from.match.X, from.match.Y] = from; //двигаем фишки to.transform.DOMove(fromPos, 0.2f); from.transform.DOMove(toPos, 0.2f).OnComplete(() => { //возврощаем в грид to.transform.SetParent(Match3SceneManager.Instance.GetPositionInGrid(to.match.X, to.match.Y)); from.transform.SetParent(Match3SceneManager.Instance.GetPositionInGrid(from.match.X, from.match.Y)); // даем знак прощитать текущую комбинацию и ждем ответ с масивом обектов которих нужно будет удалить Match3SceneManager.Instance.FindRemoveMatches(); }); } else { //двигаем фишки to.transform.DOMove(fromPos, 0.2f).SetLoops(2, LoopType.Yoyo); from.transform.DOMove(toPos, 0.2f).SetLoops(2, LoopType.Yoyo).OnComplete(() => { //возврощаем в грид to.transform.SetParent(Match3SceneManager.Instance.GetPositionInGrid(to.match.X, to.match.Y)); from.transform.SetParent(Match3SceneManager.Instance.GetPositionInGrid(from.match.X, from.match.Y)); isSwiping = false; }); } }
void OnRightSwipe(SwipeComponent obj) { if (!isSwiping) { MatchElement from = (MatchElement)obj; // убедимся, что фишка не выходит за пределы поля if (from.match.X < GlobalGameSettings.Instance.Col) { //достаем обект с которим будем матчить. MatchElement to = currentMatchObjects[from.match.X + 1, from.match.Y]; SwipeObjects(from, to); } } }
void OnDownSwipe(SwipeComponent obj) { if (!isSwiping) { MatchElement from = (MatchElement)obj; // убедимся, что фишка не выходит за пределы поля if (from.match.Y > 0) { //достаем обект с которим будем матчить. MatchElement to = currentMatchObjects[from.match.X, from.match.Y - 1]; SwipeObjects(from, to); } } }
public void CreateMatchElement(Color color, int x, int y, Transform parent) { if (reservedObjectsPool.Count == 0) { MatchElement tmp = Instantiate(MatchElementPrefab, parent); tmp.Initialize(x, y, color); tmp.OnClickEvent += OnClick; tmp.OnUpSwipeEvent += OnUpSwipe; tmp.OnDownSwipeEvent += OnDownSwipe; tmp.OnLeftSwipeEvent += OnLeftSwipe; tmp.OnRightSwipeEvent += OnRightSwipe; tmp.OnHideElement += OnHideElement; currentMatchObjects[x, y] = tmp; } else { MatchElement tmp = reservedObjectsPool[0]; tmp.Initialize(x, y, color); tmp.transform.SetParent(parent, false); tmp.transform.localPosition = Vector3.zero; currentMatchObjects[x, y] = tmp; reservedObjectsPool.RemoveAt(0); } }