public float getDistanceRemaining() { if (!hasWayPoint()) { return 0; } float dist = getDistanceTo(getWayPoint()); for (int i = mWayPointIndex + 1; i < mPath.count(); i++) { Vector2 wThis = mPath.get(i); Vector2 wLast = mPath.get(i - 1); dist += wThis.copy().sub(wLast).len(); } return dist; }
public void sendBack(float dist) { int index = mWayPointIndex - 1; Vector2 pos = getPosition().copy(); while (index > 0) { Vector2 wp = mPath.get(index); Vector2 toWp = Vector2.fromTo(pos, wp); float toWpLen = toWp.len(); if (dist > toWpLen) { dist -= toWpLen; pos = wp; index--; } else { pos = toWp.norm().mul(dist).add(pos); setPosition(pos); mWayPointIndex = index + 1; return; } } setPosition(mPath.get(0)); mWayPointIndex = 1; }
public Vector2 getPositionAfter(float sec) { if (mPath == null) { return getPosition(); } float distance = sec * getSpeed(); int index = mWayPointIndex; Vector2 position = getPosition().copy(); while (index < mPath.count()) { Vector2 toWaypoint = mPath.get(index).copy().sub(position); float toWaypointDist = toWaypoint.len(); if (distance < toWaypointDist) { return position.add(toWaypoint.mul(distance / toWaypointDist)); } else { distance -= toWaypointDist; position.set(mPath.get(index)); index++; } } return position; }
protected boolean hasWayPoint() { return mPath != null && mWayPointIndex < mPath.count(); }
protected Vector2 getWayPoint() { return mPath.get(mWayPointIndex); }
public void setPath(Path path) { mPath = path; setPosition(mPath.get(0)); mWayPointIndex = 1; }