核心代码示例
1. 支持库与 DLL 命令声明
首先需要在易语言中添加对应支持库,并声明 Windows API 函数:
易语言
.版本 2
.支持库 eAPI
.支持库 ScreenCap
.支持库 spec
// 声明设置鼠标位置API
.DLL命令 SetCursorPos, 逻辑型, "user32.dll", "SetCursorPos"
.参数 X, 整数型
.参数 Y, 整数型
// 声明模拟鼠标操作API
.DLL命令 mouse_event, 逻辑型, "user32.dll", "mouse_event"
.参数 dwFlags, 整数型
.参数 dx, 整数型
.参数 dy, 整数型
.参数 cButtons, 整数型
.参数 dwExtraInfo, 整数型
// 鼠标操作常量定义
.常量 MOUSEEVENTF_LEFTDOWN, "2" // 左键按下
.常量 MOUSEEVENTF_LEFTUP, "4" // 左键松开
2. 全局变量定义
用于存储游戏窗口信息、识别参数等:
易语言
.版本 2
.全局变量 游戏句柄, 整数型
.全局变量 游戏位置, 矩形
.全局变量 目标R, 整数型, , "255" // 目标颜色R值
.全局变量 目标G, 整数型, , "0" // 目标颜色G值
.全局变量 目标B, 整数型, , "0" // 目标颜色B值
.全局变量 识别开关, 逻辑型, , "假" // 脚本启停开关
3. 核心功能子程序
(1)游戏窗口初始化子程序
易语言
.版本 2
.子程序 初始化游戏窗口, 逻辑型
.参数 游戏窗口标题, 文本型
游戏句柄 = 窗口_取句柄 (游戏窗口标题, )
.如果真 (游戏句柄 = 0)
信息框 ("未找到游戏窗口,请确认游戏已启动并窗口化运行", "错误", 0, )
返回 (假)
.如果真结束
窗口_取位置 (游戏句柄, 游戏位置)
信息框 ("成功定位游戏窗口!" + #换行符 + "窗口坐标:(" + 到文本 (游戏位置.左边) + "," + 到文本 (游戏位置.上边) + ")" + #换行符 + "窗口尺寸:" + 到文本 (游戏位置.宽度) + "×" + 到文本 (游戏位置.高度), "提示", 0, )
返回 (真)
(2)颜色识别与瞄准子程序
易语言
.版本 2
.子程序 视觉识别瞄准, 逻辑型
.局部变量 捕获图像, 字节集
.局部变量 图像宽度, 整数型
.局部变量 图像高度, 整数型
.局部变量 x, 整数型
.局部变量 y, 整数型
.局部变量 像素颜色, 整数型
.局部变量 目标X, 整数型
.局部变量 目标Y, 整数型
// 1. 捕获游戏窗口画面
捕获图像 = 屏幕_捕获窗口 (游戏句柄, 真)
.如果真 (捕获图像 = { })
返回 (假)
.如果真结束
// 2. 获取图像尺寸
图像宽度 = 屏幕_取图像宽度 (捕获图像)
图像高度 = 屏幕_取图像高度 (捕获图像)
目标X = 0
目标Y = 0
// 3. 从屏幕中心向外遍历像素(优先瞄准中心目标)
.变量循环首 (图像高度 ÷ 2, 0, -1, y)
.变量循环首 (图像宽度 ÷ 2, 0, -1, x)
像素颜色 = 屏幕_取图像像素 (捕获图像, x, y)
// 判断像素颜色是否在目标范围(允许±10误差)
.如果真 (取红色分量 (像素颜色) > 目标R - 10 且 取红色分量 (像素颜色) < 目标R + 10 且 取绿色分量 (像素颜色) > 目标G - 10 且 取绿色分量 (像素颜色) < 目标G + 10 且 取蓝色分量 (像素颜色) > 目标B - 10 且 取蓝色分量 (像素颜色) < 目标B + 10)
目标X = 游戏位置.左边 + x
目标Y = 游戏位置.上边 + y
跳出循环 ()
.如果真结束
.变量循环尾 ()
.如果真 (目标X ≠ 0)
跳出循环 ()
.如果真结束
.变量循环尾 ()
// 4. 识别到目标则模拟瞄准射击
.如果真 (目标X ≠ 0 且 目标Y ≠ 0)
SetCursorPos (目标X, 目标Y) // 移动鼠标到目标位置
// 模拟左键点击(射击)
mouse_event (MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
延迟 (20) // 模拟按键时长
mouse_event (MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
返回 (真)
.如果真结束
返回 (假)
(3)脚本启停控制子程序
易语言
.版本 2
.子程序 _启动按钮_被单击
.如果 (启动按钮.标题 = "启动脚本")
.如果真 (初始化游戏窗口 ("FPS游戏窗口标题")) // 替换为实际游戏窗口标题
识别开关 = 真
启动按钮.标题 = "停止脚本"
// 启动线程循环识别
启动线程 (&识别循环线程, , )
.如果真结束
.否则
识别开关 = 假
启动按钮.标题 = "启动脚本"
.如果结束
.子程序 识别循环线程
.局部变量 识别间隔, 整数型, , "50" // 每50ms识别一次,降低CPU占用
.判断循环首 (识别开关 = 真)
视觉识别瞄准 ()
延迟 (识别间隔)
.判断循环尾 ()
4. 可视化界面设计
在易语言中拖放以下组件:
| 组件类型 | 组件名称 | 组件功能 |
|---|---|---|
| 按钮 | 启动按钮 | 控制脚本启停 |
| 标签 | 提示标签 | 显示脚本状态 |
| 输入框 | 颜色 R 输入框 | 自定义目标颜色 R 值 |
| 输入框 | 颜色 G 输入框 | 自定义目标颜色 G 值 |
| 输入框 | 颜色 B 输入框 | 自定义目标颜色 B 值 |
代码使用步骤
- 打开易语言,新建Windows 窗口程序,添加上述支持库和代码。
- 拖放界面组件,并关联子程序(如按钮被单击事件)。
- 修改代码中
游戏窗口标题为实际 FPS 游戏的窗口名称(需窗口化运行游戏)。 - 使用颜色拾取器获取游戏中目标的 RGB 值,填入输入框。
- 编译运行程序,点击启动脚本即可开始视觉识别瞄准。
关键优化与注意事项
- 性能优化
- 调整
识别间隔(默认 50ms),间隔越大 CPU 占用越低,但识别响应越慢。 - 缩小捕获区域:将
屏幕_捕获窗口改为屏幕_捕获区域,只捕获游戏视野中心区域。
- 调整
- 防检测建议
- 增加鼠标移动平滑过渡:不要直接瞬移,可通过循环分步移动鼠标坐标。
- 添加按键触发条件:例如按住
F1键时才执行瞄准,避免自动运行。
- 常见问题解决
- 无法捕获全屏游戏:需将游戏设置为窗口化 / 无边框窗口模式。
- 颜色识别不准确:增大颜色误差范围(如 ±20),或更换模板匹配方式。