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; } }
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; } } }
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); }