示例#1
0
        private IEnumerator FixCoorinate(Action endCall)
        {
            foreach (var VARIABLE in _roomInfos)
            {
                VARIABLE.AddRigidbody2D();
            }

            while (!AllRoomSleep())
            {
                yield return(new WaitForFixedUpdate());
            }

            Debug.Log("开始坐标休整");
            foreach (var VARIABLE in _roomInfos)
            {
                VARIABLE.Rigidbody2D.constraints = RigidbodyConstraints2D.FreezeAll;
                VARIABLE.Pos = new Vector3(GridSize * ((int)(VARIABLE.Pos.x / GridSize)),
                                           GridSize * ((int)(VARIABLE.Pos.y / GridSize)),
                                           VARIABLE.Pos.z);
                //Point和room映射
                point2Room.Add(PointMgr.GetPoint(VARIABLE.Pos), VARIABLE);
            }

            Debug.Log("坐标休整完成");
            endCall?.Invoke();
        }
示例#2
0
    private void Awake()
    {
        GameManagerTopics.GetLastMeaning = null;
        GameManagerTopics.GetLastRace    = null;

        GameManagerTopics.GetLastMeaning += () => lastMeaning;
        GameManagerTopics.GetLastRace    += () => lastRace;

        pointMgr = GetComponent <PointMgr>();
    }
示例#3
0
    private void Awake()
    {
        canvasGroup = this.GetComponent <CanvasGroup>();

        retry.onClick.AddListener(() => { fadeImage.GetComponent <MainMenu>().LoadLevel(1); });
        exit.onClick.AddListener(() => { fadeImage.GetComponent <MainMenu>().LoadLevel(0); });

        if (canvasGroup == null)
        {
            Debug.LogError("Public reference on ManagerGameOver is null, fix it\n");
        }
        else
        {
            GameOverEvent.OpenPanel += () =>
            {
                EventManager.Invoke(SoundManagerTopics.PlayEffect, AudioClipName.Explosion01);

                UtilitiesGen.CallMethod(2, () => { UtilitiesUI.ObjectActivation(canvasGroup, ConstantValues.FADEINTIME); });
                PointMgr pointClass = FindObjectOfType <PointMgr>();

                if (lastScore == null)
                {
                    Debug.Log("last score null!!");
                }
                else
                {
                    lastScore.text = pointClass.currentPoints.ToString();
                    Debug.Log("last score SETTATO!!");
                }

                if (pointClass.record < pointClass.currentPoints)
                {
                    pointClass.record = pointClass.currentPoints;
                    UtilitiesGen.WritingToFile(FileName.PlayerData, pointClass.record);
                }

                if (bestScore == null)
                {
                    Debug.Log("best score null!!");
                }
                else
                {
                    bestScore.text = pointClass.record.ToString();
                    Debug.Log("best score SETTATO!!");
                }

                //SpaceShipHandler spaceShip = FindObjectOfType<SpaceShipHandler>();
                //spaceShip.reset();
                //spaceShip.earthObject.GetComponent<EarthEnergyHandler>().reset();
            };
        }
    }
示例#4
0
        private void ConnectRooms()
        {
            foreach (var line in minTreeLines)
            {
                #region 房屋互相联系起来

                var points = line.pointIds;
                var p1     = PointMgr.GetPoint(points[0]);
                var p2     = PointMgr.GetPoint(points[1]);
                var room1  = point2Room[p1];
                var room2  = point2Room[p2];
                room1.AddClosedRoom(room2);
                room2.AddClosedRoom(room1);

                #endregion

                var posType = RoomInfo.GetPointPosType(room1, room2);

                print(room1.obj.name + "  " + room2.obj.name + "  " + posType);

                switch (posType)
                {
                case RoomInfo.PosType.Cross:
                    break;

                case RoomInfo.PosType.Null:

                    var dir = room2.Pos - room1.Pos;


                    break;

                case RoomInfo.PosType.Ymid:
                    var heightRange = new Vector2(
                        Mathf.Max(room1.Down, room2.Down) + GridSize * pathWidth / 2,
                        Mathf.Min(room1.Up, room2.Up) - GridSize * pathWidth / 2);
                    var minRight = Mathf.Min(room1.Right, room2.Right);
                    var maxLeft  = Mathf.Max(room1.Left, room2.Left);
                    var height   = Random.Range(heightRange.x, heightRange.y);
                    var hh       = height + GridSize * pathWidth / 2;
                    var lh       = height - GridSize * pathWidth / 2;
                    Debug.Log(heightRange);
                    Debug.Log(minRight);
                    Debug.Log(maxLeft);
                    for (var i = minRight; i < maxLeft; i += 0.5f * GridSize)
                    {
                        tilemap.SetTile(new Vector3Int(Mathf.RoundToInt(i), Mathf.RoundToInt(hh), 0), pathTile);
                        tilemap.SetTile(new Vector3Int(Mathf.RoundToInt(i), Mathf.RoundToInt(lh), 0), pathTile);
                    }
                    break;

                case RoomInfo.PosType.Xmid:
                    var widthRange = new Vector2(
                        Mathf.Max(room1.Left, room2.Left) + GridSize * pathWidth / 2,
                        Mathf.Min(room1.Right, room2.Right) - GridSize * pathWidth / 2);
                    var minUp   = Mathf.Min(room1.Up, room2.Up);
                    var maxDown = Mathf.Max(room1.Down, room2.Down);
                    var width   = Random.Range(widthRange.x, widthRange.y);
                    var lw      = width - GridSize * pathWidth / 2;
                    var rw      = width + GridSize * pathWidth / 2;
                    for (var i = minUp; i < maxDown; i += 0.5f * GridSize)
                    {
                        tilemap.SetTile(new Vector3Int(Mathf.RoundToInt(lw), Mathf.RoundToInt(i), 0), pathTile);
                        tilemap.SetTile(new Vector3Int(Mathf.RoundToInt(rw), Mathf.RoundToInt(i), 0), pathTile);
                    }
                    break;
                }
            }
        }
