/* * 캔디가 파괴할때 실행되는 함수 * 캔디크러쉬사가에서는 * 4개가 가로, 세로 직선으로있을때 * 가로일때 - 세로줄 파괴 캔디 1개 생성 * 세로일때 - 가로줄 파괴 캔디 1개 생성 * 5개가 직선으로 있을때 * ColorBoom이 생성되고 ColorBoom을 움직이면 * ColorBoom과 바꾼 Fruit을 보드에서 모두 파괴한다. (가로 세로일 경우 효과 발동됨) */ public void Break(int i, int j) { if (gm.GetBoardState(i, j)) { if (gm.GetBlockObject(i, j) != null) { if (gm.Get_ImBlock(i, j).VerticalBoom == 1) { gm.Get_ImBlock(i, j).VerticalBoom = 0; Debug.Log($"VerticalExplode [{i},{j}]"); Line_Explode(i, j, (int)e_Boom_Number_Type.VerticalBoom); } else if (gm.Get_ImBlock(i, j).HorizontalBoom == 1) { gm.Get_ImBlock(i, j).HorizontalBoom = 0; Debug.Log($"HorizontalExplode [{i},{j}]"); Line_Explode(i, j, (int)e_Boom_Number_Type.HorizontalBoom); } else if (gm.Get_ImBlock(i, j).BagBoom == 1) { gm.Get_ImBlock(i, j).BagBoom = 0; Bag_Explode(i, j, 1); } else { gm.SleepBlocks.Enqueue(gm.GetBlockObject(i, j)); gm.GetBlockObject(i, j).SetActive(false); gm.c_board.V[i].H[j].block.HereBlockObject = null; gm.values.iPoint += 10; gm.values.SetPointText(); } } } }
public int GetThreeMatch() { int Left = 0, Top = 0; for (int i = 8; i >= 0; i--) { for (int j = 9; j >= 1; j--) { // 활성화된 보드만. if (gm.GetBoardState(i, j) && gm.GetBlockObject(i, j) != null) { Left += ThreeMatch_DFS(i, j, 1, -1, gm.Get_ImBlock(i, j).Fruit_Type); Top += ThreeMatch_DFS(i, j, 1, 1, gm.Get_ImBlock(i, j).Fruit_Type); } } } return(Left + Top); }
public void Fill() { /* * 채우기 함수 * 오른쪽 아래에서부터 9x9x9회 반복하며 실행 * 9x9가 아닌 이유는 한번에 1칸씩 내려가기 때문. * 나중에 최적화 필요. */ int[] MakeCount = new int[9]; int d = 0; while (d < 15) { // gm.GetBlock(i,j) // gm.GetBoardState(i,j) d++; for (int i = 0; i < 9; i++) { for (int j = 8; j >= 0; j--) { XY xy = new XY(); // 해당 위치가 활성화 Block if (gm.GetBoardState(i, j)) { // 현재 칸이 null이 아닐때 if (gm.GetBlockObject(i, j) != null) { // 현재 칸의 아래 칸이 비었고, 보드가 true일때 if (gm.GetBoardState(i, j + 1) && gm.GetBlockObject(i, j + 1) == null) { gm.PutBackObject_To_Front(i, j, i, j + 1, xy); //Debug.Log("다음 칸 : x - " + i + ", y - " + (j+1)); continue; } // 왼쪽 하단 체크 if (i >= 1) { // 현재 칸의 왼쪽 하단 칸이 보드가 true에 비었고 , 현재칸의 왼쪽 칸이 false일때 if (gm.GetBoardState(i - 1, j + 1) && gm.GetBlockObject(i - 1, j + 1) == null && gm.GetBoardState(i - 1, j) == false) { gm.PutBackObject_To_Front(i, j, i - 1, j + 1, xy); continue; } } // 오른쪽 하단 체크 else if (i < 8) { // 현재 칸의 오른쪽 하단 칸이 비었고, 보드가 true일때, 현재칸의 오른쪽 칸이 false일때 if (gm.GetBoardState(i + 1, j + 1) && gm.GetBlockObject(i + 1, j + 1) == null && gm.GetBoardState(i + 1, j) == false) { gm.PutBackObject_To_Front(i, j, i + 1, j + 1, xy); continue; } } } } // 최상단일때 else if (j == 0) { if (gm.GetBoardState(i, j + 1) && gm.GetBlockObject(i, j + 1) == null) { MakeCount[i] += 1; GameObject obj = gm.SleepBlocks.Dequeue(); gm.c_board.V[i].H[j + 1].block.HereBlockObject = obj; obj.SetActive(true); obj.transform.position = gm.c_board.V[i].H[j].block.Block_Transform.position; xy.X = i; xy.Y = j + 1; gm.candy_Init.Init(obj); obj.GetComponent <C_ImBlock>().MoveEnQueue(xy, MakeCount[i] / 10f); continue; } } } } } }
// 기본 보드 세팅 public void setting() { // 스테이지 보드 상태, Color 세팅 for (int i = 0; i < 9; i++) { for (int j = 0; j < 10; j++) { if (j == 0) { gm.Board_Pool_Transform.GetChild(i * 10 + j).gameObject.GetComponent <Image>().color = gm.values.BoardOffColor; gm.c_board.V[i].H[j].block.BoardState = false; } else { gm.c_board.V[i].H[j].block.BoardState = true; } } } // 테스트용 보드 false gm.c_board.V[3].H[3].block.BoardState = false; gm.c_board.V[4].H[4].block.BoardState = false; gm.c_board.V[7].H[6].block.BoardState = false; for (int i = 0; i < 9; i++) { for (int j = 0; j < 10; j++) { if (gm.GetBoardState(i, j) == false) { gm.Board_Pool_Transform.GetChild(i * 10 + j).gameObject.GetComponent <Image>().color = gm.values.BoardOffColor; } } } // 테스트용 보드 색변경 // Fruit Pool 생성 for (int i = 0; i < 120; i++) { GameObject NewBlock = gm.MakeObject("ImBlock"); gm.candy_Init.Init(NewBlock); NewBlock.SetActive(false); gm.SleepBlocks.Enqueue(NewBlock); NewBlock.GetComponent <C_ImBlock>().SubscribeEvent(); // MatchComplete 메시지에 대해서 구독, 이후 맵을 생성할때 닫혀있는 맵은 이 함수를 호출하면x, //하게 되면 매치이벤트 발생시 검정색이 흰색으로 돌아올것임. } for (int i = 0; i < 9; i++) { for (int j = 0; j < 10; j++) { gm.c_board.V[i].H[j].block.Block_Transform = gm.Board_Pool_Transform.GetChild(i * 10 + j).gameObject.GetComponent <RectTransform>(); gm.c_board.V[i].H[j].block.xy.X = i; gm.c_board.V[i].H[j].block.xy.Y = j; if (gm.GetBoardState(i, j)) { GameObject block = gm.SleepBlocks.Dequeue(); block.SetActive(true); gm.c_board.V[i].H[j].block.HereBlockObject = block; gm.c_board.V[i].H[j].block.Here_ImBlock = block.GetComponent <C_ImBlock>(); block.transform.position = gm.c_board.V[i].H[j].block.Block_Transform.GetComponent <RectTransform>().position; block.GetComponent <C_ImBlock>().Check_Now_Position(i, j); } } } }