TC官方合作论坛

 找回密码
 立即注册
楼主: 忆辰辅助

【4.14更新】TC5.0 6.0 7.0 A星寻路算法源码及扩展功能(附工具)

  [复制链接]
发表于 2022-4-25 14:52:01 | 显示全部楼层
支持
回复

使用道具 举报

发表于 2022-5-3 17:58:52 | 显示全部楼层
看看
回复

使用道具 举报

发表于 2022-6-18 07:07:16 | 显示全部楼层
学习大佬
回复

使用道具 举报

发表于 2022-6-27 04:09:12 | 显示全部楼层
[地图类]
createNewMap --新建地图
addCollision --添加障碍物
removeCollision--移除障碍物
freeMap--释放指定地图
printMap--输出指定地图可视图档(BMP)
setRoadColor --设置输入/输出路面颜色
setWallColor--设置输入/输出牆体颜色
setPathColor--设置输出路径颜色

mapSaveAs--保存二进制地图
mapLoadFrom--载入二进制地图

readBitmap --载入BMP地图//根据设置的牆体颜色和路面颜色判断
enableAutoPrint--是否允许寻路自动输出路线图(BMP) 默认地图名称: id_mapid.bmp
setOutputDirectory--设置寻路路径图输出目录[不同ID分别输出默认进程路径]

isRoad--检查指定坐标是否为路
isCollision--检查指定坐标是否为障碍




[寻路类]
initialize--寻路初始化(每次用完寻路最好都调用一次,清理缓存+重新实例化)
setHeuristic--设置寻路启发式
setObliqueValue--设置斜角花费值
setStepValue--设置直角花费值
enableCorner--寻ˊ路是否允许拐角
start--开始寻路(返回TC数组字符串或一般的字符串路径座标)

//返回TC数组的格式如: array("1" = array("x" = 15, "y" = 20), "2" = array("x" = 16, "y" = 21),..................)
//一般格式如: 15,16|16,21|........

详细调用方法

本帖隐藏的内容


var enum_Manhattan = 0//枚举值::曼哈顿
var enum_Euclidean = 1//枚举值::欧几里得

var NULL = 0
//模块地址缓存
var g_hModule = 0
//线程句柄缓存
var g_hThread = 0
//临界区句柄缓存
var g_mutex = 0

//函数地址缓存
var pfn_addCollision = 0
var pfn_createNewMap = 0
var pfn_freeMap = 0
var pfn_initialize = 0
var pfn_removeCollision = 0
var pfn_setHeuristic = 0
var pfn_setObliqueValue = 0
var pfn_setStepValue = 0
var pfn_start = 0
var pfn_printMap = 0
var pfn_setWallColor = 0
var pfn_setRoadColor = 0
var pfn_setPathColor = 0
var pfn_enableAutoPrint = 0
var pfn_enableCorner = 0
var pfn_setOutputDirectory = 0
var pfn_mapSaveAs = 0
var pfn_mapLoadFrom = 0
var pfn_isRoad = 0
var pfn_isCollision = 0
var pfn_readBitmap = 0

function LoadLibraryW(str)
    return dllcall("kernel32.dll", "HMODULE", "LoadLibraryW", "wchar *", str)
end
function FreeLibrary(hModule)
    return dllcall("kernel32.dll", "BOOL", "FreeLibrary", "HMODULE", hModule)
end
function GetProcAddress(hModule, funName)
    return dllcall("kernel32.dll", "FARPRO", "GetProcAddress", "HMODULE", hModule, "char *", funName)
end
function new(nSize, type, &len = 0)
    var void = array()
    select(type)
        case "char"
        void["void"] = array("char" = nSize, "value" = "")
        case "wchar"
        void["void"] = array("wchar" = nSize, "value" = "")
        case "long"
        void["void"] = array("long" = nSize, "value" = "")
        case "short"
        void["void"] = array("short" = nSize, "value" = "")
        case "byte"
        void["void"] = array("byte" = nSize, "value" = "")
        case "longlong"
        void["void"] = array("longlong" = nSize, "value" = "")
        default
        return 0
    end
    len = structlen(void)
    return structmalloc(void)
end

//检查TC是否为调试模式
function TC_NO_DEBUG()
    return strfind(getparam(), "debug") == -1
end

