示例#1
0
    public void OperateReverse(Operation op)
    {
        switch (op.opType)
        {
        case 0:
        {
            generalPanelUI.RemovePuzzle(op.opPuzzle, false);
            break;
        }

        case 1:
        {
            PuzzleItemData opPuzzleItemData = op.opPuzzle.GetComponent <PuzzleItemUI>().puzzleItemData;
            generalPanelUI.generalPanelData.ModiLayout(GeneralPanelData.GridType.Blank, opPuzzleItemData);
            opPuzzleItemData.PanelGridIndex = op.lastGridIndex;
            generalPanelUI.InsertPuzzle(op.opPuzzle, false);
            break;
        }

        case 2:
        {
            generalPanelUI.InsertPuzzle(op.opPuzzle, false);
            break;
        }

        default:
            break;
        }
    }
示例#2
0
    public void AddToRedGridIndices(PuzzleItemData puzzleItemData, int[] blankLayout)
    {
        int gridIndex = puzzleItemData.PanelGridIndex;
        int x         = gridIndex % pwidth;
        int y         = gridIndex / pwidth;

        // Debug.Log("GridIndex when show pregrid:" + gridIndex);//!Test

        int[] puzzleLayout = puzzleItemData.Playout;
        //添加redGridIndices
        for (int i = 0; i < puzzleLayout.Length; ++i)
        {
            if (puzzleLayout[i] == 1)
            {
                int ix      = i % puzzleItemData.Pwidth;
                int iy      = i / puzzleItemData.Pwidth;
                int offsetX = ix - puzzleItemData.Pcenter[0];
                int offsetY = iy - puzzleItemData.Pcenter[1];
                if (blankLayout[i] == (int)GridType.Blank || blankLayout[i] == (int)GridType.Fix)
                {
                    int gx = x + offsetX;
                    int gy = y + offsetY;
                    redGridIndices.Add(gx + gy * pwidth);
                }
            }
        }
    }
示例#3
0
    public void UnlockAdPuzzle()
    {
        //TODO:接入广告界面
        AdMgr.GetInstance().showRewardVideo(() =>
        {
            Debug.Log("play ad succ");
            //隐藏广告按钮
            if (puzzleBarForFreeLayoutTrans.childCount > 0)
            {
                puzzleBarForFreeLayoutTrans.GetChild(0).gameObject.SetActive(false);
            }

            //将拼图lockstate设置为false
            if (adPuzzleNum == 1)
            {
                Transform adPuzzleTrans     = this.transform.GetChild(this.transform.childCount - 1);
                PuzzleItemUI adPuzzleUI     = adPuzzleTrans.GetComponent <PuzzleItemUI>();
                PuzzleItemData adPuzzleData = adPuzzleUI.puzzleItemData;
                adPuzzleData.Plockstate     = false;
            }

            //将useflag设为true
            //adPuzzleUseFlag = true;//没有用于实际判断,暂时注释
        },
                                            () =>
        {
            Debug.Log("play ad fail");
        },
                                            () =>
        {
            Debug.Log("close ad");
        });
    }
示例#4
0
    public void InitComp(/*Camera playFieldCamera,*/ GeneralPanelUI generalPanelUI, Transform puzzleMoveTrans, DragController dragController /* , CanvasScaler canvasScaler*/)
    {
        // this.playFieldCamera = playFieldCamera;
        this.generalPanelUI  = generalPanelUI;
        this.puzzleMoveTrans = puzzleMoveTrans;
        this.dragController  = dragController;
        // this.canvasScaler = canvasScaler;

        puzzleItemData           = new PuzzleItemData();
        screenSpaceRectTransform = GetComponent <RectTransform>();

        canRorate = true;
    }
示例#5
0
    public void ShowPreCheckResult(int state, PuzzleItemUI puzzleItemUI = null, int[] blankLayout = null)
    {
        //Fit state:
        //0 表示Fit,
        //1 表示unFit,
        //2 及以上表示没在格子上,全部PreCheck的红绿格都要隐藏
        if (state >= 2)
        {
            ClearBothIndices();
            return;
        }

        //FINISH:bug fixed 旋转之后产生了无法正确对应的问题,有可能是panelgridindex计算出错,真实原因是中心格子下标固定,不需要通过计算获取

        PuzzleItemData puzzleItemData = puzzleItemUI.puzzleItemData;
        int            gridIndex      = puzzleItemData.PanelGridIndex;

        if (generalPanelData.CheckDirtyFlag(gridIndex))
        {
            if (state == 0)//绿色
            {
                //清空greenGridIndices和redGridIndices
                ClearBothIndices();

                //添加greenGridIndices
                generalPanelData.AddToGreenGridIndices(puzzleItemData);

                //显示绿色的grids
                ShowGreenGrids();
            }
            else if (state == 1)//红色
            {
                //清空greenGridIndices和redGridIndices
                ClearBothIndices();

                //添加redGridIndices
                generalPanelData.AddToRedGridIndices(puzzleItemData, blankLayout);

                //显示红色的grid
                ShowRedGrids();
            }
            generalPanelData.LastGridIndex = gridIndex;
        }
        else
        {
            //如果dirtyflag是false,不刷新
            //do nothing
        }
    }
