/// <summary>
    /// 生成一个随机凹凸的拼图
    /// </summary>
    /// <param name="jigsawStyle"></param>
    /// <param name="jigsawW"></param>
    /// <param name="jigsawH"></param>
    /// <returns></returns>
    public static JigsawBean createJigsaw(JigsawStyleEnum jigsawStyle, float jigsawW, float jigsawH, Texture2D jigsawPic)
    {
        JigsawBean jigsawBean = new JigsawBean();
        //按样式生成不同的拼图碎片
        IBaseJigsawBuilder jigsawBuilder;

        JigsawBulgeEnum[] bulge;

        if (jigsawStyle == JigsawStyleEnum.Def)
        {
            jigsawBuilder = new NomralJigsawBuilder();
            bulge         = new JigsawBulgeEnum[4]
            {
                (JigsawBulgeEnum)DevUtil.getRandomInt(0, 2),
                (JigsawBulgeEnum)DevUtil.getRandomInt(0, 2),
                (JigsawBulgeEnum)DevUtil.getRandomInt(0, 2),
                (JigsawBulgeEnum)DevUtil.getRandomInt(0, 2)
            };
        }
        else
        {
            LogUtil.logError("没有相对于样式的拼图");
            return(null);
        }
        return(jigsawBuilder.buildJigsaw(jigsawW, jigsawH, bulge, jigsawPic));
    }
