甜品消消乐 09 填充的核心算法

填充,
1.最下面的一排是不需要判断的,因为不会往下移动了,从倒数第二排开始判断,
2.首先拿到位置上甜品的类型(空的或普通的),判断其当前是否可以移动,普通的可以移动
3.然后遍历甜品正下方的位置是否为空,若为空则可以移动
4.甜品之前的位置会变空,那会在改位置生成新的甜品
5.最上面的一行如果为空的话,不能填充新的甜品,因为上面没有东西了,这时候应该要想到,在第一行那里产生负一行(用来产生元素),当判断第一行的某个位置为空时,在这个位置的正上方产生对应的甜品向下填充

每一行及第一次移动都是由for (int x = 0; x < xCloumb; x++)创建,每一行的第二次至第row -1 次移动由for (int y = yRow - 2; y >= 0 ; y–)完成。

 /// <summary>
    /// 全部填充的方法
    /// </summary>
    public void AllFill()
    {
      if(fillNotFonished = true)
        {
            Fill();
        }
       
    }
    private void Update()
    {
        AllFill();
    }
    /// <summary>
    /// 部分填充的方法
    /// </summary>
     bool fillNotFonished = false; //判断本次填充是否完成
    public bool Fill()
    {
        //最下面的一排是不需要判断的  最下面一排是yRow-1  y--:从下往上遍历
        for (int y = yRow - 2;y>= 0;y--) 
        {
            for (int x = 0; x < xColumn; x++)
            {
                GameSweet sweet = sweets[x,y]; //取到当前元素位置的甜品对象
                if(sweet.CanMove()) 
                {
                    //如果可以填充  要取到他正下方元素的位置
                    GameSweet sweetBelow = sweets[x,y+1];
                    //垂直填充
                    if (sweetBelow.Type == SweetsType.EMPTY)//垂直填充
                    {
                        Destroy(sweetBelow.gameObject); //删除当前位置空物体
                        sweet.MovedComponent.Move(x, y + 1, fillTime);//当前位置的甜品对象向下移动
                        sweets[x, y + 1] = sweet;//对甜品位置进行更新
                        CreateNewSweet(x, y, SweetsType.EMPTY);//把原来位置的元素置空
                        filledNotFinished = true;
                    }
                }
            }
        }
        //最上排的特殊情况
        for (int x = 0; x < xColumn; x++)
        {
            GameSweet sweet = sweets[x, 0];//得到最上排的甜品对象

            if (sweet.Type == SweetsType.EMPTY)//最上排甜品对象类型为空  进行实例化操作
            {
                GameObject newSweet = Instantiate(sweetPrefabDict[SweetsType.NORMAL], CorrectPositon(x, -1), Quaternion.identity);
                newSweet.transform.parent = transform;

                sweets[x, 0] = newSweet.GetComponent<GameSweet>();
                sweets[x, 0].Init(x, -1, this, SweetsType.NORMAL);
                sweets[x, 0].MovedComponent.Move(x, 0, fillTime);//当前位置为(x,-1) ,目标位置为(x, 0)
                sweets[x, 0].ColoredComponent.SetColor((ColorSweet.ColorType)Random.Range(0, sweets[x, 0].ColoredComponent.NumColors));
                filledNotFinished = true;
            }
        }
        return fillNotFonished;
    }
    //全部填充的方法
    public IEnumerator AllFill()
    {
            while (Fill())
            {
                yield return new WaitForSeconds(fillTime);
            }
    }

在Start方法中进行调用开启填充
StartCoroutine(AllFill());

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页