示例#6
0
    public void RefreshSettlePuzzleList()
    {
        m_recoder.settlePuzzleList.Clear();
        int childCount = puzzleContainPanelTrans.childCount;

        for (int i = 0; i < childCount; ++i)
        {
            GameObject puzzle = puzzleContainPanelTrans.GetChild(i).gameObject;
            if (puzzle.activeSelf)
            {
                PuzzleItemUI   settlePuzzleUI   = puzzle.GetComponent <PuzzleItemUI>();
                PuzzleItemData settlePuzzleData = settlePuzzleUI.puzzleItemData;
                SettlePuzzle   settlePuzzle     = new SettlePuzzle(settlePuzzleData.PID, settlePuzzleUI.RotateState, settlePuzzleData.PanelGridIndex);
                m_recoder.settlePuzzleList.Add(settlePuzzle);
            }
        }
    }
示例#7
0
    public void OnDrag(PointerEventData pointerEventData, PuzzleItemUI puzzleItemUI, GeneralPanelUI generalPanelUI)
    {
        if (gameOverFlag)//限制游戏结束时不可拖动
        {
            return;
        }
        if (puzzleItemUI.puzzleItemData.Plockstate)//限制广告方块上锁时不可拖动
        {
            return;
        }
        if (!puzzleItemUI.DraggedState)//限制未设置拖动状态的拼图不可拖动,即被拖动拼图之外其他的拼图
        {
            return;
        }
        if (firstDragPointerID != pointerEventData.pointerId)//限制手指pointerId不同的不可被拖动,可用于限制只能单指操作
        {
            return;
        }



        miniMapController.RefreshFlag = true;


        PuzzleItemData puzzleItemData = puzzleItemUI.puzzleItemData;
        //拖动时拼图跟随手指位置移动
        //FINISH:在此过程中拼图会和面板产生交互

        Vector3 puzzlePosPre = Camera.main.ScreenToWorldPoint(pointerEventData.position) + Vector3.up * upMoveDistance;

        puzzleItemUI.cloneForMove.transform.position = new Vector3(puzzlePosPre.x, puzzlePosPre.y, puzzleItemUI.cloneForMove.transform.position.z);
        curPointerEventData.position = pointerEventData.position;

        int gridIndex = -1;

        int[] blankLayout = null;
        int   interactRet = generalPanelUI.InteractWithPuzzle(puzzleItemUI.cloneForMove.GetComponent <PuzzleItemUI>(), out gridIndex, out blankLayout);

        puzzleItemData.PanelGridIndex = gridIndex;

        generalPanelUI.ShowPreCheckResult(interactRet, puzzleItemUI, blankLayout);

        puzzleItemUI.DraggedState = true;
    }
示例#8
0
    public void MakeMovePuzzle()
    {
        if (cloneForMove == null)
        {
            cloneForMove = GameObject.Instantiate(this.gameObject, puzzleMoveTrans);
            PuzzleItemUI clonePuzzleItemUI = cloneForMove.GetComponent <PuzzleItemUI>();
            clonePuzzleItemUI.puzzleItemData = new PuzzleItemData();
            PuzzleItemData clonePuzzleItemData = clonePuzzleItemUI.puzzleItemData;

            clonePuzzleItemData.InitButtomPuzzleItemData(
                puzzleItemData.PID,
                puzzleItemData.Pwidth,
                puzzleItemData.Pheight,
                puzzleItemData.Playout,
                puzzleItemData.Pcenter);

            clonePuzzleItemUI.screenSpaceRectTransform = this.screenSpaceRectTransform;

            cloneForMove.name = this.gameObject.name + "Move";
        }
        cloneForMove.SetActive(false);
    }
示例#9
0
    public void RemovePuzzle(GameObject puzzle, bool opRecordFlag = true)
    {
        Debug.Log("remove!");
        PuzzleItemUI   puzzleItemUI   = puzzle.GetComponent <PuzzleItemUI>();
        PuzzleItemData puzzleItemData = puzzleItemUI.puzzleItemData;

        //必定是已经摆放了的
        int[] oldLayout = generalPanelData.Playout;
        generalPanelData.ModiLayout(GeneralPanelData.GridType.Blank, puzzleItemData);
        int[] newLayout = generalPanelData.Playout;

        puzzle.SetActive(false);


        if (opRecordFlag)
        {
            // deleteParticleEffect.Play();

            //FINISH:操作历史记录
            Operation op = new Operation(2, oldLayout, newLayout, puzzle);
            operationHistoryRecorder.Record(op);
        }
    }
示例#10
0
    public void AddToGreenGridIndices(PuzzleItemData puzzleItemData = null)
    {
        int gridIndex = puzzleItemData.PanelGridIndex;
        int x         = gridIndex % pwidth;
        int y         = gridIndex / pwidth;

        int[] puzzleLayout = puzzleItemData.Playout;

        //添加greenGridIndices
        for (int i = 0; i < puzzleLayout.Length; ++i)
        {
            if (puzzleLayout[i] == 1)
            {
                int ix      = i % puzzleItemData.Pwidth;
                int iy      = i / puzzleItemData.Pwidth;
                int offsetX = ix - puzzleItemData.Pcenter[0];
                int offsetY = iy - puzzleItemData.Pcenter[1];
                int gx      = x + offsetX;
                int gy      = y + offsetY;
                greenGridIndices.Add(gx + gy * pwidth);
            }
        }
    }