Exemple #2
0
    /// <summary>
    /// 创建拼图
    /// </summary>
    /// <param name="jigsawInfoData"></param>
    private void createJigsaw(JigsawStyleEnum jigsawStyle, Texture2D pic2D, int horizontalNumber, int verticalJigsawNumber)
    {
        //创建拼图数据
        listJigsawBean = CreateJigsawDataUtils.createJigsawDataList(jigsawStyle, horizontalNumber, verticalJigsawNumber, pic2D);
        //创建拼图
        CreateJigsawGameObjUtil.createJigsawGameObjList(listJigsawBean, pic2D);
        containerList = CreateJigsawContainerObjUtil.createJigsawContainerObjList(listJigsawBean);
        //初始化拼图位置
        for (int i = 0; i < listJigsawBean.Count; i++)
        {
            JigsawBean item           = listJigsawBean[i];
            Vector3    jigsawPosition = new Vector3(
                item.MarkLocation.x * item.JigsawWith - item.JigsawWith * horizontalNumber / 2f + item.JigsawWith / 2f,
                item.MarkLocation.y * item.JigsawHigh - item.JigsawHigh * verticalJigsawNumber / 2f + item.JigsawHigh / 2f
                );
            containerList[i].transform.position = jigsawPosition;

            //设置起始位置和角度
            JigsawContainerCpt containerCpt = containerList[i].transform.GetComponent <JigsawContainerCpt>();
            if (containerCpt != null)
            {
                containerCpt.startPosition = jigsawPosition;
                containerCpt.startRotation = containerList[i].transform.rotation;
            }
        }
    }
 /// <summary>
 /// 设置当前样式
 /// </summary>
 public void setJigsawStyle(JigsawBean jigsaw, JigsawStyleEnum style)
 {
     if (jigsaw == null)
     {
         return;
     }
     jigsaw.JigsawStyle = style;
 }
    /// <summary>
    /// 设置拼图组件
    /// </summary>
    /// <param name="jigsawGameObj"></param>
    private static void setJigsawCpt(GameObject jigsawGameObj, JigsawBean jigsawData)
    {
        JigsawStyleEnum jigsawStyle = jigsawData.JigsawStyle;
        NormalJigsawCpt jigsawCpt   = jigsawGameObj.AddComponent <NormalJigsawCpt>();

        jigsawCpt.setJigsawData(jigsawData);
        jigsawCpt.setEdgeMergeStatus(JigsawStyleNormalEdgeEnum.Left, JigsawMergeStatusEnum.Unincorporated);
        jigsawCpt.setEdgeMergeStatus(JigsawStyleNormalEdgeEnum.Above, JigsawMergeStatusEnum.Unincorporated);
        jigsawCpt.setEdgeMergeStatus(JigsawStyleNormalEdgeEnum.Right, JigsawMergeStatusEnum.Unincorporated);
        jigsawCpt.setEdgeMergeStatus(JigsawStyleNormalEdgeEnum.Below, JigsawMergeStatusEnum.Unincorporated);
    }
    /// <summary>
    /// 基础-创建数据列表
    /// </summary>
    /// <param name="horizontalJigsawNumber"></param>
    /// <param name="verticalJigsawNumber"></param>
    /// <param name="jigsawPic"></param>
    /// <returns></returns>
    public List <JigsawBean> baseBuildJigsawList(JigsawStyleEnum style, int horizontalJigsawNumber, int verticalJigsawNumber, Texture2D jigsawPic)
    {
        // 根据图片获取item宽高和UV
        JigsawBean tempBean = getWithAndHighByTexture2D(horizontalJigsawNumber, verticalJigsawNumber, jigsawPic);
        // 获取拼图总块数
        int jigsawTotalNumber            = verticalJigsawNumber * horizontalJigsawNumber;
        List <JigsawBean> listJigsawBean = new List <JigsawBean>();

        for (int horizontal = 0; horizontal < horizontalJigsawNumber; horizontal++)
        {
            for (int vertical = 0; vertical < verticalJigsawNumber; vertical++)
            {
                //生成拼图对象
                JigsawBean jigsawItem = new JigsawBean();
                //确认拼图样式
                setJigsawStyle(jigsawItem, style);
                //确认当前拼图碎片相对图片的坐标
                setMarkLocation(jigsawItem, horizontal, vertical);
                //设置拼图长宽
                setJigsawHigh(jigsawItem, tempBean.JigsawHigh);
                setJigsawWith(jigsawItem, tempBean.JigsawWith);
                setJigsawUVHigh(jigsawItem, tempBean.JigsawUVHigh);
                setJigsawUVWith(jigsawItem, tempBean.JigsawUVWith);
                setJigsawNumber(jigsawItem, jigsawTotalNumber);
                listJigsawBean.Add(jigsawItem);
            }
        }
        int listJigsawBeanCount = listJigsawBean.Count;

        for (int jigsawposition = 0; jigsawposition < listJigsawBeanCount; jigsawposition++)
        {
            JigsawBean jigsawItem = listJigsawBean[jigsawposition];
            //确认拼图每个边的凹凸情况
            setBulgeEdgeForItem(listJigsawBean, jigsawItem);
            //确认拼图顶点坐标和UVposition
            setListVerticesForItem(jigsawItem);
            baseSetListUVPositionForItem(jigsawItem);
        }
        return(listJigsawBean);
    }
    public static void refreshData()
    {
        GameLanguage = GameLanguageEnum.English;
        IsOpenBGM    = EnabledEnum.ON;
        IsOpenSound  = EnabledEnum.ON;
        IsOpenTimeUI = EnabledEnum.ON;
        SceenMode    = ScreenModeEnum.Full;

        PuzzlesShape = JigsawStyleEnum.Def;
        BorderShape  = GameWallEnum.Def;
        BorderColor  = EquipColorEnum.Def;
        Background   = EquipColorEnum.Def;

        SoundVolume = 1f;
        BGMVolume   = 1f;
        GameConfigureBean configureBean = DataStorageManage.getGameConfigureDSHandle().getData(0);

        if (configureBean != null)
        {
            //游戏语言设置
            GameLanguage = (GameLanguageEnum)Enum.ToObject(typeof(GameLanguageEnum), configureBean.gameLanguage);
            //是否开启BGM
            IsOpenBGM = (EnabledEnum)Enum.ToObject(typeof(EnabledEnum), configureBean.isOpenBGM);
            //是否开启音效
            IsOpenSound = (EnabledEnum)Enum.ToObject(typeof(EnabledEnum), configureBean.isOpenSound);
            //是否开启计时UI
            IsOpenTimeUI = (EnabledEnum)Enum.ToObject(typeof(EnabledEnum), configureBean.isOpenTimeUI);
            //屏幕模式
            SceenMode = (ScreenModeEnum)Enum.ToObject(typeof(ScreenModeEnum), configureBean.screenMode);

            PuzzlesShape = (JigsawStyleEnum)Enum.ToObject(typeof(JigsawStyleEnum), configureBean.puzzlesShape);
            BorderShape  = (GameWallEnum)Enum.ToObject(typeof(GameWallEnum), configureBean.borderShape);
            BorderColor  = (EquipColorEnum)Enum.ToObject(typeof(EquipColorEnum), configureBean.borderColor);
            Background   = (EquipColorEnum)Enum.ToObject(typeof(EquipColorEnum), configureBean.background);

            SoundVolume = configureBean.soundVolume;
            BGMVolume   = configureBean.bgmVolume;
        }
    }
    /// <summary>
    /// 创建拼图碎片合集
    /// </summary>
    /// <param name="jigsawStyle">拼图样式</param>
    /// <param name="horizontalJigsawNumber">横向拼图块数</param>
    /// <param name="verticalJigsawNumber">纵向拼图快速</param>
    /// <param name="jigsawPic">拼图图片</param>
    /// <returns></returns>
    public static List <JigsawBean> createJigsawDataList(JigsawStyleEnum jigsawStyle, int horizontalJigsawNumber, int verticalJigsawNumber, Texture2D jigsawPic)
    {
        List <JigsawBean> listJigsawBean = new List <JigsawBean>();

        if (horizontalJigsawNumber == 0)
        {
            LogUtil.logError("横向块数为0");
            return(listJigsawBean);
        }
        if (verticalJigsawNumber == 0)
        {
            LogUtil.logError("纵向块数为0");
            return(listJigsawBean);
        }
        if (jigsawPic == null)
        {
            LogUtil.logError("没有图片");
            return(listJigsawBean);
        }

        //按样式生成不同的拼图碎片
        IBaseJigsawBuilder jigsawBuilder;

        if (jigsawStyle == JigsawStyleEnum.Def)
        {
            jigsawBuilder = new NomralJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Smooth)
        {
            jigsawBuilder = new SmoothJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Triangle)
        {
            jigsawBuilder = new TriangleJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Trapezoid)
        {
            jigsawBuilder = new TrapezoidJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Square)
        {
            jigsawBuilder = new SquareJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Heart)
        {
            jigsawBuilder = new HeartJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Pentagram)
        {
            jigsawBuilder = new PentagramJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Pentagram)
        {
            jigsawBuilder = new PentagramJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Bodkin)
        {
            jigsawBuilder = new BodkinJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Sawtooth)
        {
            jigsawBuilder = new SawtoothJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Shuriken)
        {
            jigsawBuilder = new ShurikenJigsawBuilder();
        }
        else if (jigsawStyle == JigsawStyleEnum.Cross)
        {
            jigsawBuilder = new CrossJigsawBuilder();
        }
        else
        {
            LogUtil.logError("没有相对于样式的拼图");
            return(listJigsawBean);
        }

        listJigsawBean = jigsawBuilder.buildJigsawList(horizontalJigsawNumber, verticalJigsawNumber, jigsawPic);

        if (listJigsawBean == null)
        {
            LogUtil.logError("生成拼图碎片数据失败");
        }
        return(listJigsawBean);
    }
    /// <summary>
    /// 获取拼图GameObj
    /// </summary>
    /// <param name="JigsawBean">需要生成的拼图块数据</param>
    /// <returns></returns>
    public static GameObject buildJigsawGameObj(JigsawBean jigsawData, Texture2D jigsawPic)
    {
        if (jigsawData == null)
        {
            throw new Exception("没有拼图数据");
        }
        List <Vector3>  listVertices    = jigsawData.ListVertices;
        List <Vector2>  listUVposition  = jigsawData.ListUVposition;
        Vector2         markLocation    = jigsawData.MarkLocation;
        Vector3         centerVector    = jigsawData.CenterVector;
        float           jigsawWith      = jigsawData.JigsawWith;
        float           jigsawHigh      = jigsawData.JigsawHigh;
        JigsawStyleEnum jigsawStyleEnum = jigsawData.JigsawStyle;

        if (listVertices == null)
        {
            LogUtil.log("生产拼图gameObj失败-没有顶点坐标");
            return(null);
        }
        if (listVertices.Count < 3)
        {
            LogUtil.log("生产拼图gameObj失败-顶点坐标小于3");
            return(null);
        }
        if (listUVposition == null)
        {
            LogUtil.log("生产拼图gameObj失败-没有图片UV坐标");
            return(null);
        }
        if (!listUVposition.Count.Equals(listVertices.Count))
        {
            LogUtil.log("生产拼图gameObj失败-UV坐标与定点坐标数量不对等");
            return(null);
        }
        if (jigsawPic == null)
        {
            LogUtil.log("生产拼图gameObj失败-没有生成拼图所需图片");
            return(null);
        }
        if (centerVector == null)
        {
            LogUtil.log("生产拼图gameObj失败-没有拼图中心点");
            return(null);
        }

        //创建拼图的游戏对象
        String     gameObjName   = jigsawPic.name + "_X" + markLocation.x + "_Y" + markLocation.y;
        GameObject jigsawGameObj = createGameObjForJigsaw(gameObjName);

        //设置贴图
        setRenderer(jigsawGameObj, jigsawPic);
        //设置网格
        setMeshFilter(jigsawGameObj, listVertices, listUVposition);
        //设置2D碰撞器
        //setCollider2D(jigsawGameObj, centerVector, jigsawWith, jigsawHigh);
        //设置线框
        //setWireFrame(jigsawGameObj);
        //设置拼图component
        setJigsawCpt(jigsawGameObj, jigsawData);

        return(jigsawGameObj);
    }