cocos2dx for lua A*寻路算法实现2
关于A*算法的实现过程,简单来说就是一个计算权限的过程。
首先,创建一个地图节点类,"MapNode.lua"
local MapNode = class("MapNode")
function MapNode:ctor()
self._row = --行
self._col = --列
self._parent = nil--父节点
self._f = --当前节点的总开销
self._g = --当前节点的累计开销
self._h = --启发因子
end
return MapNode
"AStar.lua"逻辑实现
local Direction = {}--方向
Direction.Right =
Direction.Right_Down =
Direction.Down =
Direction.Left_Down =
Direction.Left =
Direction.Left_Up =
Direction.Up =
Direction.Right_Up =
local MapNode = require "app.views.MapNode"
AStar = {}
AStar.__index = AStar
function AStar.create()
local temp = {}
setmetatable(temp, AStar)
return temp
end
--mapData:二维数组,存放底图数据,0是可行走格子,1是有障碍格子
function AStar:init(mapData)
self._mapData = mapData--地图数据
self._map = {}
self._lPath = {}--收集的路径
self._bFind = false
local mapRow = #mapData
local mapCol = #mapData[]
for i = , mapRow - do
self._map[i] = {}
for j = , mapCol - do
local mapNode = MapNode.new()
mapNode._row = i
mapNode._col = j
self._map[i][j] = mapNode
end
end
end
--开始寻路
--from:开始格子位置(非坐标)
--to:目标格子位置
function AStar:getSearchPath(from, to)
self:processAStar(from, to)--收集路径到_lPath
return self._lPath
end
function AStar:canPass(row,col)--判断是否能够通过
if self._mapData[col][row] == then
return true
end
return false
end
function AStar:getAdjacent(currentPos,dir)--根据方向获取相邻格子的位置
if dir == Direction.Right then
return cc.p(currentPos.x + ,currentPos.y)
elseif dir == Direction.Right_Down then
return cc.p(currentPos.x + ,currentPos.y - )
elseif dir == Direction.Down then
return cc.p(currentPos.x,currentPos.y - )
elseif dir == Direction.Left_Down then
return cc.p(currentPos.x - ,currentPos.y - )
elseif dir == Direction.Left then
return cc.p(currentPos.x - ,currentPos.y)
elseif dir == Direction.Left_Up then
return cc.p(currentPos.x - ,currentPos.y + )
elseif dir == Direction.Up then
return cc.p(currentPos.x,currentPos.y + )
elseif dir == Direction.Right_Up then
return cc.p(currentPos.x + ,currentPos.y + )
end
end
function AStar:AStarCore(fromPos,toPos)--算法核心代码
local open = {}
local close = {}
local targetNode = self._map[toPos.y][toPos.x]
local fromNode = self._map[fromPos.y][fromPos.x]
local f,g,h;
fromNode._g =
fromNode._h = math.abs(fromPos.x - toPos.x) + math.abs(fromPos.y - toPos.y)
fromNode._f = fromNode._h
open[#open + ] = fromNode
while #open > do
local mapNode = open[]
table.remove(open,)
if mapNode._row == toPos.x and mapNode._col == toPos.y then
return true
end
close[#close + ] = mapNode
local parentPos = cc.p(mapNode._col,mapNode._row)
local adjacentPos = nil
local adjacentNode = nil
for i = , do
adjacentPos = self:getAdjacent(parentPos,i)
if adjacentPos.x >= and adjacentPos.x < mapCol and adjacentPos.y >= and adjacentPos.y < mapRow then
adjacentNode = self._map[adjacentPos.y][adjacentPos.x]
if self:canPass(adjacentPos.y,adjacentPos.x) == true and self:isContain(close,adjacentNode) == false and
self:isContain(open,adjacentNode) == false then
if i % == then
g = adjacentNode._g +
else
g = adjacentNode._g + 1.4
end
h = math.abs(adjacentPos.x -toPos.x) + math.abs(adjacentPos.y - toPos.y)
f = g + h
adjacentNode._parent = mapNode
adjacentNode._f = f
adjacentNode._g = g
adjacentNode._h = h
open[#open + ] = adjacentNode
end
end
end
table.sort(open,function(a,b)
return a._f < b._f
end)
end
return false
end
function AStar:processAStar(from,to)--执行A*算法
local f = self:AStarCore(from,to)
if f == true then
self:collectRoute(from,to)
return true
end
return false
end
function AStar:collectRoute(from, to)--收集路线
self._lPath = {}
local mapNode = self._map[to.y][to.x]
self._lPath[#self._lPath + ] = mapNode
while mapNode._col ~= from.x or mapNode._row ~= from.y do
mapNode = mapNode._parent
self._lPath[#self._lPath + ] = mapNode
end
end
function AStar:isContain(tbl,cell) --在table中是否包含某个单元
for k,v in pairs(tbl) do
if tbl[k] == cell then
return true
end
end
return false
end
测试一下:
TestScene.lua
require "AStar.lua"
local TestScene = class("TestScene",cc.load("mvc").ViewBase) function TestScene:ctor()
local mapData = {
{, , , , , , , }
{, , , , , , , }
{, , , , , , , }
{, , , , , , , }
{, , , , , , , }
{, , , , , , , }
{, , , , , , , }
{, , , , , , , }
}--地图数据
self.mapData = mapData
for i = , #mapData do--创建地图快图片
for j = , #mapData[] do
local tileSp = cc.Sprite:create("tilemap.png")
self:addChild(tileSp)
tileSp:setPosition(i * tileWidth-(tileWidth * 0.5), j * tileHeight - (tileWidth * 0.5))
end
end
local from = cc.p(,)--起点
local to = cc.p(,)--目标点
local sp1 = display.newSprite("qizi.png",to.x *tileWidth+(tileWidth*0.5),to.y *tileHeight+(tileWidth*0.5))--目标点图片
self:addChild(sp1)
local sp2 = display.newSprite("qizi.png",from.x *tileWidth+(tileWidth*0.5),from.y *tileHeight+(tileWidth*0.5))--起点图片
self:addChild(sp2)
self:setCollisionSp()
self._sprite = sp.SkeletonAnimation:create("spine/116_m_fks/116_m_fks.json","spine/116_m_fks/116_m_fks.atlas",0.08)
self._sprite:setAnimation(,"stanby_1",true)--创建角色
self._sprite:setScale(-,)
self._sprite:setPosition(from.x *tileWidth+(tileWidth*0.5),from.y *tileHeight)
self:addChild(self._sprite)
local astar_logic = AStar.create()
astar_logic:init(mapData)
self._lPath = astar_logic:getSearchPath(from, to)
self:drawPathNode()
self._posIndex = #self._lPath
self:moveSprite()
end function TestScene:setCollisionSp()--设置障碍物
for k, v in pairs(self.mapData) do
for m, n in pairs(v) do
if n == then--障碍物
local sp = display.newSprite("collision.png",i*tileWidth+(tileWidth*0.5),j*tileHeight+(tileWidth*0.5))
self:addChild(sp)
end
end
end
end function TestScene:moveSprite()--移动精灵
local x = self._lPath[self._posIndex]._col *tileWidth+(tileWidth*0.5)
local y = self._lPath[self._posIndex]._row *tileWidth+(tileWidth*0.5)
transition.moveTo(self._sprite,{x = x,y = y,time = ,onComplete = function()
self._posIndex = self._posIndex -
if self._posIndex == then
return
end
self:moveSprite()
end})
end function TestScene:drawPathNode()--画路径图片
for k,v in pairs(self._lPath) do
local sp3 = display.newSprite("redPoint.png",v._col *tileWidth+(tileWidth*0.5),v._row *tileWidth+(tileWidth*0.5))
self:addChild(sp3)
end
end
转载请注明出处,from 博客园HemJohn
cocos2dx for lua A*寻路算法实现2的更多相关文章
- cocos2d-x学习日志(13) --A星寻路算法demo
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! A星算法简介: A*搜寻算法俗称A星 ...
- A*寻路算法lua实现
前言:并在相当长的时间没有写blog该,我觉得有点"颓废"该,最近认识到各种同行,也刚刚大学毕业,我认为他们是优秀的.认识到与自己的间隙,有点自愧不如.我没有写blog当然,部分原 ...
- 《C++游戏开发》十六 游戏中的寻路算法(二):迷宫&A*算法基础
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/10289253 作者:七十一雾央 新浪微博:http: ...
- A*寻路算法详细解读
文章目录 A*算法描述 简化搜索区域 概述算法步骤 进一步解释 具体寻路过程 模拟需要更新F值的情况 Lua代码实现 在学习A*算法之前,很好奇的是A*为什么叫做A*.在知乎上找到一个回答,大致意思是 ...
- A*寻路算法的个人理解
A*寻路算法是一个求两点之间的最短路径的方法 算法详情如下: 准备工作: 两个容器: open容器和close容器 价值估算公式: F = G + H G:从起点移动到指定方格的移动代价: ...
- A星寻路算法介绍
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...
- A*寻路算法探究
A*寻路算法探究 A*算法常用在游戏的寻路,是一种静态网路中求解最短路径的搜索方法,也是解决很多搜索问题的算法.相对于Dijkstra,BFS这些算法在复杂的搜索更有效率.本文在U3D中进行代码的测试 ...
- A*寻路算法
对于初学者而言,A*寻路已经是个比较复杂的算法了,为了便于理解,本文降低了A*算法的难度,规定只能横竖(四方向)寻路,而无法直接走对角线,使得整个算法更好理解. 简而言之,A*寻路就是计算从起点经过该 ...
- 算法:Astar寻路算法改进,双向A*寻路算法
早前写了一篇关于A*算法的文章:<算法:Astar寻路算法改进> 最近在写个js的UI框架,顺便实现了一个js版本的A*算法,与之前不同的是,该A*算法是个双向A*. 双向A*有什么好处呢 ...
随机推荐
- 洛谷P2414 [NOI2011]阿狸的打字机(AC自动机)
传送门 考虑一下,如果串B在串A中出现过,那么A的fail指针必定直接或间接指向B 那么我们可以把fail树建起来,那么就变成B代表的节点的子树里有多少节点属于A 然后这就是一个序列统计问题,直接用d ...
- 我的省选 Day -15
Day -15 23:22:45 还有十几天就要去参加省选啦~,今天开始写日记记录一下,所以今天是第负十五天. 今天是阶段考的第二天(由于奥赛不用考试的我7:30才慢悠悠地到机房 早上学习动态DP, ...
- iOS 技术支持
iOS 技术支持网址:有问题或建议请留言. 邮箱地址:odeyrossskudder4266848@mail.com iOS program design & system consultat ...
- MySQL 的视图、触发器、事务、存储过程、函数
MySQL 的视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句 ...
- GYM 101572A(单调队列优化dp)
要点 较好的思路解析 \(dp[i]\)为到达\(i\)花费的最短时间,\(dis[i]-dis[j]<=lim1\)的情况其实可以省略,因为就相当于没买咖啡,绝对不优于在那之前的某店买了咖啡并 ...
- Jmeter4.0----设置集合点_并发(11)
1.说明 LR中集合点可以设置多个虚拟用户等待到一个点,同时触发一个事务,以达到模拟真实环境下多个用户同时操作,实现性能测试的最终目的. jmeter中使用Synchronizing Timer实现L ...
- 基于.NetCore2.1。服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务
基于.NetCore2.1.服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务 https://www.cnblogs.com/ibeisha/p/weixinServ ...
- JavaScript实现一个简单的密码输入功能
常见的密码输入框当输入字符后会被替换成‘*’,而且旁边会有个小眼睛可以查看原本的字符,虽然input标签有这个功能,但这只是自己正在看正则表达式的时候突然想到的,就当做个练习,自己手动实现下: < ...
- Win10 插入耳机后没有声音,拔出后电脑有声音
- 简述null undefined NaN的异同
1. 类型类型分析: JS中数据类型有5种:string,number,boolean,undefined,object,前四种值类型(基础数据类型),object是引用类型 var a1; //un ...