示例#11
0
    public void SettlePuzzleFunc(SettlePuzzle settlePuzzle)
    {
        int pid = settlePuzzle.puzzleID;
        int prs = settlePuzzle.puzzleRotateState;
        int pgi = settlePuzzle.puzzleGridIndex;

        Debug.Log("pid:" + pid);
        Debug.Log("puzzleBarTrans.childCount:" + puzzleBarTrans.childCount);

        GameObject settlePuzzleOrigin = puzzleBarTrans.GetChild(pid).gameObject;
        GameObject settlePuzzleTemp   = GameObject.Instantiate(settlePuzzleOrigin);

        PuzzleItemUI   settlePuzzleOriginUI   = settlePuzzleOrigin.GetComponent <PuzzleItemUI>();
        PuzzleItemData settlePuzzleOriginData = settlePuzzleOriginUI.puzzleItemData;

        PuzzleItemUI   settlePuzzleTempUI   = settlePuzzleTemp.GetComponent <PuzzleItemUI>();
        PuzzleItemData settlePuzzleTempData = settlePuzzleTempUI.puzzleItemData;

        settlePuzzleTempData.InitButtomPuzzleItemData(
            settlePuzzleOriginData.PID,
            settlePuzzleOriginData.Pwidth,
            settlePuzzleOriginData.Pheight,
            settlePuzzleOriginData.Playout,
            settlePuzzleOriginData.Pcenter);

        settlePuzzleTempUI.cloneForMove             = settlePuzzleOriginUI.cloneForMove;
        settlePuzzleTempUI.screenSpaceRectTransform = settlePuzzleOriginUI.screenSpaceRectTransform;

        settlePuzzleTempData.PanelGridIndex = pgi;

        settlePuzzleTempUI.RotatePuzzleToState(prs);

        InsertPuzzle(settlePuzzleTemp, false);

        Destroy(settlePuzzleTemp);
    }
示例#12
0
    public void ModiLayout(GridType gridType, PuzzleItemData puzzleItemData)
    {
        int gridIndex = puzzleItemData.PanelGridIndex;

        int[] newPuzzleLayout = puzzleItemData.Playout;
        int   x = gridIndex % pwidth;
        int   y = gridIndex / pwidth;

        for (int i = 0; i < newPuzzleLayout.Length; ++i)
        {
            if (newPuzzleLayout[i] == 1)
            {
                int ix      = i % puzzleItemData.Pwidth;
                int iy      = i / puzzleItemData.Pwidth;
                int offsetX = ix - puzzleItemData.Pcenter[0];
                int offsetY = iy - puzzleItemData.Pcenter[1];
                int gx      = x + offsetX;
                int gy      = y + offsetY;
                int gi      = gx + gy * pwidth;

                playout[gi] = (int)gridType;
            }
        }
    }
