public IEnumerator Block_Swap(InGame_Block from, InGame_Block to, bool notchange = false, float duration = 0.2f) { var time = System.DateTime.Now; from.transform.DOMove(to.Img_Block.transform.position, duration); to.transform.DOMove(from.Img_Block.transform.position, duration); var nameTemp = from.name; from.name = to.name; to.name = nameTemp; //to.GetComponent<Button>().targetGraphic = to.Img_Block; //from.GetComponent<Button>().targetGraphic = from.Img_Block; yield return(new WaitForSeconds(duration)); if (notchange) { yield break; } GameUtils.Log(new System.TimeSpan(System.DateTime.Now.Ticks - time.Ticks).TotalSeconds.ToString()); StartCoroutine(Check_BlockAsync(from, to)); }
public IEnumerator shake(InGame_Block block, float sec = 0.5f) { block.Img_Block.transform.DOShakePosition(sec, 10); yield return(new WaitForSeconds(sec)); block.Img_Block.sprite = null; block.gameObject.SetActive(false); InGame_Block up = null, left = null, right = null; for (int i = 0; i < blocks.Count; i++) { if (block.GetPos().y + 1 != blocks[i].GetPos().y) { continue; } if (block.GetPos().x == blocks[i].GetPos().x) { up = blocks[i]; } if (block.GetPos().x == blocks[i].GetPos().x + 1) { left = blocks[i]; } if (block.GetPos().x == blocks[i].GetPos().x - 1) { right = blocks[i]; } } }
public IEnumerator Check_BlockAsync(InGame_Block block_1, InGame_Block block_2) { bool second = Check_BlockAsync(block_2); bool first = Check_BlockAsync(block_1); if (first == false && second == false) { GameUtils.Log("Fail to made"); StartCoroutine(Block_Swap(block_1, block_2, true)); } else { yield return(new WaitForSeconds(0.5f)); Drop_Down(); } }
public async Task Select_BlockAsync(Image block) { GameUtils.Log($"{block.GetComponent<InGame_Block>().GetPos()} is selected"); //취소 if (block == selectedBlock) { selectedBlock = null; return; } //변경 if (selectedBlock != null) { var Clicked_Block_pos = block.GetComponent <InGame_Block>().GetPos(); var Selected_Block_pos = selectedBlock.GetComponent <InGame_Block>().GetPos(); bool canChange = Mathf.Abs(Clicked_Block_pos.x - Selected_Block_pos.x) <= 0 || Mathf.Abs(Clicked_Block_pos.y - Selected_Block_pos.y) <= 0; if (canChange) { InGame_Block block_1 = selectedBlock.GetComponent <InGame_Block>(); InGame_Block block_2 = block.GetComponent <InGame_Block>(); StartCoroutine(Block_Swap(block_1, block_2)); //Check_BlockAsync(block_1, block_2); selectedBlock = null; return; } } //선택 selectedBlock = block; }
public bool Check_BlockAsync(InGame_Block block) { bool result = false; #region 가로 체크 InGame_Block[] horizon_arr = new InGame_Block[stage.Width]; foreach (var tile in blocks) { if (tile.GetPos().y != block.GetPos().y) { continue; } int index = (int)tile.GetPos().x + (int)(stage.Width / 2); horizon_arr[index] = tile; } List <InGame_Block> H_clearBlock = new List <InGame_Block>(); for (int i = 0; i < stage.Width; i++) { if (horizon_arr[i].GetIndex() != block.GetIndex()) { if (H_clearBlock.Count < 3) { H_clearBlock.Clear(); } continue; } H_clearBlock.Add(horizon_arr[i]); } if (H_clearBlock.Count < 3) { H_clearBlock.Clear(); } else { GameUtils.Log($"[{block.GetPos()}] 가로 완성 ({H_clearBlock.Count })개 / {block.Img_Block.sprite.name}"); foreach (var img in H_clearBlock) { StartCoroutine(shake(img)); } result = true; } #endregion #region 세로 체크 InGame_Block[] vertical_arr = new InGame_Block[stage.Height]; foreach (var tile in blocks) { if (tile.GetPos().x != block.GetPos().x) { continue; } int index = (int)tile.GetPos().y + (int)(stage.Height / 2); vertical_arr[index] = tile; } List <InGame_Block> V_clearBlock = new List <InGame_Block>(); for (int i = 0; i < stage.Height; i++) { if (vertical_arr[i].GetIndex() != block.GetIndex()) { if (V_clearBlock.Count < 3) { V_clearBlock.Clear(); } continue; } V_clearBlock.Add(vertical_arr[i]); } if (V_clearBlock.Count < 3) { V_clearBlock.Clear(); } else { GameUtils.Log($"[{block.GetPos()}] 세로 완성 ({V_clearBlock.Count })개 / {block.Img_Block.sprite.name}"); foreach (var img in V_clearBlock) { StartCoroutine(shake(img)); } result = true; } #endregion #region 사각형 #endregion return(result); }
public void CheckMap() { bool bcheckmap = false; do { bcheckmap = false; foreach (var block in blocks) { #region 가로 체크 InGame_Block[] horizon_arr = new InGame_Block[stage.Width]; foreach (var tile in blocks) { if (tile.GetPos().y != block.GetPos().y) { continue; } int index = (int)tile.GetPos().x + (int)(stage.Width / 2); horizon_arr[index] = tile; } List <InGame_Block> H_clearBlock = new List <InGame_Block>(); for (int i = 0; i < stage.Width; i++) { if (horizon_arr[i].GetIndex() != block.GetIndex()) { if (H_clearBlock.Count < 3) { H_clearBlock.Clear(); } continue; } H_clearBlock.Add(horizon_arr[i]); } if (H_clearBlock.Count < 3) { H_clearBlock.Clear(); } else { GameUtils.Log("가로 찾음"); block.SetNormalBlock(); bcheckmap = true; } #endregion #region 세로 체크 InGame_Block[] vertical_arr = new InGame_Block[stage.Height]; foreach (var tile in blocks) { if (tile.GetPos().x != block.GetPos().x) { continue; } int index = (int)tile.GetPos().y + (int)(stage.Height / 2); vertical_arr[index] = tile; } List <InGame_Block> V_clearBlock = new List <InGame_Block>(); for (int i = 0; i < stage.Height; i++) { if (vertical_arr[i].GetIndex() != block.GetIndex()) { if (V_clearBlock.Count < 3) { V_clearBlock.Clear(); } continue; } V_clearBlock.Add(vertical_arr[i]); } if (V_clearBlock.Count < 3) { V_clearBlock.Clear(); } else { GameUtils.Log("세로 찾음"); block.SetNormalBlock(); bcheckmap = true; } #endregion } } while (bcheckmap); }