Jump to content

  • Log In with Google      Sign In   
  • Create Account


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.

  • You cannot reply to this topic
4 replies to this topic

#1 GameGeazer   Members   -  Reputation: 733

Like
0Likes
Like

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.


Sponsor:

#2 Dawoodoz   Members   -  Reputation: 290

Like
1Likes
Like

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.

My open source DirectX 10/11 graphics engine. https://sites.google.com/site/dawoodoz

"My design pattern is the simplest to understand. Everyone else is just too stupid to understand it."


#3 LorenzoGatti   Crossbones+   -  Reputation: 2511

Like
0Likes
Like

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.
Produci, consuma, crepa

#4 GameGeazer   Members   -  Reputation: 733

Like
0Likes
Like

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)
   float targetRadius = math.pythag(cellDimensions.x/2,cellDimensions.y/2);
   targetRadius += math.pythag(body.getLinearVelocity().x, body.getLinearVelocity().y);
  
   //find the radius of the moveing object (unused saved for later)
   float objectRadius = math.pythag(((BodyUserData)body.getUserData()).getDimensions().x,
	 ((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.


#5 Eliaszhou   Members   -  Reputation: 103

Like
0Likes
Like

Posted 10 September 2012 - 12:32 AM

see detour in recast navigation




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.



PARTNERS