//-------------------------------------------------------------------------------- //스왑 Move가 끝났을 경우에 실행 public void OnEventEndSwap(List <PieceMoveHandler> moveList) { Debug.Log("PanelBoard::OnEventEndSwap"); //match된 Piece들 받을 리스트 List <Node> matchList = new List <Node>(); //움직인 Piece들 기준으로 ThreeMatch 검사 for (int i = 0; i < moveList.Count; ++i) { //매치된 리스트 받아옴 List <Node> tempList = CheckThreeMatch(moveList[i].targetNode.Index); //하나의 리스트로 합친다 MergeNodeList(matchList, tempList); } //매치된게 없다면 다시 되돌려야 함 if (matchList.Count == 0) { //콤보 체크 해제 //mIsComboCheck = false; //스왑으로 이동했으므로 moveList는 2개 PieceMoveEvent moveEvent = new PieceMoveEvent(); Node aNode = moveList[0].targetNode; Node bNode = moveList[1].targetNode; Piece aPiece = aNode.piece; Piece bPiece = bNode.piece; moveEvent.AddMoveHandler(new PieceMoveHandler(aPiece, bNode)); moveEvent.AddMoveHandler(new PieceMoveHandler(bPiece, aNode)); SetPieceToNode(bPiece, aNode); SetPieceToNode(aPiece, bNode); PieceMoveManager.Instance.AddMoveEvent(moveEvent); } else { //콤보체크 재시작 //mIsComboCheck = true; //매치된 리스트들 전부 삭제 for (int i = 0; i < matchList.Count; ++i) { DestroyPiece(matchList[i]); } } }
//-------------------------------------------------------------------------------- public void MoveToSwap(Node a, Node b) { //MoveEvent 생성 PieceMoveEvent moveEvent = new PieceMoveEvent(); Piece aPiece = a.piece; Piece bPiece = b.piece; //aPiece는 bNode로, bPiece는 aNode로 이동 moveEvent.AddMoveHandler(new PieceMoveHandler(aPiece, b)); moveEvent.AddMoveHandler(new PieceMoveHandler(bPiece, a)); //aPiece.transform.DOPunchScale(Vector3.one, 0.4f , 2 ,3); //bPiece.transform.DOPunchScale(Vector3.one, 0.4f , 2 ,3); //해당 Piece들 이동할 Node에 바인딩 SetPieceToNode(bPiece, a); SetPieceToNode(aPiece, b); //이동 끝났을 때 알림받을 함수 바인딩 moveEvent.EventMoveEnd += OnEventEndSwap; PieceMoveManager.Instance.AddMoveEvent(moveEvent); }
//-------------------------------------------------------------------------------- void UpdateGravity() { //어떤 타일을 드래깅 중이라면 Gravity Check 적용 X if (mDragHanlder.IsNull() == false) { return; } //움직임 요청 이벤트 PieceMoveEvent moveEvent = null; for (int x = 0; x < mCellWidthCount; ++x) { int createCount = 0; //해당 행에서 몇개의 새로운 Piece 생성했는지 수 for (int y = mCellHeightCount - 1; y >= 0; --y) //맨 아래 노드들 부터 검사 { Index index = new Index(x, y); //현재 인덱스 Node node = GetNode(index); //현재 노드 if (node.piece != null) { continue; //조각이 있는 노드면 딱히 별도의 처리 필요 X } //조각이 없는 빈 노드라면 위의 노드들을 검사하면서 조각을 찾는다. for (int ny = y - 1; ny >= -1; --ny) { //위에 있는 모든 Node를 검사했는데 해당 노드로 끌어 내릴 조각이 없다는 뜻 => 새로 Piece를 생성해 주어야 한다는 뜻 if (ny == -1) { //새로 생성되어야 할 위치 Vector2 position = new Vector2(); position.x = mStartX + m_cellSize * x; position.y = mStartY + m_cellSize * (createCount + 1); //새 Piece Piece newPiece = CreateRandomPiece(index, position); if (moveEvent == null) { moveEvent = new PieceMoveEvent(); } //새로 생성된 Piece MoveEvent에 추가 moveEvent.AddMoveHandler(new PieceMoveHandler(newPiece, node)); //해당 Piece 목표 Node에 바인딩 SetPieceToNode(newPiece, node); //생성 수 ++ ++createCount; break; } else { //다음 노드 인덱스 Index nextIndex = new Index(x, ny); Node nextNode = GetNode(nextIndex); //다음 노드가 빈 노드라면 스킵 if (nextNode.piece == null) { continue; } //여기까지 왔다면 Piece를 찾았다는 뜻 if (moveEvent == null) { moveEvent = new PieceMoveEvent(); } //해당 Piece targetNode로 끌어내리자 moveEvent.AddMoveHandler(new PieceMoveHandler(nextNode.piece, node)); //해당 Piece node로 바인딩 SetPieceToNode(nextNode.piece, node); //이제 해당 노드에는 piece가 없는 상황 nextNode.piece = null; break; } } } } //MoveEvent가 있다면 if (moveEvent != null) { moveEvent.EventMoveEnd += OnEventGravityEnd; PieceMoveManager.Instance.AddMoveEvent(moveEvent); } }
public void AddMoveEvent(PieceMoveEvent moveEvent) { mEventList.Add(moveEvent); }