示例#1
0
        void OnCollisionEnter2D(Collision2D collision)
        {
            if (collision.collider.name.Contains("Terrain"))
            {
                Vector2D pos = new Vector2D(transform.position);

                Polygon2D.defaultCircleVerticesCount = 15;

                Polygon2D slicePolygon        = Polygon2D.Create(Polygon2D.PolygonType.Circle, 2f);
                Polygon2D slicePolygonDestroy = Polygon2D.Create(Polygon2D.PolygonType.Circle, 2.5f);

                slicePolygon        = slicePolygon.ToOffset(pos);
                slicePolygonDestroy = slicePolygonDestroy.ToOffset(pos);

                foreach (Sliceable2D id in Sliceable2D.GetListCopy())
                {
                    Slice2D result = Slicer2D.API.PolygonSlice(id.shape.GetLocal().ToWorldSpace(id.transform), slicePolygon);
                    if (result.GetPolygons().Count > 0)
                    {
                        foreach (Polygon2D p in new List <Polygon2D>(result.GetPolygons()))
                        {
                            if (slicePolygonDestroy.PolyInPoly(p) == true)
                            {
                                result.GetPolygons().Remove(p);
                            }
                        }

                        if (result.GetPolygons().Count > 0)
                        {
                            id.PerformResult(result.GetPolygons(), new Slice2D());
                        }
                        else
                        {
                            // Polygon is Destroyed!!!
                            Destroy(id.gameObject);
                        }
                    }
                }

                Destroy(gameObject);

                Polygon2D.defaultCircleVerticesCount = 25;
            }
        }
示例#2
0
        public List <Slice2D> Update(Vector2D position, float timer, Layer layer)
        {
            List <Slice2D> result = new List <Slice2D>();

            foreach (Sliceable2D slicer in Sliceable2D.GetListCopy())
            {
                if (slicer.MatchLayers(layer) == false)
                {
                    continue;
                }

                Trail.Object trail = null;
                trailList.TryGetValue(slicer, out trail);

                if (trail == null)
                {
                    trail = new Trail.Object();
                    trailList.Add(slicer, trail);
                }

                if (trail.lastPosition != null)
                {
                    if (Vector2D.Distance(trail.lastPosition, position) > 0.05f)
                    {
                        trail.pointsList.Insert(0, new Trail.Point(position, timer));
                    }
                }
                else
                {
                    trail.pointsList.Insert(0, new Trail.Point(position, timer));
                }

                foreach (Trail.Point trailPoint in new List <Trail.Point>(trail.pointsList))
                {
                    if (trailPoint.Update() == false)
                    {
                        trail.pointsList.Remove(trailPoint);
                    }
                }

                if (trail.pointsList.Count > 1)
                {
                    Vector2D firstPoint  = null;
                    Vector2D lastPoint   = null;
                    bool     insideState = false;

                    foreach (Trail.Point trailPoint in trail.pointsList)
                    {
                        bool inside = false;
                        if (slicer.shape.GetLocal().PointInPoly(trailPoint.position.InverseTransformPoint(slicer.transform)))
                        {
                            inside = true;
                        }

                        switch (insideState)
                        {
                        case true:
                            // Slice!
                            if (inside == false)
                            {
                                lastPoint = trailPoint.position;

                                insideState = false;
                                break;
                            }
                            break;

                        case false:
                            if (inside == false)
                            {
                                // Searching For Start of Slice
                                firstPoint  = trailPoint.position;
                                insideState = true;
                            }
                            break;
                        }

                        if (lastPoint != null)
                        {
                            break;
                        }
                    }

                    if (firstPoint != null && lastPoint != null)
                    {
                        Sliceable2D.complexSliceType = Sliceable2D.SliceType.Regular;

                        Slice2D slice = slicer.LinearSlice(new Pair2D(firstPoint, lastPoint));
                        if (slice.GetGameObjects().Count > 0)
                        {
                            trailList.Remove(slicer);

                            result.Add(slice);
                        }
                        ;
                    }
                }

                trail.lastPosition = position;
            }
            return(result);
        }
        public void Update(Vector2 position, float minVertexDistance = 1f)
        {
            List <Sliceable2D> slicer2DList = Sliceable2D.GetListCopy();

            Vector2D trackedPos;

            foreach (Sliceable2D slicer in slicer2DList)
            {
                Tracker.Object tracker = null;
                trackerList.TryGetValue(slicer, out tracker);

                if (tracker == null)
                {
                    tracker = new Tracker.Object();
                    trackerList.Add(slicer, tracker);
                }

                trackedPos = new Vector2D(slicer.transform.transform.InverseTransformPoint(position));

                if (tracker.lastPosition != null)
                {
                    if (slicer.shape.GetLocal().PointInPoly(trackedPos))
                    {
                        if (tracker.tracking == false)
                        {
                            tracker.pointsList.Add(tracker.lastPosition);
                        }

                        tracker.tracking = true;

                        if (tracker.pointsList.Count < 1 || (Vector2D.Distance(trackedPos, tracker.pointsList.Last()) > minVertexDistance))
                        {
                            tracker.pointsList.Add(trackedPos);
                        }
                    }
                    else if (tracker.tracking == true)
                    {
                        tracker.tracking = false;

                        /*
                         *
                         * Vector2D posA = new Vector2D(tracker.pointsList.Last());
                         * Vector2D posB = new Vector2D(trackedPos);
                         *
                         * float rot = (floatVector2D.Atan2(posB, posA);
                         *
                         * posB.Push(rot, 1);
                         *
                         * tracker.pointsList.Add(posB);
                         */

                        tracker.pointsList.Add(trackedPos);



                        // Test


                        List <Vector2D> slicePoints = new List <Vector2D>();
                        foreach (Vector2D point in tracker.pointsList)
                        {
                            slicePoints.Add(new Vector2D(slicer.transform.TransformPoint(point.ToVector2())));
                        }

                        Slice2D slice = slicer.ComplexSlice(slicePoints);
                        if (slice.GetGameObjects().Count > 0)
                        {
                            CopyTracker(slice, slicer);
                        }
                        ;

                        trackerList.Remove(slicer);
                    }
                    else
                    {
                        if (tracker.tracking == false && tracker.lastPosition != null)
                        {
                            if (trackedPos.x != tracker.lastPosition.x && trackedPos.y != tracker.lastPosition.y)
                            {
                                bool collision = Math2D.LineIntersectPoly(new Pair2D(trackedPos, tracker.lastPosition), slicer.shape.GetLocal());

                                if (collision)
                                {
                                    tracker.firstPosition = tracker.lastPosition;

                                    tracker.tracking = true;
                                }
                            }
                        }
                    }
                }

                if (tracker != null)
                {
                    tracker.lastPosition = trackedPos;
                }
            }
        }
        public void Update(Vector2 position, float minVertexDistance = 1f)
        {
            List <Sliceable2D> slicer2DList = Sliceable2D.GetListCopy();

            Vector2D trackedPos;

            foreach (Sliceable2D slicer in slicer2DList)
            {
                Tracker.Object tracker = null;
                trackerList.TryGetValue(slicer, out tracker);

                if (tracker == null)
                {
                    tracker = new Tracker.Object();
                    trackerList.Add(slicer, tracker);
                }

                trackedPos = new Vector2D(slicer.transform.transform.InverseTransformPoint(position));

                if (tracker.lastPosition != null)
                {
                    if (slicer.shape.GetLocal().PointInPoly(trackedPos))
                    {
                        if (tracker.tracking == false)
                        {
                            tracker.firstPosition = tracker.lastPosition;
                        }

                        tracker.tracking = true;
                    }
                    else if (tracker.tracking == true)
                    {
                        tracker.tracking = false;

                        if (tracker.firstPosition != null)
                        {
                            tracker.lastPosition = trackedPos;

                            Pair2D slicePair = new Pair2D(new Vector2D(slicer.transform.TransformPoint(tracker.firstPosition.ToVector2())), new Vector2D(slicer.transform.TransformPoint(tracker.lastPosition.ToVector2())));

                            Slice2D slice = slicer.LinearSlice(slicePair);
                            if (slice.GetGameObjects().Count > 0)
                            {
                                CopyTracker(slice, slicer);
                            }
                            ;
                        }

                        trackerList.Remove(slicer);
                    }
                    else
                    {
                        if (tracker.tracking == false && tracker.lastPosition != null)
                        {
                            if (trackedPos.x != tracker.lastPosition.x && trackedPos.y != tracker.lastPosition.y)
                            {
                                bool collision = Math2D.LineIntersectPoly(new Pair2D(trackedPos, tracker.lastPosition), slicer.shape.GetLocal());

                                if (collision)
                                {
                                    tracker.firstPosition = tracker.lastPosition;

                                    tracker.tracking = true;
                                }
                            }
                        }
                    }
                }

                if (tracker != null)
                {
                    tracker.lastPosition = trackedPos;
                }
            }
        }
