Hi,
In one of the previous post we moved a platform from a point A to point B and then back to point A and so on. In this post we would expand on it and move it in specific path which has more than 2 points which we find in many platformers like mario etc.
It is similar to way we moved a platform in last post just in this case we would have more than 2 points in the path.
Path:
We would define a basic class which will hold the information of the path which the platform will travel over a period of time. There are many ways to do it. This is just one of them.
public class Path{ ArrayList<Vector2> positions; ArrayList<Float> times; Vector2 velocity; int currentPointIndex; int nextPointIndex; int direction=1; static final float CHECK_RADIUS=1f; public Path(int count){ positions=new ArrayList<Vector2>(); times=new ArrayList<Float>(); velocity=new Vector2(); } public void AddPoint(Vector2 pos,float time){ positions.add(pos); times.add(time); } public void Reset(){ currentPointIndex=0; nextPointIndex=GetNextPoint(); SetNextPointVelocity(); } public Vector2 GetCurrentPoint(){ return positions.get(currentPointIndex); } public boolean UpdatePath(Vector2 bodyPosition){ return ReachedNextPoint(bodyPosition); } boolean ReachedNextPoint(Vector2 bodyPosition){ Vector2 nextPointPosition=positions.get(nextPointIndex); float d=nextPointPosition.dst2(bodyPosition); if(d<CHECK_RADIUS){ currentPointIndex=nextPointIndex; nextPointIndex=GetNextPoint(); SetNextPointVelocity(); return true; } return false; } int GetNextPoint(){ int nextPoint=currentPointIndex+direction; if(nextPoint==positions.size()){ nextPoint=0; }else if(nextPoint==-1){ nextPoint=positions.size()-1; } return nextPoint; } void SetNextPointVelocity(){ Vector2 nextPosition=positions.get(nextPointIndex); Vector2 currentPosition=positions.get(currentPointIndex); float dx=nextPosition.x-currentPosition.x; float dy=nextPosition.y-currentPosition.y; float time=times.get(nextPointIndex); velocity.set(dx/time,dy/time); } Vector2 GetVelocity(){ return velocity; } }
The above can be used as a direction for making a kinematic body move through a specified path. We have to check in the update function of the object class (which is moving in the specified) that if UpdatePath(bodyPosition) returns true then just set a new velocity to the body by calling GetVelocity().
MovingObject
... Path path; public void Update(float dt){ ..... if(path.UpdatePath(bodyPosition)){ SetBodyVelocity(path.GetVelocity()); } }
We are passing position in update function of path so that it can be used with all types of moving objects and not specific to box objects.
Source Code:
We have attached a sample source code for the above – here.
For setting the example in eclipse please look for instructions in this post.
Thank you for the patience. If you have queries/suggestions please post them in comments section.