• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# Following an A Path

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

### #1GameGeezer  Members

Posted 11 June 2012 - 01:45 PM

I wrote an A* pathfinder for my game but I'm unsure about the best way of having my characters maneuver along it. Any sugestions? I'm storing the path as an ArrayList of grid blocks. should I just shet my velocity in the direction of the center of the next square? I'm worried about my characters overshooting the block then running into otehr obsticles.

Edited by GameGeazer, 11 June 2012 - 01:50 PM.

### #2Dawoodoz  Members

Posted 12 June 2012 - 11:10 AM

I would use a tolerance radius that gets bigger with a higher speed (depending on the stopping distance). When the unit is inside the circle, start moving to the next goal for a smooth move around the corner. You need to set a maximum allowed speed to prevent the circle from getting bigger than a tile.

"App". is an acronym and must always be followed by a dot.

### #3LorenzoGatti  Members

Posted 15 June 2012 - 06:04 AM

The "right" solution is performing pathfinding on physically reasonable trajectories that entities can follow exactly rather than on polylines with sharp corners: for example, you can combine straight segment and circular arcs, precomputing a suitable arc to turn each corner.

Omae Wa Mou Shindeiru

### #4GameGeezer  Members

Posted 30 July 2012 - 08:18 PM

Here is my butchered solution if anyone runs into the same question. I'll clean it up and repost it eventually.

public boolean followPathSimple(Entity entity,PhysicsWorld physicsWorld)
{
GameMath math = new GameMath();
boolean isFinished = false;
Body body = physicsWorld.getBodyByID(entity.getUserData().getID());
if(cellList.size()>currentTile)
{
//find the radius of the target I will be hitting (unused saved for later)

//find the radius of the moveing object (unused saved for later)
((BodyUserData)body.getUserData()).getDimensions().y);
//the object moving
objectShape = new Circle(
(body.getWorldPoint(body.getLocalCenter()).x*GameConstants.M_TO_P)+16,
(body.getWorldPoint(body.getLocalCenter()).y*GameConstants.M_TO_P)+16,
5);
//if we are on the tile go to the next
if(targetShape.contains(objectShape.getCenterX(), objectShape.getCenterY()))
{
//if the path continues create a new target and increase our position on the path
if(currentTile<cellList.size()-1)
{

currentTile++;
targetShape = new Circle(
cellList.get(currentTile).getCenterX(),
cellList.get(currentTile).getCenterY(),10);
}
//if we are at the end of the list we have finished the path
else
{
isFinished = true;
body.setLinearVelocity(new Vec2(0,0));
}
}
else
{
int velX = 0;
int velY = 0;
//find the distance from the target in the x and y
float distanceX = targetShape.getCenterX()-objectShape.getCenterX();
float distanceY = targetShape.getCenterY()-objectShape.getCenterY();

//if the disance in the x is grater than the distance in the y move the entity along the x axis(4-way movement)
if(Math.abs(distanceX)>Math.abs(distanceY))
{
//if the distance is is less than zero then the object is to the right of the target
if(distanceX<0)
{
//move left
velX = (int) -entity.getVel_Max().x;
}
else if(distanceX>0)
{
//move right
velX = (int) entity.getVel_Max().x;
}
}
//else move it vertically
else
{
if(distanceY<0)
{
//move up
velY = (int) -entity.getVel_Max().y;
}
else if(distanceY>0)
{
//move down
velY = (int) entity.getVel_Max().y;
}
}
//set the new velocity of our object
body.setLinearVelocity(new Vec2(velX,velY));
}

}
//return whether or not we have finished walking anlong the path
return isFinished;
}


Here is how the movement ended up looking

if anyone wants the A* code aswell I'll put that up too.

Edited by GameGeazer, 30 July 2012 - 08:37 PM.

### #5Eliaszhou  Members

Posted 10 September 2012 - 12:32 AM