示例#13
0
    public void InsertPuzzle(GameObject puzzle = null, bool opRecordFlag = true)
    {
        Debug.Log("insert!");
        PuzzleItemUI   puzzleItemUI   = puzzle.GetComponent <PuzzleItemUI>();
        PuzzleItemData puzzleItemData = puzzleItemUI.puzzleItemData;

        int gridIndex = puzzleItemData.PanelGridIndex;

        if (puzzleItemData.NotSettleFlag)
        {
            //删除摄像机后不存在屏幕空间与世界空间的区分,但仍保留放置与否的区分
            //如果是从底部拖上来的拼图:
            //插入拼图时,生成一份新的拼图放在当前面板的同级面板puzzleContainPanel中
            //FINISH:如果在puzzleContainPanel中(即settlePuzzleList中)存在一个位置(gridIndex)相同,playout和rotatestate也相同的拼图,直接setactive即可
            bool       existFlag = false;
            GameObject opPuzzle  = null;
            for (int i = 0; i < puzzleContainPanelTrans.childCount; ++i)
            {
                GameObject     settlePuzzle         = puzzleContainPanelTrans.GetChild(i).gameObject;
                PuzzleItemUI   settlePuzzleItemUI   = settlePuzzle.GetComponent <PuzzleItemUI>();
                PuzzleItemData settlePuzzleItemData = settlePuzzleItemUI.puzzleItemData;

                // Debug.Log(
                //     "difference:" + "\n" +
                //     settlePuzzleItemUI.RotateState + " " + puzzleItemUI.RotateState + "\n" +
                //     settlePuzzleItemData.PanelGridIndex + " " + puzzleItemData.PanelGridIndex + "\n" +
                //     MatrixUtil.PrintIntArray(settlePuzzleItemData.Playout) + " " + MatrixUtil.PrintIntArray(puzzleItemData.Playout)
                // );

                //!数组不可直接用==进行对比//已修改成直接用PID进行对比

                if (settlePuzzleItemUI.RotateState == puzzleItemUI.RotateState &&
                    settlePuzzleItemData.PanelGridIndex == puzzleItemData.PanelGridIndex &&
                    settlePuzzleItemData.PID == puzzleItemData.PID)
                {
                    existFlag = true;
                    opPuzzle  = settlePuzzle;
                    break;
                }
            }


            if (existFlag)
            {
                opPuzzle.transform.localScale = Vector3.one;
                opPuzzle.GetComponent <PuzzleItemUI>().cloneForMove = puzzleItemUI.cloneForMove;
            }
            else
            {
                //这里还需要根据拼图的中心与pcenter的位置关系修改位置关系
                Transform gridTrans     = this.transform.GetChild(gridIndex);
                float     pwidthCenter  = puzzleItemData.Pwidth / 2.0f;
                float     pheightCenter = puzzleItemData.Pheight / 2.0f;

                float pcenterX = puzzleItemData.Pcenter[0] + 0.5f;
                float pcenterY = puzzleItemData.Pcenter[1] + 0.5f;

                float offsetX = (pwidthCenter - pcenterX) * gridLength;
                float offsetY = (pheightCenter - pcenterY) * gridLength;

                Vector3 gridTransCanvasSpacePos = gridTrans.GetComponent <RectTransform>().anchoredPosition;//Camera.main.WorldToScreenPoint(gridTrans.position);

                Vector3 newPos = new Vector3(gridTransCanvasSpacePos.x + offsetX, gridTransCanvasSpacePos.y - offsetY, puzzle.transform.position.z);

                // Debug.Log("PcenterX" + pcenterX + "PcenterY" + pcenterY + "\n" +
                //     "gridIndex:" + gridIndex + "\n" + "newPos:" + newPos + "\n" +
                // "gridTrans.position:" + gridTrans.position + " " + gridTransCanvasSpacePos + "\n" +
                // "offsetX:" + offsetX + "\n" +
                // "offsetY:" + offsetY + "\n" +
                // "gridLength:" + gridLength + "\n" +
                // "canvasScaler.scaleFactor:" + canvasScaler.scaleFactor);

                //Debug.Log("Insert Puzzle:" + puzzle.name);

                GameObject    newPuzzle          = GameObject.Instantiate(puzzle, puzzleContainPanelTrans);
                RectTransform newPuzzleRectTrans = newPuzzle.GetComponent <RectTransform>();
                newPuzzleRectTrans.anchorMin        = new Vector2(0, 1);
                newPuzzleRectTrans.anchorMax        = new Vector2(0, 1);
                newPuzzleRectTrans.anchoredPosition = newPos;

                //Debug.LogWarning(gridIndex + " " + gridTransCanvasSpacePos + " " + gridTrans.position + " " + newPos);

                // settlePuzzleList.Add(newPuzzle);
                newPuzzle.name = "SettlePuzzle";
                //将raycastTarget设为false避免触摸空白区域会拖动当前拼图
                newPuzzle.GetComponent <Image>().raycastTarget = false;

                // Debug.Log("gen pos:" + newPuzzle.transform.position + " " + Camera.main.WorldToScreenPoint(newPuzzle.transform.position));

                PuzzleItemUI newPuzzleItemUI = newPuzzle.GetComponent <PuzzleItemUI>();
                newPuzzleItemUI.puzzleItemData = new PuzzleItemData();
                PuzzleItemData newPuzzleItemData = newPuzzleItemUI.puzzleItemData;

                //newPuzzleItemData=puzzleItemData;

                newPuzzleItemData.InitButtomPuzzleItemData(
                    puzzleItemData.PID,
                    puzzleItemData.Pwidth,
                    puzzleItemData.Pheight,
                    puzzleItemData.Playout,
                    puzzleItemData.Pcenter);


                newPuzzleItemData.PanelGridIndex = puzzleItemData.PanelGridIndex;

                newPuzzleItemUI.ScaleRatio  = puzzleItemUI.ScaleRatio;
                newPuzzleItemUI.RotateState = puzzleItemUI.RotateState;

                newPuzzleItemUI.screenSpaceRectTransform = puzzleItemUI.screenSpaceRectTransform;



                if (newPuzzleItemUI.RotateState == 0 || newPuzzleItemUI.RotateState == 2)
                {
                    newPuzzle.GetComponent <RectTransform>().sizeDelta = new Vector2(gridLength * newPuzzleItemData.Pwidth, gridLength * newPuzzleItemData.Pheight);
                }
                else
                {
                    newPuzzle.GetComponent <RectTransform>().sizeDelta = new Vector2(gridLength * newPuzzleItemData.Pheight, gridLength * newPuzzleItemData.Pwidth);
                }

                newPuzzle.GetComponent <GridLayoutGroup>().cellSize = new Vector2(gridLength, gridLength);

                //要为拼图设置可以移动的拼图
                newPuzzleItemData.NotSettleFlag          = false;
                newPuzzleItemUI.cloneForMove             = puzzleItemUI.cloneForMove;
                newPuzzleItemUI.screenSpaceRectTransform = puzzleItemUI.screenSpaceRectTransform;

                opPuzzle = newPuzzle;
            }


            int[] oldLayout = generalPanelData.Playout;
            generalPanelData.ModiLayout(GeneralPanelData.GridType.Fill, puzzleItemData);
            int[] newLayout = generalPanelData.Playout;

            opPuzzle.SetActive(true);

            if (opRecordFlag)
            {
                //操作历史记录
                //TODO:记录摆放的拼图
                Operation op = new Operation(0, oldLayout, newLayout, opPuzzle);
                operationHistoryRecorder.Record(op);

                //播放下落动画
                // StartCoroutine(PuzzleDownMove(opPuzzle, 0.5f, 0.1f, () =>
                // {
                //     //检查游戏是否结束
                //     if (generalPanelData.CheckOver())
                //     {
                //         //通关
                //         //跳转到UIEnd
                //         uiplayPage.LevelOverStep1();
                //     }
                // }));

                StartCoroutine(PuzzleSettleAnim(opPuzzle, () => { }));
            }
        }
        else
        {
            //-删除摄像机后不存在屏幕空间与世界空间的区分,但仍保留放置与否的区分
            //如果是从面板中拖出的拼图:
            //直接修改拼图的位置即可
            puzzle.transform.localScale = Vector3.one;
            Transform gridTrans = this.transform.GetChild(gridIndex);

            float pwidthCenter  = puzzleItemData.Pwidth / 2.0f;
            float pheightCenter = puzzleItemData.Pheight / 2.0f;

            float pcenterX = puzzleItemData.Pcenter[0] + 0.5f;
            float pcenterY = puzzleItemData.Pcenter[1] + 0.5f;

            float offsetX = (pwidthCenter - pcenterX) * gridLength;
            float offsetY = (pheightCenter - pcenterY) * gridLength;

            Vector3 gridTransCanvasSpacePos = gridTrans.GetComponent <RectTransform>().anchoredPosition;

            Vector3 newPos = new Vector3(gridTransCanvasSpacePos.x + offsetX, gridTransCanvasSpacePos.y - offsetY, puzzle.transform.position.z);

            RectTransform puzzleRectTrans = puzzle.GetComponent <RectTransform>();
            puzzleRectTrans.anchorMin        = new Vector2(0, 1);
            puzzleRectTrans.anchorMax        = new Vector2(0, 1);
            puzzleRectTrans.anchoredPosition = newPos;

            // puzzle.transform.position = Camera.main.ScreenToWorldPoint(newPos);

            int[] oldLayout = generalPanelData.Playout;
            generalPanelData.ModiLayout(GeneralPanelData.GridType.Fill, puzzleItemData);
            int[] newLayout = generalPanelData.Playout;
            puzzle.SetActive(true);

            if (opRecordFlag)
            {
                //FINISH:操作历史记录
                Operation op = new Operation(1, oldLayout, newLayout, puzzle, puzzleItemData.LastPanelGridIndex, gridIndex);
                operationHistoryRecorder.Record(op);

                //播放下落动画
                // StartCoroutine(PuzzleDownMove(puzzle, 0.5f, 0.1f, () => { }));

                StartCoroutine(PuzzleSettleAnim(puzzle, () => { }));
            }
        }
    }
