锚点-抓点移动、抓图移动


一、简介

抓点移动:在屏幕上查找一个色块并将“模块锚点”移动到色块的右下角。
抓图移动:在屏幕上查找一个图片并将“模块锚点”移动到图片的右下角。
通过移动锚点,从而自动的相对移动“模拟区块-->模块事件”中所有鼠标指令的坐标

在您开始录制一个“模拟区块”, 发送第一个按键或者鼠标消息以后,模拟精灵将创建锚点。
在创建锚点时,模拟精灵将会纪录鼠标指向坐标点的设定大小的色块并创建“锚点-->抓点移动”节点。
在创建锚点时,模拟精灵将会纪录鼠标指向坐标点的设定大小的图片并创建“锚点-->抓图移动”节点。

模拟精灵总是以锚点所在的坐标作为“色块”或“图片”的右下角。
创建锚点时,鼠标指针在“色块”或“图片”的右下角。

抓色块、抓图的默认大小可以点击“设置-->锚点快照”进行修改,如下图:

二、抓点移动

1、简介

“抓点移动”不但能抓一个点,而且能抓取一组点组成的色块(实际上也就是一个小图片)

这比传统键盘软件的抓点方式要先进的多,例如你抓一个红色的点,屏幕上只有一个红色的点的可能性几乎是很小,
所以这样的抓点起不了什么作用,大多时候抓点都会跑到莫名其妙的位置,例如你明明想抓一个图标上的红点,
他却跑到了任务栏(因为那里也有一个红点吗...)

而使用模拟精灵的抓点,只要2*2的色块即可以在屏幕上精确的定位任意一个点,结果基本上是百分之百的精确
更不要说32*32了,更重要的是模拟精灵抓取色块的速度与抓取一个点的速度几乎是一样的.
模拟精灵首创的抓色块功能--是对于传统键盘软件的一个重大革新。

你在模拟精灵的视图界面点击抓点节点,会看到一个小图片。
如果预设定的抓点大小太小的话可能看不清,点击"图片"按钮,然后点击工具栏的放大镜即可。

2、启用抓点移动

如果您需要启动“抓点移动”的功能。那么在完成录制以后一定要立即点击“处理指令->抓点移动->启用”并选择“是”
否则,模拟精灵在解析ApeML代码时,将会自动清除没有启用的抓点数据,自动添理这些数据是为了减小fap文件体积。

在我们切找到“源码编辑器”,点击“读取源代码”,在ApeML中检视抓点节点,会看到一组色块信息,如一个2*2的色块会显示如下:

#633839#6B5139,#EF1818#B51818


其中#633839#6B5139表示第一行,#EF1818#B51818表示第二行,每行之间用一个逗号分隔
(注意无论是在ApeML还是LAScript中都是用逗号分隔数组元素)

而#633839表示一个点的颜色值,模拟精灵的颜色值与普通网页使用的表达方式完全是一样的
#633839是一个十六进制的RGB值,63表示红色,38表示绿色,39表示蓝色

附注:在模拟精灵中,颜色的字符串值与网页上通用的颜色表示方法相同,即#RRGGBB。
第1、2位以16进制数表示红色(R),第3、4位以16进制数表示绿色(G),第5、6位以16进制数表示蓝色(B)。


2、设置抓色块范围

"查找区块" - 指的是查询范围,当然缩小查询范围速度也会明显的提升了.

4、查找不规则的色块

您可以通过设置“忽略颜色”查找不规则的几何图形,在查找色块时,忽略色块中某个区域。
例如您将忽略颜色指定为#6B5139,那么对于"#633839#6B5139,#EF1818#B51818",模拟精灵将会忽略第二个像素。

5、设置BPP值

与简易抓点相同,“抓点移动”同样允许您自定义BPP值。
当您制作了一个模拟程序,使用了“抓点移动”的功能,然后您把模拟程序传递给您的朋友使用时。
您可能会遇到这一样一个问题:朋友的显示器设置跟您不一样,“抓点移动”失败。即无法抓到指定的色块。
这时候,通过降低BPP位数,就可以解决这一问题,模拟精灵会在一定的范围内允许近似色

