//鼠标操作交换位置时 public void ExChangeSweets(GameSweet sweetOnclick1, GameSweet sweetOnclick2) { if (sweetOnclick1.Equals(sweetOnclick2)) { return; } if (sweetOnclick1.CanMove() && sweetOnclick2.CanMove()) { sweetsarray[sweetOnclick1.Y, sweetOnclick1.X] = sweetOnclick2; sweetsarray[sweetOnclick2.Y, sweetOnclick2.X] = sweetOnclick1;//记录位子更新 if (MatchSweets(sweetOnclick1, sweetOnclick2.X, sweetOnclick2.Y) != null || MatchSweets(sweetOnclick2, sweetOnclick1.X, sweetOnclick1.Y) != null || sweetOnclick1.Type == SweetsType.RAINBOWCANDY || sweetOnclick2.Type == SweetsType.RAINBOWCANDY)//可以交换时 { sweetsarray[sweetOnclick1.Y, sweetOnclick1.X] = sweetOnclick2; sweetsarray[sweetOnclick2.Y, sweetOnclick2.X] = sweetOnclick1;//记录位子更新 int tempx = sweetOnclick1.X , tempy = sweetOnclick1.Y; sweetOnclick1.MoveComponent.Move(sweetOnclick2.X, sweetOnclick2.Y, fillTime); sweetOnclick2.MoveComponent.Move(tempx, tempy, fillTime); if (sweetOnclick1.Type == SweetsType.RAINBOWCANDY && sweetOnclick1.CanClear() && sweetOnclick2.CanClear()) { ClearColorSweet clearcolor = sweetOnclick1.GetComponent <ClearColorSweet>(); if (clearcolor != null) { clearcolor.ClearColor = sweetOnclick2.ColorComponent.Color; } ClearSweet(sweetOnclick1.X, sweetOnclick1.Y); } if (sweetOnclick2.Type == SweetsType.RAINBOWCANDY && sweetOnclick1.CanClear() && sweetOnclick2.CanClear()) { ClearColorSweet clearcolor = sweetOnclick2.GetComponent <ClearColorSweet>(); if (clearcolor != null) { clearcolor.ClearColor = sweetOnclick1.ColorComponent.Color; } ClearSweet(sweetOnclick2.X, sweetOnclick2.Y); } pressedSweet = null; enteredSweet = null; ClearAllMatchedSweet(); StartCoroutine(AllFill()); } else { sweetsarray[sweetOnclick1.Y, sweetOnclick1.X] = sweetOnclick1; sweetsarray[sweetOnclick2.Y, sweetOnclick2.X] = sweetOnclick2;//记录位子更新 } } }
//交换两个甜品的方法 private void ExchangeSweets(GameSweet sweet1, GameSweet sweet2) { if (sweet1.CanMove() && sweet2.CanMove()) { sweets[sweet1.X, sweet1.Y] = sweet2; sweets[sweet2.X, sweet2.Y] = sweet1; if (MatchSweets(sweet1, sweet2.X, sweet2.Y) != null || MatchSweets(sweet2, sweet1.X, sweet1.Y) != null || sweet1.Type == SweetsType.RAINBOWCANDY || sweet2.Type == SweetsType.RAINBOWCANDY) { int tempX = sweet1.X; int tempY = sweet1.Y; sweet1.MovedComponent.Move(sweet2.X, sweet2.Y, fillTime); sweet2.MovedComponent.Move(tempX, tempY, fillTime); if (sweet1.Type == SweetsType.RAINBOWCANDY && sweet1.CanClear() && sweet2.CanClear()) { ClearColorSweet clearColor = sweet1.GetComponent <ClearColorSweet>(); if (clearColor != null) { clearColor.ClearColor = sweet2.ColoredComponent.Color; } ClearSweet(sweet1.X, sweet1.Y); } if (sweet2.Type == SweetsType.RAINBOWCANDY && sweet2.CanClear() && sweet1.CanClear()) { ClearColorSweet clearColor = sweet2.GetComponent <ClearColorSweet>(); if (clearColor != null) { clearColor.ClearColor = sweet1.ColoredComponent.Color; } ClearSweet(sweet2.X, sweet2.Y); } ClearAllMatchedSweet(); StartCoroutine(AllFill()); pressedSweet = null; enteredSweet = null; } else { sweets[sweet1.X, sweet1.Y] = sweet1; sweets[sweet2.X, sweet2.Y] = sweet2; } } }
/// <summary> /// 交换物品位置 /// </summary> /// <param name="sweet1"></param> /// <param name="sweet2"></param> private void ExChangeSweets(GameSweet sweet1, GameSweet sweet2) { if (sweet1.CanMove() && sweet2.CanMove()) //如果2个物品都能移动 { sweets[sweet1.X, sweet1.Y] = sweet2; sweets[sweet2.X, sweet2.Y] = sweet1; if (MatchSweets(sweet1, sweet2.X, sweet2.Y) != null || MatchSweets(sweet2, sweet1.X, sweet1.Y) != null || sweet1.Type == SweetsType.RAINBOWCANDY || sweet2.Type == SweetsType.RAINBOWCANDY) //如果完成匹配 { int tempX = sweet1.X; int tempY = sweet1.Y; sweet1.MovedComponet.Move(sweet2.X, sweet2.Y, fillTime); sweet2.MovedComponet.Move(tempX, tempY, fillTime); if (sweet1.Type == SweetsType.RAINBOWCANDY && sweet1.CanClear() && sweet2.CanClear()) //如果物品1是 特殊物品:消除颜色 { ClearColorSweet clearColor = sweet1.GetComponent <ClearColorSweet>(); if (clearColor != null) //容错 { clearColor.ClearColor = sweet2.ColorComponet.Color; } ClearSweet(sweet1.X, sweet1.Y); } if (sweet2.Type == SweetsType.RAINBOWCANDY && sweet2.CanClear() && sweet2.CanClear()) //如果物品2是 特殊物品:消除颜色 { ClearColorSweet clearColor = sweet2.GetComponent <ClearColorSweet>(); if (clearColor != null) { clearColor.ClearColor = sweet1.ColorComponet.Color; } ClearSweet(sweet2.X, sweet2.Y); } ClearAllMatchedSweet(); //交换位置后,清除物品,并生成空格 StartCoroutine(AllFill()); //交换位置后填充 pressedSweet = null; enterSweet = null; } else { sweets[sweet1.X, sweet1.Y] = sweet1; sweets[sweet2.X, sweet1.Y] = sweet2; } } }
/// <summary> /// 将两个甜品位置交换 /// </summary> /// <param name="sweet1"></param> /// <param name="sweet2"></param> private void ExchangeSweets(GameSweet sweet1, GameSweet sweet2) { if (sweet1.CanMove() && sweet2.CanMove()) { sweets[sweet1.X, sweet1.Y] = sweet2; sweets[sweet2.X, sweet2.Y] = sweet1; int tempX = sweet1.X; int tempY = sweet1.Y; if (MatchSweets(sweet1, sweet2.X, sweet2.Y) != null || MatchSweets(sweet2, sweet1.X, sweet1.Y) != null || sweet1.Type == SweetType.RAINBOWCANDY || sweet2.Type == SweetType.RAINBOWCANDY) { //如果匹配到了最少三个相同的甜品则交换位置,且不能返回之前的位置 sweet1.MoveSweetComponent.Move(sweet2.X, sweet2.Y, fillTime);//由于两个携程会影响甜品的位置,因此之前要先记录之前的位置 sweet2.MoveSweetComponent.Move(tempX, tempY, fillTime); //如果两个甜品中有最少一个彩虹糖也可进入该语句 if (sweet1.Type == SweetType.RAINBOWCANDY && sweet1.CanClear() && sweet2.CanClear()) { ClearSameSweet clearColor = sweet1.GetComponent <ClearSameSweet>(); if (clearColor != null) { clearColor.Color = sweet2.ColorSweetComponent.Color; } ClearSweet(sweet1.X, sweet1.Y); } if (sweet2.Type == SweetType.RAINBOWCANDY && sweet2.CanClear() && sweet1.CanClear()) { ClearSameSweet clearColor = sweet2.GetComponent <ClearSameSweet>(); if (clearColor != null) { clearColor.Color = sweet1.ColorSweetComponent.Color; } ClearSweet(sweet2.X, sweet2.Y); } ClearAllMatchSweet(); StartCoroutine(AllFill()); } else { //如果没匹配到三个相同的三个元素,则先交换后返回 sweets[sweet1.X, sweet1.Y] = sweet1; sweets[sweet2.X, sweet2.Y] = sweet2; sweet1.MoveSweetComponent.Move(sweet2.X, sweet2.Y, fillTime);//由于两个携程会影响甜品的位置,因此之前要先记录之前的位置 sweet2.MoveSweetComponent.Move(tempX, tempY, fillTime); StartCoroutine(Wait(0.5f, sweet1, sweet2)); } } }
/// <summary> /// 两个甜品位置交换 /// </summary> public void ExChangeSweet(GameSweet sweet1, GameSweet sweet2) { if (sweet1.CanMove() && sweet2.CanMove()) { sweetArr[sweet1.X, sweet1.Y] = sweet2; sweetArr[sweet2.X, sweet2.Y] = sweet1; if (MatchSweets(sweet1, sweet2.X, sweet2.Y) != null || MatchSweets(sweet2, sweet1.X, sweet1.Y) != null || sweet1.Type == SweetsType.RainbowCandy || sweet2.Type == SweetsType.RainbowCandy) { //记录x、y的值 防止sweet1已移动完成后位置跟sweet2重叠 var x = sweet1.X; var y = sweet1.Y; sweet1.moveSweet.Move(sweet2.X, sweet2.Y, fillTime); sweet2.moveSweet.Move(x, y, fillTime); //清除指定颜色所有甜品 if (sweet1.Type == SweetsType.RainbowCandy && sweet1.CanClear() && sweet2.CanClear()) { ClearColorSweet clearColor = sweet1.GetComponent <ClearColorSweet>(); if (clearColor != null) { clearColor.ClearColor = sweet2.colorSweet.colorType; } ClearSweet(sweet1.X, sweet1.Y); } if (sweet2.Type == SweetsType.RainbowCandy && sweet1.CanClear() && sweet2.CanClear()) { ClearColorSweet clearColor = sweet2.GetComponent <ClearColorSweet>(); if (clearColor != null) { clearColor.ClearColor = sweet1.colorSweet.colorType; } ClearSweet(sweet2.X, sweet2.Y); } ClearAllMatchedSweet(); StartCoroutine(AllFill()); clickSweet = null; enterSweet = null; } else { sweetArr[sweet1.X, sweet1.Y] = sweet1; sweetArr[sweet2.X, sweet2.Y] = sweet2; } } }
public bool Fill() { bool filledNotFinshed = false; for (int i = 0; i < xColumns; i++) //最顶层单独填充因此排除,填充方向为Y。 { for (int j = yRows - 2; j >= 0; j--) { GameSweet sweet = sweetsarray[j, i]; if (sweet.CanMove()) { // print(j + "," + i + 1); GameSweet sweetfill = sweetsarray[j + 1, i]; //由于排列时 从顶到底 j+1为下一层 而不是上一层 if (sweetfill.Type == SweetsType.EMPTY) //垂直填充,下方为空块 { Destroy(sweetfill.gameObject); sweet.MoveComponent.Move(i, j + 1, fillTime); sweetsarray[j + 1, i] = sweet; CreateSweet(i, j, SweetsType.EMPTY); filledNotFinshed = true; // print("基本填充" + i + "," + j); } else //下方有障碍时 填充方法 为斜下 左或右 { for (int down = -1; down <= 1; down++)//优先斜左下方滑动 { if (down != 0) { int downx = i + down; if (downx >= 0 && downx < xColumns) { GameSweet downSweet = sweetsarray[j + 1, downx]; if (downSweet.Type == SweetsType.EMPTY) { bool canfill = true; for (int moveY = j; moveY >= 0; moveY--) { GameSweet sweetmoveY = sweetsarray[moveY, downx]; if (sweetmoveY.CanMove()) { break; } else if (!sweetmoveY.CanMove() && sweetmoveY.Type != SweetsType.EMPTY)//斜向填充条件 { canfill = false; break; } } if (!canfill) { Destroy(downSweet.gameObject); sweet.MoveComponent.Move(downx, j + 1, fillTime); sweetsarray[j + 1, downx] = sweet; CreateSweet(i, j, SweetsType.EMPTY); filledNotFinshed = true; } } } } } } } } } for (int i = 0; i < xColumns; i++)//最顶层 { GameSweet sweet = sweetsarray[0, i]; if (sweet.Type == SweetsType.EMPTY)//生成sweet { GameSweet go = Instantiate(sweetPrefabDict[SweetsType.NORMAL], CorrectPosition(i, -1), Quaternion.identity); go.transform.SetParent(transform); sweetsarray[0, i] = go.GetComponent <GameSweet>(); sweetsarray[0, i].Init(i, -1, Instance, SweetsType.NORMAL); sweetsarray[0, i].MoveComponent.Move(i, 0, fillTime); sweetsarray[0, i].ColorComponent.SetColor((ColorSweet.ColorEnum)(Random.Range(0, sweetsarray[0, i].ColorComponent.NumColors))); filledNotFinshed = true; // print("顶层填充" + i + "," + yRows + ",," + xColumns); } } return(filledNotFinshed); }