找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 196|回复: 0

传奇2寻路源码

[复制链接]

1793

主题

457

回帖

0

积分

管理员

积分
0
发表于 2013-8-23 10:37:24 | 显示全部楼层 |阅读模式
.版本 2
.支持库 BmpOperate

.程序集 窗口程序集1
.程序集变量 移动, 逻辑型
.程序集变量 地图图片, 字节集
.程序集变量 地图位图, 位图
.程序集变量 地图分析, 字节型, , "0", 128代表黑色(不可移动区)
.程序集变量 路线, 字节型, , "0", 从开始点至结束点的方向
.程序集变量 原地图标签指针, 子程序指针
.程序集变量 参与物, 点, , "0", 人、NPC、怪物、路线等
.程序集变量 场景句柄

.子程序 __启动窗口_创建完毕
.局部变量 X
.局部变量 Y
.局部变量 当前X
.局部变量 当前Y

地图图片 = #地图
地图位图.载入数据 (#地图)
X = 地图位图.取宽度 ()
Y = 地图位图.取高度 ()
重定义数组 (地图分析, 假, X, Y)
.计次循环首 (Y, 当前Y)
    .计次循环首 (X, 当前X)
        .如果真 (地图位图.取某点颜色 (当前X - 1, 当前Y - 1) = #黑色)
            地图分析 [当前X] [当前Y] = 128
        .如果真结束

    .计次循环尾 ()
.计次循环尾 ()
地图标签.底图 = #地图
地图标签.置父窗口 (外形标签)
地图标签.左边 = 0
地图标签.顶边 = 0
地图标签.宽度 = X
地图标签.高度 = Y
原地图标签指针 = 置窗口特征 (地图标签.取窗口句柄 (), -4, &消息处理)

.子程序 _地图标签_鼠标左键被按下, 逻辑型
.参数 横向位置, 整数型
.参数 纵向位置, 整数型
.参数 功能键状态, 整数型

移动 = 真

.子程序 _地图标签_鼠标位置被移动, 逻辑型
.参数 横向位置, 整数型
.参数 纵向位置, 整数型
.参数 功能键状态, 整数型

.如果 (移动)
    地图标签.发送信息 (161, 2, 0)
.否则
    _启动窗口.标题 = “当前位置:” + 到文本 (横向位置) + “,” + 到文本 (纵向位置)
.如果结束


.子程序 _地图标签_鼠标左键被放开, 逻辑型
.参数 横向位置, 整数型
.参数 纵向位置, 整数型
.参数 功能键状态, 整数型

移动 = 假

.子程序 寻路, 逻辑型
.参数 开始X, 整数型
.参数 开始Y, 整数型
.参数 结束X, 整数型
.参数 结束Y, 整数型
.局部变量 X, 短整数型
.局部变量 Y, 短整数型
.局部变量 当前X, 短整数型
.局部变量 当前Y, 短整数型
.局部变量 坐标X表, 短整数型, , "0"
.局部变量 坐标Y表, 短整数型, , "0", 与坐标X表变量配套使用
.局部变量 坐标表数, 短整数型, , , 与坐标X表变量配套使用
.局部变量 坐标X表指针, , , , 与坐标X表变量配套使用
.局部变量 坐标Y表指针, , , , 与坐标X表变量配套使用
.局部变量 新坐标X表, 短整数型, , "0"
.局部变量 新坐标Y表, 短整数型, , "0", 与新坐标X表变量配套使用
.局部变量 新坐标表数, 短整数型, , , 与新坐标X表变量配套使用
.局部变量 新坐标X表指针, , , , 与新坐标X表变量配套使用
.局部变量 新坐标Y表指针, , , , 与新坐标X表变量配套使用
.局部变量 I1
.局部变量 I2
.局部变量 当前地图分析, 字节型, , "0"
.局部变量 方向, 字节型
.局部变量 点, 点

当前地图分析 = 地图分析
X = 取数组下标 (地图分析, 1)
Y = 取数组下标 (地图分析, 2)
.判断开始 (开始X < 1 或 开始X > X 或 开始Y < 1 或 开始Y > Y 或 结束X < 1 或 结束X > X 或 结束Y < 1 或 结束Y > Y)

.判断 (当前地图分析 [开始X] [开始Y] = 128 或 当前地图分析 [结束X] [结束Y] = 128)

.默认
    I1 = (X + Y) × 2
    重定义数组 (坐标X表, 假, I1)
    重定义数组 (坐标Y表, 假, I1)
    重定义数组 (新坐标X表, 假, I1)
    重定义数组 (新坐标Y表, 假, I1)
    坐标X表指针 = 取短整数型数组指针 (坐标X表, 坐标X表, 0)
    坐标Y表指针 = 取短整数型数组指针 (坐标Y表, 坐标Y表, 0)
    新坐标X表指针 = 取短整数型数组指针 (新坐标X表, 新坐标X表, 0)
    新坐标Y表指针 = 取短整数型数组指针 (新坐标Y表, 新坐标Y表, 0)
    坐标表数 = 1
    坐标X表 [1] = 结束X
    坐标Y表 [1] = 结束Y
    .循环判断首 ()
        .计次循环首 (坐标表数, I1)
            .计次循环首 (8, I2)  ' 8个方向
                当前X = 坐标X表 [I1] + 多项选择 (I2, 0, 1, 1, 1, 0, -1, -1, -1)
                当前Y = 坐标Y表 [I1] + 多项选择 (I2, -1, -1, 0, 1, 1, 1, 0, -1)
                .判断开始 (当前地图分析 [当前X] [当前Y] = 0)
                    .如果 (当前X ≠ 开始X 或 当前Y ≠ 开始Y)
                        当前地图分析 [当前X] [当前Y] = I2 + 10
                        新坐标表数 = 新坐标表数 + 1
                        新坐标X表 [新坐标表数] = 当前X
                        新坐标Y表 [新坐标表数] = 当前Y
                    .否则
                        当前地图分析 [当前X] [当前Y] = I2
                        I1 = 1
                        .判断循环首 (取数组成员数 (参与物) ≥ I1)
                            .如果 (参与物 [I1].类型 = #路线)
                                删除成员 (参与物, I1, )
                            .否则
                                I1 = I1 + 1
                            .如果结束

                        .判断循环尾 ()
                        清除数组 (路线)
                        X = 开始X
                        Y = 开始Y
                        点.类型 = #路线
                        .循环判断首 ()
                            方向 = 当前地图分析 [X] [Y]
                            加入成员 (路线, 方向)
                            点.X = X
                            点.Y = Y
                            插入成员 (参与物, 1, 点)
                            X = X + 多项选择 (方向, 0, -1, -1, -1, 0, 1, 1, 1)
                            Y = Y + 多项选择 (方向, 1, 1, 0, -1, -1, -1, 0, 1)
                        .循环判断尾 (X ≠ 结束X 或 Y ≠ 结束Y)
                        地图标签.重画 ()
                        返回 (真)
                    .如果结束

                .判断 (当前地图分析 [当前X] [当前Y] > 10 且 当前地图分析 [当前X] [当前Y] < 20 且 当前地图分析 [当前X] [当前Y] % 2 = 0)
                    当前地图分析 [当前X] [当前Y] = I2 + 10
                .默认

                .判断结束

            .计次循环尾 ()
        .计次循环尾 ()
        .计次循环首 (新坐标表数, I1)
            当前地图分析 [新坐标X表 [I1]] [新坐标Y表 [I1]] = 当前地图分析 [新坐标X表 [I1]] [新坐标Y表 [I1]] - 10
        .计次循环尾 ()
        API_复制内存 (坐标X表指针, 新坐标X表指针, 新坐标表数 × 2)
        API_复制内存 (坐标Y表指针, 新坐标Y表指针, 新坐标表数 × 2)
        坐标表数 = 新坐标表数
        新坐标表数 = 0
    .循环判断尾 (坐标表数 > 0)
.判断结束
返回 (假)

.子程序 重画参与物
.局部变量 场景句柄
.局部变量 I

场景句柄 = API_取组件场景 (地图标签.取窗口句柄 ())
.计次循环首 (取数组成员数 (参与物), I)
    API_画点 (场景句柄, 参与物 [I].X - 1, 参与物 [I].Y - 1, 多项选择 (参与物 [I].类型, #蓝色, #黄色, #人物, #怪物))
.计次循环尾 ()
API_释放场景 (地图标签.取窗口句柄 (), 场景句柄)

.子程序 _说明按钮_被单击

信息框 (“移动地图:在地图是按住鼠标键不放,再移动鼠标。”, 0, “提示:”)

.子程序 消息处理
.参数 句柄
.参数 消息号
.参数 参数1
.参数 参数2

执行窗口程序 (原地图标签指针, 句柄, 消息号, 参数1, 参数2)
.如果真 (消息号 = 15)
    重画参与物 ()
.如果真结束


.子程序 _寻路按钮_被单击
.局部变量 耗时
.局部变量 结果, 逻辑型

耗时 = 取启动时间 ()
结果 = 寻路 (到整数 (开始X编辑框.内容), 到整数 (开始Y编辑框.内容), 到整数 (结束X编辑框.内容), 到整数 (结束Y编辑框.内容))
耗时 = 取启动时间 () - 耗时
.如果 (结果)
    信息框 (“耗时:” + 到文本 (耗时) + “毫秒。注:本寻代码还可以再优化”, 0, )
.否则
    信息框 (“该区域不可到达!”, 0, )
.如果结束


http://yunpan.cn/QXYYk8uBsLtuU
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 14:00 , Processed in 0.077486 second(s), 21 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

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