cocos2d - JS A*算法
来源:互联网 发布:郑州轻工业网络教学 编辑:程序博客网 时间:2024/05/18 00:16
创建map对象 :
var map = { rows : 5, cols : 5, arr : [ [0,0,1,0,0], [0,0,1,0,0], [0,1,0,0,0], [0,1,0,1,0], [0,0,0,1,0], ] } var result = this.searchRoad(map,0,0,4,4) cc.log(result)
传入A*方法 返回的是路径数组
//其中的MAP.arr是二维数组 searchRoad :function (MAP, start_x, start_y, end_x, end_y){ var openList=[], //开启列表 closeList=[], //关闭列表 result=[], //结果数组 result_index; //结果数组在开启列表中的序号 openList.push({x:start_x,y:start_y,G:0});//把当前点加入到开启列表中,并且G是0 do{ var currentPoint = openList.pop(); closeList.push(currentPoint); var surroundPoint=SurroundPoint(currentPoint); for(var i in surroundPoint) { var item = surroundPoint[i]; //获得周围的八个点 if ( item.x >= 0 && //判断是否在地图上 item.y >= 0 && item.x < MAP.rows && item.y < MAP.cols && MAP.arr[item.x][item.y] != 1 && //判断是否是障碍物 !existList(item, closeList) && //判断是否在关闭列表中 MAP.arr[item.x][currentPoint.y] != 1 && //判断之间是否有障碍物,如果有障碍物是过不去的 MAP.arr[currentPoint.x][item.y] != 1){ //g 到父节点的位置 //如果是上下左右位置的则g等于10,斜对角的就是14 var g = currentPoint.G + ((currentPoint.x - item.x) * (currentPoint.y - item.y) == 0 ? 10 : 14); if (!existList(item, openList)) { //如果不在开启列表中 //计算H,通过水平和垂直距离进行确定 item['H'] = Math.abs(end_x - item.x) * 10 + Math.abs(end_y - item.y) * 10; item['G'] = g; item['F'] = item.H + item.G; item['parent'] = currentPoint; openList.push(item); } else { //存在在开启列表中,比较目前的g值和之前的g的大小 var index = existList(item, openList); //如果当前点的g更小 if (g < openList[index].G) { openList[index].parent = currentPoint; openList[index].G = g; openList[index].F=g+openList[index].H; } } } } //如果开启列表空了,没有通路,结果为空 if(openList.length == 0) { break; } openList.sort(sortF);//这一步是为了循环回去的时候,找出 F 值最小的, 将它从 "开启列表" 中移掉 }while(!(result_index=existList({x:end_x,y:end_y},openList))); //判断结果列表是否为空 if(!result_index) { result = []; } else { var currentObj=openList[result_index]; do{ //把路劲节点添加到result当中 result.unshift({ x:currentObj.x, y:currentObj.y }); currentObj=currentObj.parent; }while (currentObj.x != start_x || currentObj.y != start_y); } return result; },
全局方法 :
//用F值对数组排序function sortF(a,b){ return b.F - a.F;}//获取周围八个点的值function SurroundPoint(curPoint){ var x = curPoint.x, y = curPoint.y; return [ {x:x-1,y:y-1}, {x:x,y:y-1}, {x:x+1,y:y-1}, {x:x+1,y:y}, {x:x+1,y:y+1}, {x:x,y:y+1}, {x:x-1,y:y+1}, {x:x-1,y:y} ]}//判断点是否存在在列表中,是的话返回的是序列号function existList(point,list) { for(var i in list) { if(point.x == list[i].x && point.y == list[i].y) { return i; } } return false;}
完整cocos2d-JS 实例 :
(复制可以直接使用 只需要在resource里有三种图片即可)
0 : 为可走路径
1 : 为不可走路径
9 : 为主角
//用F值对数组排序function sortF(a,b){ return b.F - a.F;}//获取周围八个点的值function SurroundPoint(curPoint){ var x = curPoint.x, y = curPoint.y; return [ {x:x-1,y:y-1}, {x:x,y:y-1}, {x:x+1,y:y-1}, {x:x+1,y:y}, {x:x+1,y:y+1}, {x:x,y:y+1}, {x:x-1,y:y+1}, {x:x-1,y:y} ]}//判断点是否存在在列表中,是的话返回的是序列号function existList(point,list) { for(var i in list) { if(point.x == list[i].x && point.y == list[i].y) { return i; } } return false;}var map = { rows : 5, cols : 5, arr : [ [0,0,1,0,0], [0,0,1,0,0], [0,1,0,0,0], [0,1,0,1,0], [0,0,0,1,0], ]}var MyPos = null;var MySprite = null;var HelloWorldLayer = cc.Layer.extend({ ctor:function () { this._super(); this.Astar(); }, call_Back: function(event,touch){ cc.log("touch",event._parent.AstarX,event._parent.AstarY) var endX = event._parent.AstarX, endY = event._parent.AstarY; var result = this.searchRoad(map,MyPos.x,MyPos.y,endX,endY); this.schedule(function(){ var road = result.shift() if(road) { var action = cc.moveTo(0.24,240+34*road.y,350-36*road.x); MySprite.runAction(action); MyPos = cc.p(road.x,road.y); } },0.25) }, Astar: function(){ MyPos = cc.p(0,0); for(var i = 0; i < map.rows; i++) { for(var j = 0; j < map.cols; j++) { var temp = new cc.Menu(new cc.MenuItemImage("res/"+map.arr[i][j]+".png", "res/"+map.arr[i][j]+".png", this.call_Back, this)); temp.setPosition(240+34*j,350-36*i); temp.AstarX = i; temp.AstarY = j; this.addChild(temp); if(i == 0 && j == 0) { var temp = new cc.Sprite("res/9.png") MySprite = temp; temp.setPosition(240+34*j,350-36*i); this.addChild(temp,1000); } } } }, //其中的MAP.arr是二维数组 searchRoad :function (MAP, start_x, start_y, end_x, end_y){ var openList=[], //开启列表 closeList=[], //关闭列表 result=[], //结果数组 result_index; //结果数组在开启列表中的序号 openList.push({x:start_x,y:start_y,G:0});//把当前点加入到开启列表中,并且G是0 do{ var currentPoint = openList.pop(); closeList.push(currentPoint); var surroundPoint=SurroundPoint(currentPoint); for(var i in surroundPoint) { var item = surroundPoint[i]; //获得周围的八个点 if ( item.x >= 0 && //判断是否在地图上 item.y >= 0 && item.x < MAP.rows && item.y < MAP.cols && MAP.arr[item.x][item.y] != 1 && //判断是否是障碍物 !existList(item, closeList) && //判断是否在关闭列表中 MAP.arr[item.x][currentPoint.y] != 1 && //判断之间是否有障碍物,如果有障碍物是过不去的 MAP.arr[currentPoint.x][item.y] != 1){ //g 到父节点的位置 //如果是上下左右位置的则g等于10,斜对角的就是14 var g = currentPoint.G + ((currentPoint.x - item.x) * (currentPoint.y - item.y) == 0 ? 10 : 14); if (!existList(item, openList)) { //如果不在开启列表中 //计算H,通过水平和垂直距离进行确定 item['H'] = Math.abs(end_x - item.x) * 10 + Math.abs(end_y - item.y) * 10; item['G'] = g; item['F'] = item.H + item.G; item['parent'] = currentPoint; openList.push(item); } //存在在开启列表中,比较目前的g值和之前的g的大小 else { var index = existList(item, openList); //如果当前点的g更小 if (g < openList[index].G) { openList[index].parent = currentPoint; openList[index].G = g; openList[index].F=g+openList[index].H; } } } } //如果开启列表空了,没有通路,结果为空 if(openList.length == 0) { break; } //这一步是为了循环回去的时候,找出 F 值最小的, 将它从 "开启列表" 中移掉 openList.sort(sortF); }while(!(result_index=existList({x:end_x,y:end_y},openList))); //判断结果列表是否为空 if(!result_index) { result = []; } else { var currentObj=openList[result_index]; do{ //把路劲节点添加到result当中 result.unshift({ x:currentObj.x, y:currentObj.y }); currentObj=currentObj.parent; }while (currentObj.x != start_x || currentObj.y != start_y); } return result; },});var HelloWorldScene = cc.Scene.extend({ onEnter:function () { this._super(); var layer = new HelloWorldLayer(); this.addChild(layer); }});
1 0
- cocos2d - JS A*算法
- cocos2d-js版本A*算法
- A*算法JS版本
- JS-A*算法
- JS a*算法
- A*算法 带cocos2d-x例子 a*寻路算法
- 如何使用Cocos2D实现A星寻路算法
- cocos2d-x之简易A*算法
- 【cocos2D-x学习】16.A*算法
- 【cocos2D-x学习】16.A*算法
- 【cocos2D-x学习】16.A*算法
- JS算法之A*(A星)寻路算法
- CocosBuilder用户手册中文版:4a. Connecting with Cocos2d JS
- cocos2d-x学习日志(13) --A星寻路算法demo
- Cocos2d-x 寻路算法之三 A Star
- 如何实现A星寻路算法 Cocos2d-x 3.0 beta2
- 如何实现A星寻路算法 Cocos2d-x 3.0 beta2
- Cocos2d-x 地图行走的实现3:A*算法
- 几款好用的UML建模工具
- 前端重点知识整理(JavaScript)一:数组与字符串
- C++:日期类的实现
- javascript常用经典算法实例详解
- 挂载新盘符
- cocos2d - JS A*算法
- Summer Day - Ended
- 【38】二叉树的深度
- nginx继承socket 和 热代码替换
- 全国天气查询、空气质量查询数据接口
- ajax提交数据到后台处理返回json问题
- git工具学习
- 百度地图遇到的一些问题
- 自定义Behavior的艺术探索-仿UC浏览器主页