A*算法适合在静态环境中寻路,也就是说周围的物体不会动态的移动。
需要2个表,分别保存待检测和已检测的格子:
@interface AStarFinder : NSObject { NSMutableArray *openTable;//尚未走过的格子 NSMutableArray *closeTable;//已经走过的格子 } openTable保存的就是当前格子四周的格子(最多为8个),只保存满足条件的格子,不能是障碍物 或者出屏幕了。
你可以这样来初始化它们:
CCTMXTiledMap *map = [CCTMXTiledMap tiledMapWithTMXFile:@"tile_map.tmx"];//加载地图 <pre name="code" class="java">//mapSize是一个CGSize保存的是地图中Tile(格子)的数量 openTable = [[NSMutableArray alloc] initWithCapacity:map.mapSize.width*map.mapSize.height];closeTable = [[NSMutableArray alloc] initWithCapacity:map.mapSize.width*map.mapSize.height];
看看A*算法的核心代码:
看看 bestTilePoint 函数:
总之 bestTilePoint函数就是用来找到最合适的移动方向。
看看 是如何处理每一个格子的:
- (BOOL)nextTile:(TilePoint *)curr X:(NSInteger)x Y:(NSInteger)y{ TilePoint *next = [[TilePoint alloc] createTilePoint:x Y:y]; next.parent = curr;//父亲当然是当前的格子 if ([self isComparePoint:next And:endPoint]) {//先判断是否已到目的地 [closeTable addObject:next]; NSLog(@"find end point !!!!!!!\n"); return YES; //到了目的地 就不需要在检测其它格子了。。 } //这里检测的是格子是否为有效,包括:障碍物 出屏幕 已经检测过。。 if ([self isInCloseTable:next] == NO && [self isEnableTile:next.x Y:next.y] == YES) { if ([self isInOpenTable:next] == NO) { //计算f、g值 next.g = 14 + next.parent.g; next.f = next.g + [self calculateHPower:next]; [openTable addObject:next];//然后就可以加入到openTable了 }else { TilePoint *next2 = [self getFromOpenPath:next]; if (next2.f > next.f) { next2.parent = curr; next2.g = 14 + next2.parent.g; next2.f = next2.g + [self calculateHPower:next2]; } } } return NO; }DEMO下载
本文详细介绍了A*算法在静态环境寻路过程中的实现细节,包括地图加载、初始化开放表与关闭表、核心循环逻辑以及如何通过bestTilePoint函数找到最优路径。重点突出了如何处理每个格子的有效性检查,以及如何更新开放表与关闭表以优化寻路效率。
1826

被折叠的 条评论
为什么被折叠?



