cocos 寻路 lua实现

原创 2017年05月22日 21:50:31
local RoadPoint = {}


function RoadPoint:CreateNode(p)
   -- body
    local t = {}  
    t.g = -1;
    t.h = -1;
    t.f = 0;
    t.point = p;
    t.parent = nil;
    return t;
end




 


-- 判断p是否在open表中 


 function RoadPoint:exists(p)
 -- body
 for i =1,#self.open do
     if self.open[i].point.x == p.x and self.open[i].point.y == p.y  then 
         return true;
     end   
 end
 return false;


 end






function RoadPoint:FindPath(startp,endp,maskparent)
-- body
    
    release_print(string.format("开始点:x--%d,y--%d",startp.x,startp.y));
    release_print(string.format("结束点:x--%d,y--%d",endp.x,endp.y));




    self.step = 40;


    self.open = {};
    self.close = {};
    self.childs = maskparent:getChildren();
    self.childCount = maskparent:getChildrenCount();
    local point = self:CreateNode(startp);
    table.insert(self.open,point);
   
    while(#self.open ~= 0)
    do
     
      table.sort(self.open,function (a,b)
      -- body
      return a.f < b.f;
      end)
       
     local tempStart = self.open[1];
      table.remove(self.open,1);
 
      table.insert(self.close,tempStart);
    
      local sur = self:GetSurPoints(tempStart.point); 
       
      for i=1,#sur do
     
        if self:exists(sur[i].point) then 
            
         
             local pg = 0;
             if sur[i].parent ~= nil then
                pg = sur[i].parent.g;
             end
             local g = sur[i].g + pg;
             if g < sur[i].g then
                 sur[i].g = g;
                 sur[i].f = sur[i].g + sur[i].h;   
                 sur[i].parent = tempStart;
             end
        else
        
             local pg = 0;
             if sur[i].parent ~= nil then
                pg = sur[i].parent.g;
             end
             local g = sur[i].g + pg;
             sur[i].g = g;
             sur[i].h = math.abs(endp.x - sur[i].point.x) + math.abs(endp.y,- sur[i].point.y);
             sur[i].f = sur[i].g + sur[i].h;
             sur[i].parent = tempStart;
             table.insert(self.open,sur[i]);           
        end
    


      end


   
      for i = 1, #self.close do


       local tempP = self.close[i].point;
       local x = math.abs(tempP.x - endp.x);
       local y = math.abs(tempP.y - endp.y);
       
          if math.abs(tempP.x - endp.x) < self.step and math.abs(tempP.y - endp.y) < self.step then
             return self.close[i];
          end


          
          
      end




    end
    
    return nil;


end


function RoadPoint:GetSurPoints( p )


   local t = {};
   
   local up = cc.p(p.x,p.y -  self.step);
  
   if  self:judge(up) == true then


      local point = self:CreateNode(up);  
   
      point.g = 10;  
    
      table.insert(t,point)
    
   end


   local down = cc.p(p.x,p.y+ self.step);
   if self:judge(down) == true then
      local point = self:CreateNode(down); 
      point.g = 10;     
      table.insert(t,point)
   end
 
   local left = cc.p(p.x -  self.step,p.y);
   if self:judge(left) == true then
      local point = self:CreateNode(left);
      point.g = 10;         
      table.insert(t,point)
   end
  
   local right = cc.p(p.x +  self.step, p.y);
   if self:judge(right) == true then
      local point = self:CreateNode(right);
      point.g = 10;  
      table.insert(t, point)
   end


   local leftup = cc.p(p.x -  self.step,p.y -  self.step);
   if self:judge(leftup) == true then
      local point = self:CreateNode(leftup);
      point.g = 14;  
      table.insert(t,point);
   end
 
   local leftdown = cc.p(p.x -  self.step,p.y +  self.step);   
   if self:judge(leftdown) ==true then
     local point = self:CreateNode(leftdown);
      point.g = 14;  
     table.insert(t,point);
   end
 
   local rightup = cc.p(p.x +  self.step,p.y -  self.step);
   if self:judge(rightup) == true then
     local point = self:CreateNode(rightup);
      point.g = 14;  
     table.insert(t,point);
   end


   local rightdown = cc.p(p.x +  self.step,p.y +  self.step);  
   if self:judge(rightdown) == true then
      local point = self:CreateNode(rightdown);
      point.g = 14;  
      table.insert(t,point);
   end




  return t;
-- body
end


function RoadPoint:judge(p)
-- body
    for i = 1,#self.close do
        if self.close[i].point.x == p.x and self.close[i].point.y == p.y then
            return false;
        end  
    end
    for i=1,self.childCount do
      if cc.rectContainsPoint(self.childs[i]:boundingBox(),p) then
          return true;
      end
    end
    return false;      
end








return RoadPoint;
版权声明:本文为博主原创文章,未经博主允许不得转载。

A*寻路算法的lua实现

前言:又好久没写blog了,感觉有点“颓废”了,最近认识好多好多同龄人,也是大学刚毕业,觉得他们很优秀,认识到自己跟他们的差距,有点自愧不如。没写blog当然也有一部分原因是因为工作,本来经验就有点欠...
  • s10141303
  • s10141303
  • 2014年10月12日 15:35
  • 5296

cocos creator A* 寻路导航 组件

cocos creator面试也有一段时间了,但是一直没有推出寻路导航相关的组件。自己做cocos creator腾讯课堂教学已经快2年多了。今天突然觉得心血来潮,不如自己写一个类似于 unity的网...
  • voidinit
  • voidinit
  • 2017年07月18日 01:29
  • 254

如何实现A星寻路算法 Cocos2d-x 3.0 beta2

本文实践自 Johann Fradj 的文章《How To Implement A* Pathfinding with Cocos2D Tutorial》,文中使用Cocos2D,我在这里使用Coco...
  • akof1314
  • akof1314
  • 2014年02月17日 13:50
  • 10958

cocos2dx 3.x 实现 A星(A*)(A-star)算法自动寻路(一)

自动寻路里面的说的最多的就是A星寻路了,但是网上找了些博客大家写的有点简略,导致对于刚接触的人来说理解的不够清楚。在这里我将用大量的图片一步一步地列出A星算法的寻路过程。A星算法对于大地图的效率不高,...
  • u010946556
  • u010946556
  • 2015年10月11日 09:38
  • 3486

如何在Cocos2D游戏中实现A*寻路算法(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供...
  • mydo
  • mydo
  • 2015年11月22日 10:28
  • 1417

游戏寻路算法的简单实现

提到寻路算法,大家都会想到A*算法。 在度娘找了不少代码,看了不少教程之后,尤其是这个文章中提到的总结:http://www.cppblog.com/christanxw/archive/2006/...
  • Gnorth
  • Gnorth
  • 2013年06月19日 14:53
  • 2480

Cocos2d-x 寻路算法之一 距离优先

1.效果图 寻路这块在游戏中一直很重要,花了点时间研究了下这个问题,主要参考的是《Data Structures For Game Programmers》,其他的算法用普通Console演示就行...
  • fox64194167
  • fox64194167
  • 2013年12月05日 09:06
  • 2157

Cocos2d-x 地图行走的实现3:A*算法

上一节《Cocos2d-x 地图行走的实现2:SPFA算法》: http://blog.csdn.net/stevenkylelee/article/details/38440663 1.修改一...
  • StevenKyleLee
  • StevenKyleLee
  • 2014年08月09日 21:14
  • 9428

lua实现A星最短路径算法

参考博客 http://blog.csdn.net/lufy_legend/article/details/5733733 这个博客di zhi s
  • zuihoudeliulang
  • zuihoudeliulang
  • 2014年09月20日 15:48
  • 2832

A星寻路的lua实现

module("PathUtil", package.seeall) local _map_data         -- 地图数据 local _open_list        -- 开放节点...
  • a394215561
  • a394215561
  • 2014年07月08日 02:15
  • 1338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos 寻路 lua实现
举报原因:
原因补充:

(最多只允许输入30个字)