6、优化建议

  1. 色块越小、效果越好速度越快。
    请点击“模拟区块- >锚点->鼠标锚点->抓点移动”节点,然后点击“抓图”按钮, 在图片编辑器中修剪色块使之更小。
  2. 尽量不要包含或者少包含背景色。
    请点击“模拟区块- >锚点->鼠标锚点->抓点移动”节点,然后点击“抓图”按钮,
    在图片编辑器中裁剪色块,尽可能不要包含背景颜色(不要剪除右下角,因为色块右下角指向锚点坐标)
  3. 查找的色块应当特征明显、在屏幕上类似色块越少查找速度也就越快结果也越准确。

7、在LAScript控制“锚点-->抓点移动”节点

local m = ape:getModule("抓点模拟区块的名字");
 
local x,y,x2,y2 =m:getFindPixRect(); --在脚本中得到"抓点移动"的查找范围
m:setFindPixRect(x,y,x2,y2);
--在脚本中设置"抓点移动"的查找范围

8、在LAScript脚本中使用抓点移动的功能

方法一:使用函数 color.find(cl,x,y,x2,y2) cl:find(x,y,x2,y2)
x,y,x2,y2指定查找范围,cl是一个color对象(参考后面的LAScript教程)。

cl = color(54568);
x,y =cl:find(0,0,1024,768);
 
win.consoleOpen()
print(x,y);

方法二:使用函数img:findColor(cl,x,x,x2,y2);在图像上搜索指定颜色的点。
其中cl参数指定颜色,可以是color对象,或者数字值,或者形如"#FFFFFF"的字符串表达式

下面是一个例子,实现同样的功能,比color.find快了近十倍。

img=image.new();--创建图象
img:capture();--抓屏
 
img:bpp(8); --可以通过bpp函数求近似色
 
x,y =img:findColor(54568,0,0,1024,768);
 
--win.consoleOpen()
mouse.move(x,y,true);
print(x,y);


方法三:使用“draw类库”执行屏幕扫描

draw类库可用于可用于鼠标画线、屏幕扫描、游戏找怪、屏幕绘图、画图。
把draw.las 放到Fairy_Ape\import目录下(点击这里打开draw.las)

import("draw"); --导入draw类库,请先把draw.las放到Fairy_Ape\import目录下
 
--根据自已的需要重写move  函数,
draw.move =  function(x,y)  
    mouse.move(x,y,true);
    if(color("#FF0000")==color(x,y))then
        --找到了颜色为#FF0000的坐标点
        return false;--停止扫描
   end;
 
    return nStop(); --如果用户没有按下停止热键,返回true继续扫描
end;
 
--画直线
draw.line(23,100,23,300);
--画矩形
draw.rect(23,32,200,100);
-- 画正弦曲线
draw.sin()
-- 画渐开线
draw.involute();
-- 画方形仿渐开线,步进为5,中间忽略的正方形边长为50
draw.rect_inv(5,50);
-渐开线
draw.involute2(1024/2,768/2,0.1,10);
 


附注:如果模拟程序正在运行 nStop()函数返回true(是),如果用户按下了全部停止热键nStop()函数返回false(否)


三、抓图移动

1、简介

图像匹配一向是图像处理的难点,基本上没有理想的算法可以精确块快速的匹配,
模拟精灵使用自行研发的图像匹配算法,速度非常快,结果也很精确,
在做过的测试中,将一个图标切下一块,然后用模精精灵匹配,最后准确的将图标放到原来的位置,
而且几乎感觉不到延时。

另外模拟精灵抓图是自动的,在开始录制一个模块时即自动抓图并建立锚点。
基本上不需要任何人工操作,抓图操作与代码会自动生成。

抓下来的图片数据也被包含在ApeML中,也就是说,你无需要使用外部的图片文件.
只要一个fap文件即可携带完整的模拟程序.我们可以在ApeML源代码中看到图片的数据如下(红字部份)。