示例#14
0
    // Coroutine deleteAreaCorou;
    // public Coroutine DeleteAreaCorou
    // {
    //     get { return deleteAreaCorou; }
    //     set { deleteAreaCorou = value; }
    // }
    public int InteractWithPuzzle(PuzzleItemUI puzzleItemUI, out int panelGridIndex, out int[] outputBlankLayout)
    {
        //关于返回值:0表示拼图在面板中的位置是满足填充条件的位置,可以填充;1表示拼图在面板中,但不满足填充条件;2表示拼图不在面板中,也不在删除区;3表示拼图在删除区
        PuzzleItemData puzzleItemData = puzzleItemUI.puzzleItemData;

        PointerEventData pointerData = new PointerEventData(EventSystem.current);

        // Debug.Log("grid index of puzzle:" + (puzzleItemData.Pcenter[0] + puzzleItemData.Pwidth * puzzleItemData.Pcenter[1]).ToString());//!Test

        //!show precheck grid不正确对应的bug发生原因:原本通过centerx和centery寻找下标,实际上并不需要寻找,因为顺序是固定的,下标不改变
        pointerData.position = Camera.main.WorldToScreenPoint(puzzleItemUI.transform.GetChild((int)(puzzleItemData.PcenterOrigin)).position);

        List <RaycastResult> results = new List <RaycastResult>();

        EventSystem.current.RaycastAll(pointerData, results);

        if (results.Count > 0)
        {
            //此时results[0]是当前拼图上的格子,results[...]才是底下的东西
            //如果射到的是格子,其父对象必为当前脚本挂载的对象,即GeneralPanel面板
            GameObject hitObj = results.Find((RaycastResult a) => a.gameObject.transform.parent == this.transform).gameObject;

            if (hitObj != null)
            {
                int   gridIndex = hitObj.transform.GetSiblingIndex();
                int[] blankLayout;
                bool  isFit = generalPanelData.IsFit(puzzleItemData, gridIndex, out blankLayout);

                panelGridIndex    = gridIndex;
                outputBlankLayout = MatrixUtil.ArrayCopy(blankLayout);

                onDeleteAreaFlag = false;
                //TODO:deleteArea缩小为1
                StartCoroutine(DeleteAreaLinearScaleDown());

                if (isFit)
                {
                    return(0);
                }
                else
                {
                    return(1);
                }
            }

            // 输出射线射到的所有对象:
            // string allhit = "hit:::\n";
            // foreach (RaycastResult r in results)
            // {
            //     allhit += r.gameObject.name + "\n";
            // }
            // Debug.Log(allhit);

            if (DetectDeleteArea(puzzleItemUI))
            {
                panelGridIndex    = -1;
                outputBlankLayout = null;
                return(3);
            }
        }

        panelGridIndex    = -1;
        outputBlankLayout = null;
        return(2);
    }