示例#5
0
        public List <Slice2D> Update(Vector2D position, float timer, Layer layer)
        {
            List <Slice2D> result = new List <Slice2D>();

            foreach (Sliceable2D slicer in Sliceable2D.GetListCopy())
            {
                if (slicer.MatchLayers(layer) == false)
                {
                    continue;
                }

                Trail.Object trail = null;
                trailList.TryGetValue(slicer, out trail);

                if (trail == null)
                {
                    trail = new Trail.Object();
                    trailList.Add(slicer, trail);
                }

                if (trail.lastPosition != null)
                {
                    if (Vector2D.Distance(trail.lastPosition, position) > 0.05f)
                    {
                        trail.pointsList.Add(new Trail.Point(position, timer));
                    }
                }
                else
                {
                    trail.pointsList.Add(new Trail.Point(position, timer));
                }

                if (trail.pointsList.Count > 1)
                {
                    foreach (Trail.Point trailPoint in new List <Trail.Point>(trail.pointsList))
                    {
                        if (trailPoint.Update() == false)
                        {
                            trail.pointsList.Remove(trailPoint);
                        }
                    }

                    List <Vector2D> points = new List <Vector2D>();
                    foreach (Trail.Point trailPoint in trail.pointsList)
                    {
                        points.Add(trailPoint.position);
                    }

                    Sliceable2D.complexSliceType = Sliceable2D.SliceType.Regular;
                    Slice2D slice = slicer.ComplexSlice(points);
                    if (slice.GetGameObjects().Count > 0)
                    {
                        trailList.Remove(slicer);

                        result.Add(slice);
                    }
                    ;
                }

                trail.lastPosition = position;
            }

            return(result);
        }