function preLoad()
    syssetcurrentpath(sysgetprocesspath())
    var bret = false
    while(1)
        var hModule = NULL
        if(!TC_NO_DEBUG())
            hModule = LoadLibraryW("D:\\MyFiles\\4.VSProject\\C++\\astar\\Release\\astar.dll")
        else
            hModule = LoadLibraryW(".\\astar.dll")//载入插件
        end
        if(NULL == hModule)//检查返回值
            break
        end

        g_hModule = hModule
        bret = true
        traceprint(strformat("hModule = 0x%X", hModule))
        break
    end

    if(!bret)
        traceprint("<错误>DLL加载失败。")
        exit()
    else
        if(!getUndocumentApi())
            traceprint("<错误>DLL函数获取失败。")
            exit()
        end
    end
    traceprint("<系统>初始化完成")
end

//获取函数地址
function getUndocumentApi()
    var hModule = g_hModule

    pfn_createNewMap = GetProcAddress(hModule, "createNewMap")
    traceprint(strformat("pfn_createNewMap = 0x%X", pfn_createNewMap))

    pfn_addCollision = GetProcAddress(hModule, "addCollision")
    traceprint(strformat("pfn_addCollision = 0x%X", pfn_addCollision))

    pfn_removeCollision = GetProcAddress(hModule, "removeCollision")
    traceprint(strformat("pfn_removeCollision = 0x%X", pfn_removeCollision))

    pfn_freeMap = GetProcAddress(hModule, "freeMap")
    traceprint(strformat("pfn_freeMap = 0x%X", pfn_freeMap))

    //
    pfn_initialize = GetProcAddress(hModule, "initialize")
    traceprint(strformat("pfn_initialize = 0x%X", pfn_initialize))

    pfn_setHeuristic = GetProcAddress(hModule, "setHeuristic")
    traceprint(strformat("pfn_setHeuristic = 0x%X", pfn_setHeuristic))

    pfn_setStepValue = GetProcAddress(hModule, "setStepValue")
    traceprint(strformat("pfn_setStepValue = 0x%X", pfn_setStepValue))

    pfn_setObliqueValue = GetProcAddress(hModule, "setObliqueValue")
    traceprint(strformat("pfn_setObliqueValue = 0x%X", pfn_setObliqueValue))

    pfn_enableCorner = GetProcAddress(hModule, "enableCorner")
    traceprint(strformat("pfn_enableCorner = 0x%X", pfn_enableCorner))

    pfn_enableAutoPrint = GetProcAddress(hModule, "enableAutoPrint")
    traceprint(strformat("pfn_enableAutoPrint = 0x%X", pfn_enableAutoPrint))

    pfn_start = GetProcAddress(hModule, "start")
    traceprint(strformat("pfn_start = 0x%X", pfn_start))

    //
    pfn_printMap = GetProcAddress(hModule, "printMap")
    traceprint(strformat("pfn_printMap = 0x%X", pfn_printMap))

    pfn_setWallColor = GetProcAddress(hModule, "setWallColor")
    traceprint(strformat("pfn_setWallColor = 0x%X", pfn_setWallColor))

    pfn_setRoadColor = GetProcAddress(hModule, "setRoadColor")
    traceprint(strformat("pfn_setRoadColor = 0x%X", pfn_setRoadColor))

    pfn_setPathColor = GetProcAddress(hModule, "setPathColor")
    traceprint(strformat("pfn_setPathColor = 0x%X", pfn_setPathColor))

    pfn_setOutputDirectory = GetProcAddress(hModule, "setOutputDirectory")
    traceprint(strformat("pfn_setOutputDirectory = 0x%X", pfn_setOutputDirectory))

    pfn_mapSaveAs = GetProcAddress(hModule, "mapSaveAs")
    traceprint(strformat("pfn_mapSaveAs = 0x%X", pfn_mapSaveAs))

    pfn_mapLoadFrom = GetProcAddress(hModule, "mapLoadFrom")
    traceprint(strformat("pfn_mapLoadFrom = 0x%X", pfn_mapLoadFrom))

    pfn_isRoad = GetProcAddress(hModule, "isRoad")
    traceprint(strformat("pfn_isRoad = 0x%X", pfn_isRoad))

    pfn_isCollision = GetProcAddress(hModule, "isCollision")
    traceprint(strformat("pfn_isCollision = 0x%X", pfn_isCollision))

    pfn_readBitmap = GetProcAddress(hModule, "readBitmap")
    traceprint(strformat("pfn_readBitmap = 0x%X", pfn_readBitmap))

    //检查是否所有函数地址不为0
    var bret0 = pfn_createNewMap && pfn_addCollision && pfn_removeCollision && pfn_freeMap

    var bret1 = pfn_initialize && pfn_setHeuristic && pfn_setObliqueValue && pfn_setStepValue && pfn_start && pfn_enableCorner

    var bret2 = pfn_printMap && pfn_setWallColor && pfn_setRoadColor && pfn_enableAutoPrint && pfn_setPathColor

    var bret3 = pfn_setOutputDirectory && pfn_mapSaveAs && pfn_mapLoadFrom && pfn_isRoad && pfn_isCollision && pfn_readBitmap

    return bret0 && bret1 && bret2 && bret3
