/// <summary> /// Makes a zig zag path /// </summary> /// <param name="startPos"></param> /// <param name="endPos"></param> /// <param name="zigZag"></param> /// <param name="steps"></param> /// <param name="speed"></param> public void makePathZigZag(Vector2 startPos, Vector2 endPos, Vector2 zigZag, int steps, float speed) { lst = new List<WayPoint>(); float zig = 1; for (int i = 0; i < steps; i++) { Vector2 v=new Vector2(0,0); float lerp = (float)i / ((float)steps-1); v.X = MathHelper.Lerp(startPos.X, endPos.X, lerp); v.Y = MathHelper.Lerp(startPos.Y, endPos.Y, lerp); v = v + (zig * zigZag); WayPoint w = new WayPoint(v, speed); add(w); zig = zig * (-1); } wayFinished = 1; // typically you want this }
/// <summary> /// Make a parabolic path changing velocity by delta to -/+ limits in /// </summary> /// <param name="startPos"></param> /// <param name="initVelocity"></param> /// <param name="delta"></param> /// <param name="speedLimit"></param> /// <param name="limits"></param> public void makePathDelta(float speed, int maxSteps, Vector2 startPos, Vector2 initVelocity, Vector2 delta, Rectangle limits) { lst = new List<WayPoint>(); Vector2 p = new Vector2(startPos.X, startPos.Y); Vector2 v = new Vector2(initVelocity.X, initVelocity.Y); WayPoint w = new WayPoint(p, speed); add(w); for (int i = 0; i < maxSteps - 1; i++) { //Vector2 v = new Vector2(p.X+v.X,p.Y+v.X); p=p+v; v = v + delta; w = new WayPoint(p, speed); add(w); if (!limits.Contains((int)p.X, (int)p.Y)) { break; } } wayFinished = 2; // typically you want this }
/// <summary> /// returns the index for subsequent use as leg /// </summary> /// <param name="w"></param> /// <returns></returns> public int add(WayPoint w) { lst.Add(w); return lst.Count() - 1; }
/// <summary> /// Construct a circular path of waypoints /// </summary> /// <param name="center"></param> /// <param name="radius"></param> /// <param name="startAngle"></param> /// <param name="angleIncrement"></param> /// <param name="steps"></param> /// <param name="speed"></param> /// <param name="Xscale">usually 1 for a circle, vary from 1 to creat ovals</param> public void makePathCircle(Vector2 center, float radius, float startAngle, float angleIncrement, int steps, float speed, float Xscale) { lst = new List<WayPoint>(); for (int i = 0; i < steps; i++) { Vector2 v = Util.moveByAngleDist(new Vector2(0, 0), startAngle + (i * angleIncrement), radius); v.X = v.X * Xscale; v = v + center; WayPoint w = new WayPoint(v, speed); add(w); } }
/// <summary> /// Construct a 3 position walpoint list /// </summary> /// <param name="w1"></param> /// <param name="w2"></param> /// <param name="w3"></param> /// <param name="wayFinishedZ"></param> public WayPointList(WayPoint w1, WayPoint w2, WayPoint w3, int wayFinishedZ) { wayFinished = wayFinishedZ; reset(); add(w1); add(w2); add(w3); }