Tile path following algorithm

Started by
1 comment, last by sega16 11 years, 6 months ago
Hello everyone. I am having some issues with my path following algorithm the enemys are supposed to follow a path that I set in the level editor. I know the path is being correctly set I can verify that. The issue is that lets say the enemy is on pixel 64 and each tile is 64 pixels the enemy is moving to the left the next tile over is to move down. The enemy moves left by lets say 2 pixels. As soon as it moves to pixel 62 the enemy will move down. I am fully aware of how integer math works 62/64=0. At first I was able to use modules and just do if (x%64 == 0 && y%64 == ) then change the direction but I was limited to speeds that are a factor of 64 and I could not work with that maily becuase my code varies the enemy speed based on frames per second and I would like more control over speed. Here is the code I used to get the direction I removed the module checks after I added the code to move based on pixels per millosecond instead of pixels per frame As the enemys would go off the path even worse due to the fact that the direction would never change.

direction=path[((x>>bloon_fract_bits)/tile_size_px)+(((y>>bloon_fract_bits)/tile_size_px)*11)];

Also just to give a heads up the bitshifts are because I am using fixed point math for the enemy speed and the array path is uchar array that is 88 bytes my level is 11x8 tiles and the tiles are 64 pixels each
Here are some pictures
The correct path in the level editor:
Click on image for full size on my computer it resizes the pictures ~99% and makes them look blurry it is not your vision.

leveleditor.png
The incorrect path being taken
pathissue.png
If anybody has a good algorithm to correctly follow the path it would help me alot thank you for reading this
Advertisement
It looks like your current method brings some inprecision. Keep the precision intact.

Pseudocode:

while ( number_of_pixels_to_move > 0 )
{
if ( number_of_pixels_to_move >= pixels_left_to_move_on_one_tile )
{
// arrive at a tile
number_of_pixels_to_move -= pixels_left_to_move_on_one_tile;
move pixels_left_to_move_on_one_tile pixels in move direction
adjust direction according to tile below
}
else
{
// move object number_of_pixels_to_move pixels in move direction
number_of_pixels_to_move = 0;
}
}


Edit: The dumb editor keeps screwing up indentation

Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>

Thank you I see what to do now I knew it was simple I guess I was suffering from programmer's block.

This topic is closed to new replies.

Advertisement