<抓图移动 区块="左 = 0,上 = 0,右 = 1024,下 = 768" 最小相似度="50" 步进="5" BPP="8" 失败="_CMD_LOOP">/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzenRRPPKkcaNJI5CqijJYnoAO5ptfTH7Gnha08TnxOLlIt1u1uUd4wdu4S556/wAI4z3PvX6xiKyw9N1Gtj85w1B4ioqadj5sa0nSQxtC6uDtKspBB9DVhtHu1ilkMaiOJxG7mRdoYhiBnODkI2PXFffPjv4U6bZXPhaPdBFFLrMKtvTOAEkbC9wSQBnmutHwn023AuI8RuhWSN1yGQjBXB9RhSCO4ryJZtBJPl3PbWUxd1dn5mV618APiPqPgLUryDT4Ul/tFo0kLyFNgUMcggHPDHivK7OEXF3BExIV3VSR1wTivbfiP4M8E/s5fHP4ffDrVfE2tX3iDxjcW8OnTWWl2c0ETzXH2ZTOhvkmjXcQd/llWAYIXZHVenH4vD0F7Ov1OPLaFSc3Uh0Po2wtPGHj2xs7i3bTolguEuEM91JuLKN3aM44OPxrC8feO/GfhGOSF49PkZlKCRbuQhW5GdvlDI/EV1X7OniGfUNH1m01Ca2e60rXNW0rfbxtGsiWeoXNoj7CzFWZII2PPUnHHA86/aI1mBVuUSZUb5trh8YJ6HPYZI5r5/DONasocq5eh9HUXs4c19T/2Q==</抓图移动>


2、启用抓图移动

如果您需要启动“抓图移动”的功能。那么在完成录制以后一定要立即点击“处理指令->抓图移动->启用”并选择“是”
否则,模拟精灵在解析ApeML代码时,将会自动清除没有启用的抓图数据,自动添理这些数据是为了减小fap文件体积。

2、设置步进

"步进" - 指每次搜索移动的单位距离,增加步进可以显著的提升查询速度.
步进过小速度会很慢而且查询效果并不一定很好,建议步进最小不低于5;
至于如何设置达到最佳的效果,这就要看您的模拟程序运行环境通过练习增加经验了.

3、设置抓图范围

"查找区块" - 指的是查询范围,当然缩小查询范围速度也会明显的提升了.

5、设置相似度

"相似度" - 是指查找到的图片与“锚点-->抓图移动”节点中存储的图片样本进行比较所允许的最小相似度(百分比),如果低于预设定的相似度则认为抓图移动失败(触发“失败处理指令”)。完全相似为100,完全不相似为0,通常大于50即可.

6、设置BPP值

与“抓点移动”相同,“抓图移动”同样允许您自定义BPP值。
当您制作了一个模拟程序,使用了“抓图移动”的功能,然后您把模拟程序传递给您的朋友使用时。
您可能会遇到这一样一个问题:朋友的显示器设置跟您不一样,“抓图移动”失败。即无法抓到指定的图片。
这时候,通过降低BPP位数,就可以解决这一问题,模拟精灵会在一定的范围内允许近似图片

7、优化建议

  1. 并非是图片越小效果越好、应当多次抓取不同大小图片样本进行测试比较。
  2. 尽量不要包含或者少包含背景色。
    请点击“模拟区块- >锚点->鼠标锚点->抓图移动”节点,然后点击“抓图”按钮,
    在图片编辑器中裁剪图片,尽可能不要包含背景颜色(不要剪除右下角,因为图片右下角指向锚点坐标)
  3. 查找的图片应当特征明显、在屏幕上类似图片越少查找速度也就越快结果也越准确。

  4. 增加步进(搜索时的移动单位)可以提升查询速度.

8、在LAScript控制“锚点-->抓图移动”节点

local m = ape:getModule("抓图模拟区块的名字");
 
local x,y,x2,y2 =m:getFindImageRect(); --在脚本中得到"抓图移动"的查找范围
m:setFindImageRect(x,y,x2,y2);--在脚本中设置"抓图移动"的查找范围
 