示例#15
0
    //private bool adPuzzleUseFlag = false;//没有用于实际判断,暂时注释


    public void InitPuzzleBar()
    {
        //FINISH:读入数据,获得界面下方的PuzzlePanel中要放的拼图的种类的信息
        uint      curLevelID   = LevelMgr.GetInstance().CurLevelID;
        LevelData curLevelData = LevelMgr.GetInstance().GetLevelConfig(curLevelID);

        Dictionary <string, int[]> FillTypeMap = new Dictionary <string, int[]>();
        Dictionary <string, int>   WidthMap    = new Dictionary <string, int>();

        Google.Protobuf.Collections.RepeatedField <string> usablePuzzleStrList = new Google.Protobuf.Collections.RepeatedField <string>();
        int adPuzzleAvailFlagInt = 0;

        if (curLevelData == null || curLevelData.Config == null)
        {
            //!模拟读入
            FillTypeMap = new Dictionary <string, int[]>()
            {
                { "0", new int[] { 0, 0, 1, 1, 1, 1 } },
                { "1", new int[] { 1, 1 } },
                { "2", new int[] { 1, 1, 0, 0 } },
                { "3", new int[] { 1 } },
            };

            WidthMap = new Dictionary <string, int>()
            {
                { "0", 3 },
                { "1", 2 },
                { "2", 2 },
                { "3", 1 },
            };
            usablePuzzleStrList = new Google.Protobuf.Collections.RepeatedField <string>()
            {
                "0", "1", "3"
            };
            adPuzzleAvailFlagInt = 1;
        }
        else
        {
            ToolMapArray toolMapArray = LevelMgr.GetInstance().GetToolMapArray();
            FillTypeMap          = toolMapArray.FillTypeMap;
            WidthMap             = toolMapArray.WidthMap;
            usablePuzzleStrList  = curLevelData.Config.LevelPixel;
            adPuzzleAvailFlagInt = curLevelData.Config.AdPuzzle;
        }



        //Debug.Log("usablePuzzleStrList.Count" + usablePuzzleStrList.Count);
        //FINISH:读入数据后,根据数据生成相应的若干PuzzleItem
        int i = 0;

        foreach (string usablePuzzleStr in usablePuzzleStrList)
        {
            int[] usablePuzzleLayout = new int[] { };
            if (FillTypeMap.TryGetValue(usablePuzzleStr, out usablePuzzleLayout))
            {
                int[] puzzleLayout = MatrixUtil.ArrayCopy(usablePuzzleLayout);

                int puzzleWidth = WidthMap[usablePuzzleStr];

                int puzzleHeight = puzzleLayout.Length / puzzleWidth;

                int puzzleCenterX = 0;
                int puzzleCenterY = 0;

                float puzzleCenterXFloor = Mathf.Floor((float)puzzleWidth / 2.0f);
                float puzzleCenterYFloor = Mathf.Floor((float)puzzleHeight / 2.0f);
                if ((float)puzzleWidth / 2.0f - puzzleCenterXFloor > 0.9f)
                {
                    puzzleCenterX = (int)puzzleCenterXFloor + 1;
                }
                else
                {
                    puzzleCenterX = (int)puzzleCenterXFloor;
                }
                if ((float)puzzleHeight / 2.0f - puzzleCenterYFloor > 0.9f)
                {
                    puzzleCenterY = (int)puzzleCenterYFloor + 1;
                }
                else
                {
                    puzzleCenterY = (int)puzzleCenterYFloor;
                }
                // Debug.Log("puzzleCenterX" + puzzleCenterX);
                // Debug.Log("puzzleCenterY" + puzzleCenterY);


                int[] puzzleCenter = new int[2] {
                    puzzleCenterX, puzzleCenterY
                };

                GameObject   puzzleItem   = GameObject.Instantiate(puzzleItemPrefab, this.transform);
                PuzzleItemUI puzzleItemUI = puzzleItem.GetComponent <PuzzleItemUI>();
                // puzzleItemUIList.Add(puzzleItemUI);
                // puzzleItemUI.InitComp(playFieldCamera, generalPanelUI, puzzleMoveTrans, dragControlMgr, canvasScaler);
                puzzleItemUI.InitComp(generalPanelUI, puzzleMoveTrans, dragController);
                puzzleItemUI.puzzleItemData.InitButtomPuzzleItemData(i, puzzleWidth, puzzleHeight, puzzleLayout, puzzleCenter);
                puzzleItemUI.InitButtomPuzzleItemUI();
                puzzleItemUI.ScaleRatioOfPanelGrid = scaleRatioOfPanelGrid;
                i++;
            }
            else
            {
                Debug.Log("NOT usablePuzzstr:" + usablePuzzleStr);
            }
        }

        //TODO:判断是否可用广告方块
        if (adPuzzleAvailFlagInt == 0)
        {
            //不可用广告方块
            if (puzzleBarForFreeLayoutTrans.childCount > 0)
            {
                Transform adButtonTrans = puzzleBarForFreeLayoutTrans.GetChild(0);
                adButtonTrans.gameObject.SetActive(false);
            }
        }
        else//adPuzzleAvailFlagInt==1
        {
            //可用广告方块
            //TODO:添加广告方块
            GameObject adPuzzle = AddAdPuzzle();
            //TODO:添加看广告按钮
            Transform adButtonTrans;
            if (puzzleBarForFreeLayoutTrans.childCount > 0)
            {
                adButtonTrans = puzzleBarForFreeLayoutTrans.GetChild(0);
            }
            else
            {
                GameObject adButton = GameObject.Instantiate(adButtonPrefab, puzzleBarForFreeLayoutTrans);
                adButtonTrans = adButton.transform;
            }
            //添加判断是否已经付费去广告
            if (XPlayerPrefs.GetInt(AdMgr.Pay2RemoveAD_Tag) == 1)
            {
                adButtonTrans.gameObject.SetActive(false);
                if (adPuzzleNum == 1)
                {
                    Transform      adPuzzleTrans = this.transform.GetChild(this.transform.childCount - 1);
                    PuzzleItemUI   adPuzzleUI    = adPuzzleTrans.GetComponent <PuzzleItemUI>();
                    PuzzleItemData adPuzzleData  = adPuzzleUI.puzzleItemData;
                    adPuzzleData.Plockstate = false;
                }
            }
            else
            {
                //TODO:设置按钮的方法
                Button adButtonComp = adButtonTrans.GetComponent <Button>();
                adButtonComp.onClick.RemoveAllListeners();
                adButtonComp.onClick.AddListener(() =>
                {
                    UnlockAdPuzzle();
                });

                //TODO:设置按钮位置,在协程中等待到当前帧的fixedupdate时进行,原因是adPuzzle的位置受horizontalLayout的影响会在fixedupdate时才生效
                StartCoroutine(SetAdButtonPos(adButtonTrans, adPuzzle));
            }
        }
    }