end

//新建地图
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[unsigned short]宽
//参数4:[unsigned short]高
//成功返回1否则0
function createNewMap(id, mapid, w, h)
    return pointercall("long", pfn_createNewMap, "short", id, "DWORD", varaddress(mapid), "short", w, "short", h)
end

//添加障碍物
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[unsigned short]x座标
//参数4:[unsigned short]y座标
//成功返回1否则0
function addCollision(id, mapid, x, y)
    return pointercall("long", pfn_addCollision, "short", id, "DWORD", varaddress(mapid), "short", x, "short", y)
end

//移除障碍物
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[unsigned short]x座标
//参数4:[unsigned short]y座标
//成功返回1否则0
function removeCollision(id, mapid, x, y)
    return pointercall("long", pfn_removeCollision, "short", id, "DWORD", varaddress(mapid), "short", x, "short", y)
end

//释放地图
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//成功返回1否则0
function freeMap(id, mapid)
    return pointercall("long", pfn_freeMap, "short", id, "DWORD", varaddress(mapid))
end

//寻路初始化(实例化)
//参数1:[unsigned short]自定义编号(0-65535)
//成功返回1否则0
function initialize(id)
    return pointercall("long", pfn_initialize, "short", id)
end

//设置寻路启发式模式
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[unsigned char] 0:使用曼哈顿距离 1:使用欧几里得距离 (默认0)
//成功返回1否则0
function setHeuristic(id, heuristic)
    return pointercall("long", pfn_setHeuristic, "short", id, "byte", heuristic)
end

//设置寻路直行花费代价
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[unsigned long]代价数值,预设为10
//成功返回1否则0
function setStepValue(id, value)
    return pointercall("long", pfn_setStepValue, "short", id, "long", value)
end

//设置寻路斜行花费代价
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[unsigned long]代价数值,预设为14
//成功返回1否则0
function setObliqueValue(id, value)
    return pointercall("long", pfn_setObliqueValue, "short", id, "long", value)
end

//设置寻路是否允许拐角
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[unsigned char]1允许0不允许
//成功返回1否则0
function enableCorner(id, b)
    return pointercall("long", pfn_enableCorner, "short", id, "byte", b)
end

//是否允许寻路自动输出路径图
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[unsigned char] true允许 false不允许 (默认false)
//成功返回1否则0
function enableAutoPrint(id, b)
    return pointercall("long", pfn_enableAutoPrint, "short", id, "byte", b)
end

//开始寻路
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[unsigned short]起点x座标
//参数4:[unsigned short]起点y座标
//参数5:[unsigned short]终点x座标
//参数6:[unsigned short]终点y座标
//参数7:[wchar_t*]接收返回路径的空字符串指针
//参数8:[unsigned char]返回路径格式0:TC数组字符串 1:一般字符串如: 123,321|456,789
//成功返回1 失败返回0 编号超出限制返回-1 未初始化返回-2
//返回的格式如 array("1" = array("x" = 15, "y" = 20))
function start(id, mapid, x1, y1, x2, y2, &path, retmode)
    var tmpstr = ""
    var size = 0
    //预估大约需要的wchar_t字节数
    if(0 == retmode)
        size = strlen("\"9999\"=array(\"x\"=9999,\"y\"=9999)") * (mabs(x1 - x2) + mabs(y1 - y2)) * 2 * 2
    else
        size = strlen("9999,9999|") * (mabs(x1 - x2) + mabs(y1 - y2)) * 2 * 2
    end
    //申请字符串内存空间
    var wstr = new(size, "wchar")
    var nret = pointercall("long", pfn_start, "short", id, "DWORD", varaddress(mapid), "short", x1, "short", y1, "short", x2, "short", y2, "DWORD", wstr, "byte", retmode)
    if(1 == nret)
        //读出字符串直到 '\0'
        path = addressvalue(wstr, "wchar *")
    end
    //释放字符串指针(很重要)
    structfree(wstr)
    return nret