示例#5
0
        /// <summary>
        /// 二维三角剖分算法
        /// </summary>
        /// <param name="vertices"></param>
        /// <returns></returns>
        public static List <Triangle> Delaunay2D(List <Vector2> vertices)
        {
            var pointList = new List <Point>();

            #region 初始化顶点列表

            foreach (var VARIABLE in vertices)
            {
                pointList.Add(PointMgr.GetPoint(VARIABLE));
            }
            pointList.Sort();

            #endregion


            #region 获取超级三角形

            float l = pointList[0].pos.x;
            float r = pointList[pointList.Count - 1].pos.x;

            float u = pointList[0].pos.y;
            float d = pointList[0].pos.y;
            foreach (var VARIABLE in pointList)
            {
                if (VARIABLE.pos.y < d)
                {
                    d = VARIABLE.pos.y;
                }
                if (VARIABLE.pos.y > u)
                {
                    u = VARIABLE.pos.y;
                }
            }

            var width = r - l;
            var hight = u - d;
            if (width < hight)
            {
                width = hight;
            }
            var top   = new Vector3((l + r) / 2, u + hight, 0);
            var left  = new Vector3((l + r) / 2 - width - 5, d - 5, 0);
            var right = new Vector3((l + r) / 2 + width + 5, d - 5, 0);

            var superTriangle = TriangleMgr.GetTriangle(top, left, right);


            #endregion



            var targetTriangles = new List <Triangle>();
            var tempTriangles   = new List <Triangle>();

            //将超级三角形加入临时三角形队列
            tempTriangles.Add(superTriangle);
            targetTriangles.Add(superTriangle);


            for (var i = 0; i < pointList.Count; i++)
            {
                var point      = pointList[i];
                var edgeBuffer = new List <Line>();
                for (var j = 0; j < tempTriangles.Count; j++)
                {
                    var triangle  = tempTriangles[j];
                    var outCircle = triangle.GetOutCircle();

                    //如果在园内,说明,当前三角形不是Delaunay三角形
                    if (outCircle.ContansPoint(point))
                    {
                        //将三边加入边缓存
                        foreach (var edge in triangle.Edges)
                        {
                            //判断是否重复
                            bool add = true;
                            foreach (var VARIABLE in edgeBuffer)
                            {
                                if (VARIABLE == edge)
                                {
                                    add = false;
                                }
                            }

                            if (add)
                            {
                                edgeBuffer.Add(edge);
                            }
                            else
                            {
                                edgeBuffer.Remove(edge);
                            }
                        }

                        //移除当前三角形
                        tempTriangles.RemoveAt(j);
                        j--;
                    }//如果点在外接圆右侧,说明当前三角形是Delaunay三角形
                    else if (point.pos.x > outCircle.CenterPos.x + outCircle.radius)
                    {
                        targetTriangles.Add(triangle);
                        tempTriangles.RemoveAt(j);
                        j--;
                    }
                }
                //当前点和缓存边相连构成三角形
                foreach (var edge in edgeBuffer)
                {
                    tempTriangles.Add(TriangleMgr.GetTriangle(point, edge));
                }
            }

            //合并targetTriangles 和TempTriangles
            foreach (var t in tempTriangles)
            {
                if (targetTriangles.Contains(t) == false)
                {
                    targetTriangles.Add(t);
                }
            }

            //除去与超级三角形有关的三角形

            for (var i = 0; i < targetTriangles.Count; i++)
            {
                var triangle = targetTriangles[i];
                var edges    = triangle.Points;
                foreach (var superEdge in superTriangle.Points)
                {
                    if (edges.Contains(superEdge))
                    {
                        targetTriangles.RemoveAt(i);
                        i--;
                        break;
                    }
                }
            }

            return(targetTriangles);
        }