示例#16
0
    public void OnEndDrag(PointerEventData pointerEventData, PuzzleItemUI puzzleItemUI, GeneralPanelUI generalPanelUI)
    {
        if (gameOverFlag)
        {
            return;
        }
        if (puzzleItemUI.puzzleItemData.Plockstate)
        {
            return;
        }
        if (!puzzleItemUI.DraggedState)
        {
            return;
        }
        if (firstDragPointerID != pointerEventData.pointerId)//限制手指pointerId不同的不可被放置,可用于限制只能单指操作
        {
            return;
        }
        miniMapController.RefreshFlag = true;

        //拖动结束后,满足一定条件时拼图可以被插进面板,否则移除生成的拼图(隐藏显示)
        PuzzleItemData puzzleItemData = puzzleItemUI.puzzleItemData;

        Debug.Log("End Drag At:" + pointerEventData.position);
        puzzleItemUI.cloneForMove.SetActive(false);

        int gridIndex = -1;

        int[] blankLayout = null;
        int   interactRet = generalPanelUI.InteractWithPuzzle(puzzleItemUI.cloneForMove.GetComponent <PuzzleItemUI>(), out gridIndex, out blankLayout);

        puzzleItemData.PanelGridIndex = gridIndex;

        generalPanelUI.ShowPreCheckResult(2);

        //FINISH:进行操作记录,interactRet为0时,进行填充记录或位置移动记录;interactRet为3时,进行删除记录(操作历史记录的实现写于GeneralPanelUI中)

        if (interactRet == 0)//如果拼图在满足填充条件的位置
        {
            //把拼图插入
            generalPanelUI.InsertPuzzle(puzzleItemUI.gameObject);
        }
        else if (interactRet == 1 || interactRet == 2) //如果拼图在不满足填充条件以及不在删除区的其他位置
        {
            if (!puzzleItemData.NotSettleFlag)         //如果被开始拖的拼图已经放置了
            {
                puzzleItemData.PanelGridIndex = puzzleItemData.LastPanelGridIndex;
                generalPanelUI.InsertPuzzle(puzzleItemUI.gameObject, false);
            }

            Debug.Log("not fit " + interactRet);
        }
        else if (interactRet == 3)//如果拼图在删除区
        {
            //删除
            if (!puzzleItemData.NotSettleFlag)
            {
                Debug.Log("删除拼图");
                puzzleItemData.PanelGridIndex = puzzleItemData.LastPanelGridIndex;
                generalPanelUI.RemovePuzzle(puzzleItemUI.gameObject);
            }
            generalPanelUI.deleteParticleEffect.Play();
            DragController.VibrateFeedbackIntern();
        }

        //FINISH:deleteArea缩小为1
        generalPanelUI.OnDeleteAreaFlag = false;
        StartCoroutine(generalPanelUI.DeleteAreaLinearScaleDown());
        // generalPanelUI.deleteArea.transform.localScale = Vector3.one;

        puzzleItemUI.DraggedState = false;
        generalDragFlag           = false;

        //TODO:deleteArea置為透明
        generalPanelUI.SetDeleteAreaTransparent(true);
    }