end

//输出指定地图
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[c**t wchar_t*]输出完整路径包含名称(BMP)
//成功返回1 失败返回0 编号超出限制返回-1
function printMap(id, mapid, fileName)
    return pointercall("long", pfn_printMap, "short", id, "DWORD", varaddress(mapid), "DWORD", varaddress(fileName))
end

//设置输出地图牆体颜色
//参数1:[DWORD]十进制RGB整数
//成功返回1 失败返回0
function setWallColor(color)
    return pointercall("long", pfn_setWallColor, "DWORD", color)
end

//设置输出地图可走路面颜色
//参数1:[DWORD]十进制RGB整数
//成功返回1 失败返回0
function setRoadColor(color)
    return pointercall("long", pfn_setRoadColor, "DWORD", color)
end

//设置输出地图寻路路径颜色
//参数1:[DWORD]十进制RGB整数
//成功返回1 失败返回0
function setPathColor(color)
    return pointercall("long", pfn_setPathColor, "DWORD", color)
end

//输出指定路径输出目录
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[c**t wchar_t*]要设置的路径输出目录(BMP)
function setOutputDirectory(id, fileDir)
    return pointercall("long", pfn_setOutputDirectory, "short", id, "DWORD", varaddress(fileDir))
end

//输出二进制地图
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[c**t wchar_t*]要保存二进制地图的路径
function mapSaveAs(id, mapid, fileName)
    return pointercall("long", pfn_mapSaveAs, "short", id, "DWORD", varaddress(mapid), "DWORD", varaddress(fileName))
end

//载入二进制地图
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[c**t wchar_t*]要载入的二进制地图路径
function mapLoadFrom(id, mapid, fileName)
    return pointercall("long", pfn_mapLoadFrom, "short", id, "DWORD", varaddress(mapid), "DWORD", varaddress(fileName))
end

//查看某个座标是否为路
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[unsigned short]x座标
//参数4:[unsigned short]y座标
function isRoad(id, mapid, x, y)
    return pointercall("long", pfn_isRoad, "short", id, "DWORD", varaddress(mapid), "short", x, "short", y)
end

//查看某个座标是否为障碍
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[unsigned short]x座标
//参数4:[unsigned short]y座标
function isCollision(id, mapid, x, y)
    return pointercall("long", pfn_isCollision, "short", id, "DWORD", varaddress(mapid), "short", x, "short", y)
end


//查看某个座标是否为障碍
//参数1:[unsigned short]自定义编号(0-65535)
//参数2:[wchar_t*]地图名称
//参数3:[unsigned short]BMP地图的路径
function readBitmap(id, mapid, fileName)
    return pointercall("long", pfn_readBitmap, "short", id, "DWORD", varaddress(mapid), "DWORD", varaddress(fileName))
end


回复 支持 反对

使用道具 举报

发表于 2022-6-27 19:39:32 | 显示全部楼层
学习学习
回复

使用道具 举报

发表于 2022-7-2 17:10:22 来自手机 | 显示全部楼层
学习一下,钉了
回复 支持 反对

使用道具 举报

发表于 2022-7-4 21:33:41 | 显示全部楼层
sets的
回复

使用道具 举报

发表于 2022-7-17 09:38:35 | 显示全部楼层
11111111111111111111111111
回复 支持 反对

使用道具 举报

发表于 2022-7-21 20:43:42 | 显示全部楼层
6666666666666
回复 支持 反对

使用道具 举报

发表于 2022-8-10 23:52:29 | 显示全部楼层
感谢分享学习下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-3-30 08:26 , Processed in 0.034628 second(s), 18 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表