private void getBulgeVertices(List <Vector3> listVertices, JigsawBulgeEnum jigsawBulge, Direction2DEnum direction, float withX, float highY) { List <Vector3> convex; List <Vector3> concave; List <Vector3> leftConcavePositionList = new List <Vector3>(); leftConcavePositionList.Add(new Vector3(-withX, -1.4f)); leftConcavePositionList.Add(new Vector3(-withX + sawtoothHigh, -1.2f)); leftConcavePositionList.Add(new Vector3(-withX - sawtoothHigh, -1f)); leftConcavePositionList.Add(new Vector3(-withX + sawtoothHigh, -0.8f)); leftConcavePositionList.Add(new Vector3(-withX - sawtoothHigh, -0.6f)); leftConcavePositionList.Add(new Vector3(-withX + sawtoothHigh, -0.4f)); leftConcavePositionList.Add(new Vector3(-withX - sawtoothHigh, -0.2f)); leftConcavePositionList.Add(new Vector3(-withX + sawtoothHigh, 0f)); leftConcavePositionList.Add(new Vector3(-withX - sawtoothHigh, 0.2f)); leftConcavePositionList.Add(new Vector3(-withX + sawtoothHigh, 0.4f)); leftConcavePositionList.Add(new Vector3(-withX - sawtoothHigh, 0.6f)); leftConcavePositionList.Add(new Vector3(-withX + sawtoothHigh, 0.8f)); leftConcavePositionList.Add(new Vector3(-withX - sawtoothHigh, 1f)); leftConcavePositionList.Add(new Vector3(-withX + sawtoothHigh, 1.2f)); leftConcavePositionList.Add(new Vector3(-withX, 1.4f)); GameUtil.getJigsawPuzzlescCCPositon(leftConcavePositionList, direction, withX, highY, out convex, out concave); if (jigsawBulge.Equals(JigsawBulgeEnum.Bulge)) { listVertices.AddRange(convex); } else if (jigsawBulge.Equals(JigsawBulgeEnum.Sunken)) { listVertices.AddRange(concave); } }
/// <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)); }
private void getBulgeVertices(List <Vector3> listVertices, JigsawBulgeEnum jigsawBulge, Direction2DEnum direction, float withX, float highY) { List <Vector3> convex; List <Vector3> concave; List <Vector3> leftConcavePositionList = new List <Vector3>(); //TODO 添加传统拼图形状 leftConcavePositionList.Add(new Vector3(-withX, -crossWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX - 0.45f, -crossWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX - 0.45f, -crossWith / 2f - 0.3f)); leftConcavePositionList.Add(new Vector3(-withX - 0.45f - crossWith, -crossWith / 2f - 0.3f)); leftConcavePositionList.Add(new Vector3(-withX - 0.45f - crossWith, -crossWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX - 1f, -crossWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX - 1f, crossWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX - 0.45f - crossWith, crossWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX - 0.45f - crossWith, crossWith / 2f + 0.3f)); leftConcavePositionList.Add(new Vector3(-withX - 0.45f, crossWith / 2f + 0.3f)); leftConcavePositionList.Add(new Vector3(-withX - 0.45f, crossWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX, crossWith / 2f)); GameUtil.getJigsawPuzzlescCCPositon(leftConcavePositionList, direction, withX, highY, out convex, out concave); if (jigsawBulge.Equals(JigsawBulgeEnum.Bulge)) { listVertices.AddRange(convex); } else if (jigsawBulge.Equals(JigsawBulgeEnum.Sunken)) { listVertices.AddRange(concave); } }
/// <summary> /// 设置拼图块所有边的凹凸情况 /// </summary> /// <param name="listJigsaw">所有的拼图块</param> /// <param name="jigsawItem">当前拼图块</param> protected void setBulgeEdgeForItem(List <JigsawBean> listJigsaw, JigsawBean jigsawItem) { JigsawBulgeEnum leftBulge = JigsawBulgeEnum.Smooth; JigsawBulgeEnum rightBulge = JigsawBulgeEnum.Smooth; JigsawBulgeEnum belowBulge = JigsawBulgeEnum.Smooth; JigsawBulgeEnum aboveBulge = JigsawBulgeEnum.Smooth; int listJigsawCount = listJigsaw.Count; Vector2 markLocation = jigsawItem.MarkLocation; if (markLocation == null) { return; } for (int childposition = 0; childposition < listJigsawCount; childposition++) { JigsawBean childJigsaw = listJigsaw[childposition]; Vector2 childMarkLocation = childJigsaw.MarkLocation; if (markLocation == null) { continue; } if (childMarkLocation.y.Equals(markLocation.y)) { if ((childMarkLocation.x - markLocation.x) == 1) { rightBulge = compareBulge(childJigsaw, JigsawStyleNormalEdgeEnum.Right); } else if ((childMarkLocation.x - markLocation.x) == -1) { leftBulge = compareBulge(childJigsaw, JigsawStyleNormalEdgeEnum.Left); } } if (childMarkLocation.x.Equals(markLocation.x)) { if ((childMarkLocation.y - markLocation.y) == 1) { aboveBulge = compareBulge(childJigsaw, JigsawStyleNormalEdgeEnum.Above); } else if ((childMarkLocation.y - markLocation.y) == -1) { belowBulge = compareBulge(childJigsaw, JigsawStyleNormalEdgeEnum.Below); } } } setBulgeEdge(jigsawItem, new JigsawBulgeEnum[4] { leftBulge, aboveBulge, rightBulge, belowBulge }); }
public override void setListVerticesForItem(JigsawBean jigsawItem) { base.baseSetListVerticesForItem(jigsawItem); float withX = jigsawItem.JigsawWith / 2f; float highY = jigsawItem.JigsawHigh / 2f; //根据凹凸属性生成坐标点 List <Vector3> listVertices = new List <Vector3>(); JigsawBulgeEnum[] listBulge = jigsawItem.ListBulge; JigsawBulgeEnum leftBulge = listBulge[0]; JigsawBulgeEnum aboveBulge = listBulge[1]; JigsawBulgeEnum rightBulge = listBulge[2]; JigsawBulgeEnum belowBulge = listBulge[3]; //添加起始点 listVertices.Add(jigsawItem.CenterVector); //添加左下角点 listVertices.Add(new Vector3(-withX, -highY)); //添加左边点 getTrapezoidVertices(listVertices, leftBulge, Direction2DEnum.Left, withX, highY); //添加左上角点 listVertices.Add(new Vector3(-withX, highY)); //添加上边点 getTrapezoidVertices(listVertices, aboveBulge, Direction2DEnum.Above, withX, highY); //添加右上角点 listVertices.Add(new Vector3(withX, highY)); //添加右边 getTrapezoidVertices(listVertices, rightBulge, Direction2DEnum.Right, withX, highY); //添加右下角点 listVertices.Add(new Vector3(withX, -highY)); //添加下边 getTrapezoidVertices(listVertices, belowBulge, Direction2DEnum.Below, withX, highY); setListVertices(jigsawItem, listVertices); }
private void getHeartVertices(List <Vector3> listVertices, JigsawBulgeEnum jigsawBulge, Direction2DEnum direction, float withX, float highY) { List <Vector3> convex; List <Vector3> concave; List <Vector3> leftConcavePositionList = new List <Vector3>(); leftConcavePositionList.Add(new Vector3(-withX, -m_HeartFoot / 2f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh / 2f, -m_HeartWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 4.5f / 6f, -m_HeartWith * 5.5f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5.5f / 6f, -m_HeartWith * 4.5f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5.8f / 6f, -m_HeartWith * 3.2f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5.8f / 6f, -m_HeartWith * 2.8f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5.5f / 6f, -m_HeartWith * 1.5f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5f / 6f, -m_HeartWith * 0.5f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 3f / 4f, 0f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5f / 6f, m_HeartWith * 0.5f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5.5f / 6f, m_HeartWith * 1.5f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5.8f / 6f, m_HeartWith * 2.8f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5.8f / 6f, m_HeartWith * 3.2f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 5.5f / 6f, m_HeartWith * 4.5f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh * 4.5f / 6f, m_HeartWith * 5.5f / 12f)); leftConcavePositionList.Add(new Vector3(-withX + -m_HeartHigh / 2f, m_HeartWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX, m_HeartFoot / 2f)); GameUtil.getJigsawPuzzlescCCPositon(leftConcavePositionList, direction, withX, highY, out convex, out concave); if (jigsawBulge.Equals(JigsawBulgeEnum.Bulge)) { listVertices.AddRange(convex); } else if (jigsawBulge.Equals(JigsawBulgeEnum.Sunken)) { listVertices.AddRange(concave); } }
private void getTriangleVertices(List <Vector3> listVertices, JigsawBulgeEnum jigsawBulge, Direction2DEnum direction, float withX, float highY) { List <Vector3> convex; List <Vector3> concave; List <Vector3> leftConcavePositionList = new List <Vector3>(); leftConcavePositionList.Add(new Vector3(-withX, -m_TriangleWith / 2f)); leftConcavePositionList.Add(new Vector3(-withX + -m_TriangleHigh, 0)); leftConcavePositionList.Add(new Vector3(-withX, m_TriangleWith / 2f)); GameUtil.getJigsawPuzzlescCCPositon(leftConcavePositionList, direction, withX, highY, out convex, out concave); if (jigsawBulge.Equals(JigsawBulgeEnum.Bulge)) { listVertices.AddRange(convex); } else if (jigsawBulge.Equals(JigsawBulgeEnum.Sunken)) { listVertices.AddRange(concave); } }
private void getPentagramVertices(List <Vector3> listVertices, JigsawBulgeEnum jigsawBulge, Direction2DEnum direction, float withX, float highY) { List <Vector3> convex; List <Vector3> concave; List <Vector3> leftConcavePositionList = new List <Vector3>(); leftConcavePositionList.Add(new Vector3(-withX, -m_PentagramFoot)); leftConcavePositionList.Add(new Vector3(-withX + 0.2f * m_PentagramZoom - m_PentagramWith / 2f, -0.15f * m_PentagramZoom)); leftConcavePositionList.Add(new Vector3(-withX + 0.15f * m_PentagramZoom - m_PentagramWith / 2f, -0.47f * m_PentagramZoom)); leftConcavePositionList.Add(new Vector3(-withX + -0.08f * m_PentagramZoom - m_PentagramWith / 2f, -0.24f * m_PentagramZoom)); leftConcavePositionList.Add(new Vector3(-withX + -0.4f * m_PentagramZoom - m_PentagramWith / 2f, -0.29f * m_PentagramZoom)); leftConcavePositionList.Add(new Vector3(-withX + -0.25f * m_PentagramZoom - m_PentagramWith / 2f, 0f)); leftConcavePositionList.Add(new Vector3(-withX + -0.4f * m_PentagramZoom - m_PentagramWith / 2f, 0.29f * m_PentagramZoom)); leftConcavePositionList.Add(new Vector3(-withX + -0.08f * m_PentagramZoom - m_PentagramWith / 2f, 0.24f * m_PentagramZoom)); leftConcavePositionList.Add(new Vector3(-withX + 0.15f * m_PentagramZoom - m_PentagramWith / 2f, 0.47f * m_PentagramZoom)); leftConcavePositionList.Add(new Vector3(-withX + 0.2f * m_PentagramZoom - m_PentagramWith / 2f, 0.15f * m_PentagramZoom)); leftConcavePositionList.Add(new Vector3(-withX, m_PentagramFoot)); GameUtil.getJigsawPuzzlescCCPositon(leftConcavePositionList, direction, withX, highY, out convex, out concave); if (jigsawBulge.Equals(JigsawBulgeEnum.Bulge)) { listVertices.AddRange(convex); } else if (jigsawBulge.Equals(JigsawBulgeEnum.Sunken)) { listVertices.AddRange(concave); } }
/// <summary> /// 比较相邻拼图碎片的凹凸情况 获取自身的凹凸情况 /// </summary> /// <param name="jigsawBean"></param> /// <returns></returns> protected JigsawBulgeEnum compareBulge(JigsawBean compareJigsaw, JigsawStyleNormalEdgeEnum edgeEnum) { if (compareJigsaw == null) { return(JigsawBulgeEnum.Smooth); } //获取相邻拼图的凹凸情况 JigsawBulgeEnum[] compareBulgeList = compareJigsaw.ListBulge; if (compareBulgeList == null || compareBulgeList.Length != 4) { int randonBulge = DevUtil.getRandomInt(1, 2); if (randonBulge == 1) { return(JigsawBulgeEnum.Bulge); } else { return(JigsawBulgeEnum.Sunken); } } int bulgeposition; if (edgeEnum == JigsawStyleNormalEdgeEnum.Left) { bulgeposition = 2; } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Above) { bulgeposition = 3; } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Right) { bulgeposition = 0; } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Below) { bulgeposition = 1; } else { return(JigsawBulgeEnum.Smooth); } JigsawBulgeEnum compareBulgeEnum = compareBulgeList[bulgeposition]; if (compareBulgeEnum == JigsawBulgeEnum.Smooth) { return(JigsawBulgeEnum.Smooth); } else if (compareBulgeEnum == JigsawBulgeEnum.Bulge) { return(JigsawBulgeEnum.Sunken); } else if (compareBulgeEnum == JigsawBulgeEnum.Sunken) { return(JigsawBulgeEnum.Bulge); } else { return(JigsawBulgeEnum.Smooth); } }
/// <summary> /// 设置顶点 /// </summary> /// <param name="jigsawItem"></param> public override void setListVerticesForItem(JigsawBean jigsawItem) { JigsawBulgeEnum[] listBulge = jigsawItem.ListBulge; if (listBulge == null) { throw new Exception("没有凹凸参数"); } base.baseSetListVerticesForItem(jigsawItem); //根据凹凸属性生成坐标点 List <Vector3> listVertices = new List <Vector3>(); JigsawBulgeEnum leftBulge = listBulge[0]; JigsawBulgeEnum aboveBulge = listBulge[1]; JigsawBulgeEnum rightBulge = listBulge[2]; JigsawBulgeEnum belowBulge = listBulge[3]; float withX = jigsawItem.JigsawWith / 2f; float highY = jigsawItem.JigsawHigh / 2f; //添加起始点 listVertices.Add(jigsawItem.CenterVector); //添加左下角点 listVertices.Add(new Vector3(-withX, -highY)); //添加左边凸出部分坐标点 Vector3 lefgEdgeCenterVector = new Vector3(-withX, 0); List <Vector3> leftCircleVertices = getCircleVertices(lefgEdgeCenterVector, m_JigsawBulgeR, JigsawStyleNormalEdgeEnum.Left, leftBulge); List <Vector3> leftVertices = getCirclePartEdgeVerticesForNormal(leftCircleVertices, lefgEdgeCenterVector, JigsawStyleNormalEdgeEnum.Left, leftBulge); listVertices.AddRange(leftVertices); //添加左上角点 listVertices.Add(new Vector3(-withX, highY)); //添加上边凸出部分坐标点 Vector3 aboveEdgeCenterVector = new Vector3(0, highY); List <Vector3> aboveCircleVertices = getCircleVertices(aboveEdgeCenterVector, m_JigsawBulgeR, JigsawStyleNormalEdgeEnum.Above, aboveBulge); List <Vector3> aboveVertices = getCirclePartEdgeVerticesForNormal(aboveCircleVertices, aboveEdgeCenterVector, JigsawStyleNormalEdgeEnum.Above, aboveBulge); listVertices.AddRange(aboveVertices); //添加右上角点 listVertices.Add(new Vector3(withX, highY)); //添加右边凸出部分坐标点 Vector3 rightEdgeCenterVector = new Vector3(withX, 0); List <Vector3> rightCircleVertices = getCircleVertices(rightEdgeCenterVector, m_JigsawBulgeR, JigsawStyleNormalEdgeEnum.Right, rightBulge); List <Vector3> rightVertices = getCirclePartEdgeVerticesForNormal(rightCircleVertices, rightEdgeCenterVector, JigsawStyleNormalEdgeEnum.Right, rightBulge); listVertices.AddRange(rightVertices); //添加右下角点 listVertices.Add(new Vector3(withX, -highY)); //添加下边凸出部分坐标点 Vector3 belowEdgeCenterVector = new Vector3(0, -highY); List <Vector3> belowCircleVertices = getCircleVertices(belowEdgeCenterVector, m_JigsawBulgeR, JigsawStyleNormalEdgeEnum.Below, belowBulge); List <Vector3> belowVertices = getCirclePartEdgeVerticesForNormal(belowCircleVertices, belowEdgeCenterVector, JigsawStyleNormalEdgeEnum.Below, belowBulge); listVertices.AddRange(belowVertices); setListVertices(jigsawItem, listVertices); }
/// <summary> /// 获取普通拼图凸出部分点坐标 /// </summary> /// <param name="circleVertices"></param> /// <param name="edgeEnum"></param> /// <returns></returns> private List <Vector3> getCirclePartEdgeVerticesForNormal(List <Vector3> circleVertices, Vector3 centerVecotr, JigsawStyleNormalEdgeEnum edgeEnum, JigsawBulgeEnum bulgeEnum) { List <Vector3> listVertices = new List <Vector3>(); foreach (Vector3 itemVector in circleVertices) { if (edgeEnum == JigsawStyleNormalEdgeEnum.Left) { if (bulgeEnum == JigsawBulgeEnum.Bulge) { if (itemVector.x <= centerVecotr.x) { listVertices.Add(itemVector); } } else if (bulgeEnum == JigsawBulgeEnum.Sunken) { if (itemVector.x >= centerVecotr.x) { listVertices.Add(itemVector); } } } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Above) { if (bulgeEnum == JigsawBulgeEnum.Bulge) { if (itemVector.y >= centerVecotr.y) { listVertices.Add(itemVector); } } else if (bulgeEnum == JigsawBulgeEnum.Sunken) { if (itemVector.y <= centerVecotr.y) { listVertices.Add(itemVector); } } } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Right) { if (bulgeEnum == JigsawBulgeEnum.Bulge) { if (itemVector.x >= centerVecotr.x) { listVertices.Add(itemVector); } } else if (bulgeEnum == JigsawBulgeEnum.Sunken) { if (itemVector.x <= centerVecotr.x) { listVertices.Add(itemVector); } } } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Below) { if (bulgeEnum == JigsawBulgeEnum.Bulge) { if (itemVector.y <= centerVecotr.y) { listVertices.Add(itemVector); } } else if (bulgeEnum == JigsawBulgeEnum.Sunken) { if (itemVector.y >= centerVecotr.y) { listVertices.Add(itemVector); } } } } return(listVertices); }
/// <summary> /// 获取凸出部分的圆所有坐标 /// </summary> /// <param name="CenterVector"></param> /// <param name="edgeEnum"></param> /// <param name="bulgeEnum"></param> /// <returns></returns> private List <Vector3> getCircleVertices(Vector3 centerVector, float bulgeR, JigsawStyleNormalEdgeEnum edgeEnum, JigsawBulgeEnum bulgeEnum) { if (edgeEnum == JigsawStyleNormalEdgeEnum.Left) { if (bulgeEnum == JigsawBulgeEnum.Bulge) { return(GeometryUtil.getCircleVertices(centerVector, bulgeR, m_JigsawTriangleNumber, true, CircleStartVectorEnum.Below)); } else if (bulgeEnum == JigsawBulgeEnum.Sunken) { return(GeometryUtil.getCircleVertices(centerVector, bulgeR, m_JigsawTriangleNumber, false, CircleStartVectorEnum.Below)); } } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Above) { if (bulgeEnum == JigsawBulgeEnum.Bulge) { return(GeometryUtil.getCircleVertices(centerVector, bulgeR, m_JigsawTriangleNumber, true, CircleStartVectorEnum.Left)); } else if (bulgeEnum == JigsawBulgeEnum.Sunken) { return(GeometryUtil.getCircleVertices(centerVector, bulgeR, m_JigsawTriangleNumber, false, CircleStartVectorEnum.Left)); } } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Right) { if (bulgeEnum == JigsawBulgeEnum.Bulge) { return(GeometryUtil.getCircleVertices(centerVector, bulgeR, m_JigsawTriangleNumber, true, CircleStartVectorEnum.Above)); } else if (bulgeEnum == JigsawBulgeEnum.Sunken) { return(GeometryUtil.getCircleVertices(centerVector, bulgeR, m_JigsawTriangleNumber, false, CircleStartVectorEnum.Above)); } } else if (edgeEnum == JigsawStyleNormalEdgeEnum.Below) { if (bulgeEnum == JigsawBulgeEnum.Bulge) { return(GeometryUtil.getCircleVertices(centerVector, bulgeR, m_JigsawTriangleNumber, true, CircleStartVectorEnum.Right)); } else if (bulgeEnum == JigsawBulgeEnum.Sunken) { return(GeometryUtil.getCircleVertices(centerVector, bulgeR, m_JigsawTriangleNumber, false, CircleStartVectorEnum.Right)); } } return(new List <Vector3>()); }