示例#17
0
    public void OnBeginDrag(PointerEventData pointerEventData, PuzzleItemUI puzzleItemUI, GeneralPanelUI generalPanelUI)
    {
        Debug.Log("OnBeginDrag");
        if (gameOverFlag)
        {
            Debug.Log("gameover");
            return;
        }
        if (puzzleItemUI.puzzleItemData.Plockstate)
        {
            Debug.Log("lock");
            return;
        }
        if (Input.touchCount > 1)
        {
            return;
        }
        if (!generalDragFlag)
        {
            miniMapController.RefreshFlag = true;
            generalDragFlag           = true;
            puzzleItemUI.DraggedState = true;
            firstDragPointerID        = pointerEventData.pointerId;
            Debug.Log("OnBeginDrag2");


            //Debug.Log("Drag begin");


            //TODO:手机震动一下
            VibrateFeedbackIntern();


            PuzzleItemData puzzleItemData = puzzleItemUI.puzzleItemData;
            //FINISH:开始拖动拼图时,生成(或显示)一块可以跟随手指的拼图,生成(显示)时规定好位置和大小(修改scale缩放即可)

            if (!puzzleItemData.NotSettleFlag)
            {
                //?如果开始拖动的是已经摆放好的拼图,就先隐藏,但是隐藏会影响多个接口的使用,可以把它scale缩小为0
                puzzleItemUI.transform.localScale = Vector3.zero;

                //FINISH:同时还要修改GeneralPanel的layout数组,先记录一次上次插入时的格子的坐标,再消去Puzzle
                puzzleItemData.LastPanelGridIndex = puzzleItemData.PanelGridIndex;
                generalPanelUI.generalPanelData.ModiLayout(GeneralPanelData.GridType.Blank, puzzleItemData);
            }

            float gridLength = generalPanelUI.GridLength;

            //FINISH:修改大小
            //FINISH:加上双指缩放的比例
            //根据panelTC缩放比例调整拼图的scaleratio
            puzzleItemUI.SetScaleRatio();
            float ratio = puzzleItemUI.ScaleRatio * panelTransformationController.ScaleRatio;
            Debug.Log(ratio + " " + puzzleItemUI.ScaleRatio + " " + panelTransformationController.ScaleRatio);
            puzzleItemUI.cloneForMove.GetComponent <RectTransform>().localScale = new Vector3(ratio, ratio, 1);

            //FINISH:修改旋转
            //根据PuzzleItemUI的RotateState进行旋转
            PuzzleItemUI cloneForMovePuzzleItemUI = puzzleItemUI.cloneForMove.GetComponent <PuzzleItemUI>();
            cloneForMovePuzzleItemUI.RotatePuzzleToState(puzzleItemUI.RotateState);

            //FINISH:修改位置
            Vector3 puzzleBeginPosPre = Camera.main.ScreenToWorldPoint(pointerEventData.position);
            puzzleItemUI.cloneForMove.transform.position = new Vector3(puzzleBeginPosPre.x, puzzleBeginPosPre.y, puzzleItemUI.cloneForMove.transform.position.z);
            puzzleItemUI.cloneForMove.SetActive(true);

            if (!puzzleItemData.NotSettleFlag)
            {
                //如果是已放置的拼圖
                StartCoroutine(UpMove(Vector3.up * finalUpMoveDistance_SettlePuzzle, finalUpMoveTime_SettlePuzzle));//!可以调整上移的距离和下落时间
            }
            else
            {
                //如果是從下方拉起的拼圖
                StartCoroutine(UpMove(Vector3.up * finalUpMoveDistance, finalUpMoveTime));//!可以调整上移的距离和下落时间
            }


            curPointerEventData.position = pointerEventData.position;
            StartCoroutine(UpdatePos(puzzleItemUI.cloneForMove.transform));

            //TODO:deleteArea置為不透明
            generalPanelUI.SetDeleteAreaTransparent(false);



            // !Test:输出cloneForMove的旋转角度:
            // float angle;
            // Vector3 axis;
            // puzzleItemUI.cloneForMove.transform.rotation.ToAngleAxis(out angle, out axis);
            // Debug.Log("angle::" + angle + "\n" + "axis::" + axis);



            // !Test:输出puzzleItemUI cloneForMove的layout:
            // string test = "puzzleItemUI cloneForMove Layout::\n";
            // PuzzleItemData testpd = puzzleItemUI.cloneForMove.GetComponent<PuzzleItemUI>().puzzleItemData;
            // int[] testlayout = testpd.Playout;
            // for (int i = 0; i < testlayout.Length; ++i)
            // {
            //     test += testlayout[i].ToString() + " ";
            //     if (i > 0 && (i + 1) % (testpd.Pwidth) == 0)
            //     {
            //         test += "\n";
            //     }
            // }
            // Debug.Log(test);
        }
    }
示例#18
0
    public bool IsFit(PuzzleItemData puzzleItemData, int gridIndex, out int[] outputBlankLayout)
    {
        //FINISH:面板的数据层中,该IsFit函数仅处理拼图的layout和面板的layout的关系
        int[] puzzleCenter  = puzzleItemData.Pcenter;//获取拼图的中心的内部坐标
        int   puzzleCenterX = puzzleCenter[0];
        int   puzzleCenterY = puzzleCenter[1];
        int   puzzleWidth   = puzzleItemData.Pwidth;  //获取拼图宽方向的格子数
        int   puzzleHeight  = puzzleItemData.Pheight; //获取拼图高方向的格子数


        int x = gridIndex % pwidth;
        int y = gridIndex / pwidth;

        int[] puzzleLayout = puzzleItemData.Playout;

        //创建一个和puzzlelayout相同大小的一维数组,用来记录面板上同样大小的格子中的空位,2为有空位,1为无空位(存在非可填的格子),0为没有格子(超出面板边界)
        int[] blankLayout = new int[puzzleLayout.Length];

        //按照puzzle的center和layout遍历面板上的格子
        int i = 0;

        for (int iy = y - puzzleCenterY; iy < y - puzzleCenterY + puzzleHeight; ++iy)
        {
            for (int ix = x - puzzleCenterX; ix < x - puzzleCenterX + puzzleWidth; ++ix)
            {
                if ((ix < 0 || ix > pwidth - 1) || (iy < 0 || iy > pheight - 1))
                {
                    //超出边界的情况
                    // Debug.Log("存在超出边界的格子");
                    // Debug.Log("coo:" + ix.ToString() +" "+ iy.ToString());
                    blankLayout[i] = 0;
                }
                else
                {
                    if (playout[ix + iy * pwidth] != (int)GridType.Blank)
                    {
                        //没超出边界但是存在非可填格子的情况
                        // Debug.Log("存在非可填格子");
                        // Debug.Log("coo:" + (ix + iy * pwidth).ToString());
                        blankLayout[i] = 1;
                    }
                    else
                    {
                        blankLayout[i] = 2;
                    }
                }
                i++;
            }
        }

        outputBlankLayout = blankLayout;

        //对比puzzleLayout和blankLayout即可
        for (i = 0; i < puzzleLayout.Length; ++i)
        {
            int si = blankLayout[i];
            int pi = puzzleLayout[i];
            if (si == 0 && pi == 1)
            {
                //超出边界的面板上的格子
                return(false);
            }
            if (si == 1 && pi == 1)
            {
                //非可填格子
                return(false);
            }
        }
        return(true);
    }