local str = m:getImageBytes(); --读取"抓图移动"图片样本的字节码
string.save( str,"c:\\test.jpg"); --保存到图片文件
img = image.new();img:setBytes(str ,"*.jpg"); --创建图片
 
m:setImageBytes(str); --设置"抓图移动"图片样本的字节码

9、在LAScript脚本中查找图片

使用 img:find(img2,x,y,x2,y2,step) 函数可以执行图片查找功能。
img是要查找的图像,img2参数是屏幕图像,在img2里面查找img。
参数x,y,x2,y2指定要查找的范围,x、y为左上角坐标,x2、y2为右下角坐标
step参数指定步进.

例:
x,y,sm = img:find(img2,0,0,0,0,5)
返回值x,y 为找到的坐标,sm为相似度,为0到100之间的值,100为完全相似,0为完全不相似

img:find()函数与“模拟区块--抓图移动”的功能类似,参数也类似。

除了img2以外,其他的参数可以忽略,例如你可以写成:
img:find(img2) --查找范围为img2的大小
img:find(img2,0,0)
img:find(img2,0,0,0,0)
img:find(img2,0,0,0,0,5)
以上的写法都是正确的。

也可以写成 image.find(img,img2,0,0,0,0,5)

四、简易抓点、抓点移动、抓图移动的区别

“简易抓点”仅比较单个像素的颜色,没有查找的功能,功能简单速度快。
而“抓点移动”,“抓图移动”比较的是屏幕上的一组像素(色块)或者一个图片,并且能在屏幕指定范围内进行查找。
“抓点移动”以精确匹配为主(即要求完全相似,通过设置BPP,可以允许少量的误差),而“抓图移动”主要是模糊匹配。

简易抓点 支持近似色比较功能(设置bbp值为24位真彩色则不使用近似色比较).抓点速度较快(个别游戏可能不支持)
抓点移动 适合查找较小、结构简单、轮廓分明的色块、色块组成的小图案。有一定的容错能力
抓图移动 适宜查找特征鲜明的任意图形。有较强的容错能力,可以查找可能旋转、移动、变形的图形

五、抓屏设置

在“抓点移动”、“抓图移动”以前模拟精灵都会抓屏,有可能在个别游戏中不支持默认的抓屏方式,导致以上的功能失效。
这时候我们可以点击“设置”按钮,打开设置界面,点选“锚点快照”选项:设置抓屏模式。您在这里设置的“抓屏模式”是针对当前fap文件的,模拟精灵允许不同的fap模拟程序使用不同的“抓屏模式”。

1、抓屏可选三种模式

  1. 普通模式(不推荐)
    这种抓屏方法速度较慢,但是兼容性较好,可在大部份的程序中抓屏

  2. 快速抓屏模式(桌面程序推荐)
    这种抓屏方法速度较快,适应所有桌面程序,但是有些电脑无法在全屏游戏中抓屏

  3. 调用外部程序抓屏(全屏游戏推荐)
    使用模拟精灵提供的接口,您可以调用任何抓屏程序。

    首先需要对抓屏软件进行设置
    使之把抓下来的图片发送到剪贴板

    抓屏软件可以指定完整路径名,也可以只指定文件名,甚至可能只指定文件
    名的一部份,模拟精灵会自动扫描到目标程序.如果指定的程序没有运行,会
    自动启动目标抓屏程序

    另外抓屏软件名字可以为空,如果软件名字为空,则调用系统抓屏功能(支持游戏中的抓屏热键)。

2、调用外部抓屏软件

这里以抓屏软件HyperSnap-DX为例举例说明。

在HyperSnap-DX的菜单里点“捕捉-启用特殊捕捉(DirectX,Glide)”
这样就可以在所有全屏游戏里快速抓屏了

在HyperSnap-DX的菜单里点“捕捉-捕捉设置-查看与编辑" ,
如“图二”设置为不创建新窗口即可。

在HyperSnap-DX的菜单里点“捕捉-捕捉设置-复制与打印"
如“图三”选中“将每次捕捉的图像复制到剪贴板上