请选择 进入手机版 | 继续访问电脑版

XXTouch 论坛

 找回密码
 立即注册
搜索
查看: 133|回复: 4

[开源模块] _Do 框架

[复制链接]

7

主题

13

帖子

136

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
136
QQ
发表于 2018-2-7 13:25:39 | 显示全部楼层 |阅读模式
框架描述:
  • 基于Lua与XXTouch,制作便于开发“游戏”、“app”等批操作的简单框架。
  • _Do拟人判断方式以“多点满足条件则”方法尽心构架,处理操作流程使用keep方式超快速进行遍历所有条件。
  • 此框架并不一定适用于所有操作。

如果在真正意义上的开发过程中,是否会出现以下的情况:
  • 同一个操作需要多次写明点击或输入
  • 循环指定一套流程
  • 突发异常时 while true do ... end 并不能友善的处理异常
  • 针对不友善协程一知半解
  • 每次修改参数以及处理过程混乱


那么推荐使用_Do
  • 以人工处理逻辑进行操作(看到什么操作什么)
  • 逻辑 与 参数分离(_Do成型模块 只需要传递入 table参数)
  • 超时、重复 等问题加入判断逻辑便于操作
  • 单纯单线程实现整个逻辑处理

框架结构分为三层
子表主要判断Name子表名
Color 用于判断的颜色表
Run处理逻辑
et传递表自身至此 Run 方法内

母表处理大框架包裹子表Name框架名字
参数部分判断或特殊情况处理方法Repeat重复检测到相同的内容则处理
n(Repeat) 重复检测到时常满足 n 秒内 每次都能找到
Run(Repeat)重复检测到后的处理方式
timeout超时任何东西未检测到后处理方式
n(timeout)超时时长
Run(timeout)超时处理方式
Begin开启层前处理
End跳出层时处理
sleep每次处理完一次循环逻辑 等待时常
csim全局相似度



_Do框架源码引入
  1. local _Do = function(_tab, b_debug)
  2.     -- 判断是否传入的是正确内容
  3.     local check_table
  4.     check_table = function(t)
  5.         if type(t) ~= 'table' then error('传入非table内容',3) end
  6.         if #t == 0 then error('传入table无数据',3) end
  7.         if not (type(t.csim) == 'number' or type(t.csim) == 'nil') then error('相似度数值不正确',3) end
  8.         if not (
  9.             (
  10.                 type(t.Repeat) == 'table' and
  11.                 type(t.Repeat.n) == 'number' and
  12.                 type(t.Repeat.Run) == 'function'
  13.             ) or
  14.             type(t.Repeat) == 'nil'
  15.             ) then
  16.             error('Repeat 参数不正确',3)
  17.         end
  18.         if not (
  19.             (
  20.                 type(t.timeout) == 'table' and
  21.                 type(t.timeout.n) == 'number' and
  22.                 type(t.timeout.Run) == 'function'
  23.             ) or
  24.             type(t.timeout) == 'nil'
  25.             ) then
  26.             error('timeout 参数不正确',3)
  27.         end
  28.         for n, v in ipairs(t) do
  29.             if not (
  30.                 type(v.Name) == 'string' and
  31.                 type(v.Color) == 'table' and
  32.                 type(v.Run) == 'function' and
  33.                 (type(v.csim) == 'number' or type(v.csim) == 'nil') and
  34.                 (type(v.layer) == 'table' or type(v.layer) == 'nil')
  35.                 ) then
  36.                 error(string.format("传入table第%d项不正确",n),3)
  37.             else
  38.                 for _n, _v in ipairs(v.Color) do
  39.                     if not (
  40.                         type(_v[1]) == 'number' and
  41.                         type(_v[2]) == 'number' and
  42.                         type(_v[3]) == 'number'
  43.                         ) then
  44.                         error(string.format("传入table第%d项内点色第%d项不正确",n,_n),3)
  45.                     end
  46.                 end
  47.                 if type(v.layer) == 'table' then
  48.                     check_table(v.layer)
  49.                 end
  50.             end
  51.         end
  52.     end
  53.     check_table(_tab)
  54.     local _log = function() end
  55.     if type(b_debug) == "function" then
  56.         _log = b_debug
  57.     elseif b_debug then
  58.         _log = function(...) nLog(...) end
  59.     else
  60.     end
  61.     -- 对全局 DoName 进行赋值 当前处理的 框架
  62.     if type(_G.DoName) == "table" then
  63.         table.insert(DoName,_tab.Name)
  64.     else
  65.         _G.DoName = {_tab.Name}
  66.     end
  67.     if type(_tab.Begin) == "function" then
  68.         _tab.Begin()
  69.     end
  70.     local _now = os.time()
  71.     local _break = false
  72.     local _Repeat = false
  73.     -- 初始化 重复 计时值
  74.     for _key,_value in ipairs(_tab) do
  75.         _value.RepeatTime = os.time()
  76.     end
  77.     while true do
  78.         --满足状态的 key 会缓存至这里
  79.         local _States = {}
  80.         --寻找满足状态的项
  81.         screen.keep()
  82.         for _key,_value in ipairs(_tab) do
  83.             if screen.is_colors(_value.Color, _value.csim or _tab.csim) then
  84.                 _log(_value.Name, "发现")
  85.                 table.insert(_States,_key)
  86.                 --检测重复
  87.                 if _tab.Repeat then
  88.                     if os.time() - _value.RepeatTime >= _tab.Repeat.n then
  89.                         _value.RepeatTime = os.time()
  90.                         if not _value.NoRepeat then
  91.                             _log(_value.Name, "重复")
  92.                             _Repeat = true
  93.                         end
  94.                     end
  95.                 end
  96.             else
  97.                 _value.RepeatTime = os.time()
  98.             end
  99.         end
  100.         screen.unkeep()
  101.         --超时判断
  102.         if #_States == 0 then
  103.             if _tab.timeout then
  104.                 if os.time() - _now >= _tab.timeout.n then
  105.                     _log(_tab.Name, "超时")
  106.                     if _tab.timeout.Run(_tab.timeout) then
  107.                         break
  108.                     end
  109.                     if _tab.timeout.layer then
  110.                         _Do(_tab.timeout.layer)
  111.                     end
  112.                     _now = os.time()
  113.                 end
  114.             end
  115.         else
  116.             --执行满足状态的项
  117.             for _key,_value in ipairs(_States) do
  118.                 local _Handle = _tab[_value]
  119.                 _log(_Handle.Name, "执行")
  120.                 if _Handle.Run then
  121.                     if _Handle.Run(_Handle) then
  122.                         _break = true
  123.                     end
  124.                 end
  125.                 if _Handle.layer then
  126.                     _Do(_Handle.layer)
  127.                 end
  128.                 _now = os.time()
  129.             end
  130.             if _break then break end
  131.             if _Repeat then
  132.                 if _tab.Repeat.Run(_tab.Repeat) then
  133.                     break
  134.                 end
  135.                 _Repeat=false
  136.             end
  137.         end
  138.         sys.msleep(_tab.sleep or 500)
  139.     end
  140.     if type(_tab.End) == "function" then
  141.         _tab.End()
  142.     end
  143.     -- 对全局 DoName 进行剔除 已处理的 框架
  144.     if type(_G.DoName) == 'table' then
  145.         if #(_G.DoName) > 0 then
  146.             table.remove(_G.DoName,#DoName)
  147.         end
  148.     end
  149. end
复制代码



例子1

假如我需要判断,如:
屏幕 619,110 位置的色彩为 0x334455 则 点击 100, 100 这个位置
  1. local run = {
  2.         Name = "主流程"
  3.         {   
  4.                 Name = '发现 619,110 满足条件',
  5.                 Color = {
  6.                         {619,110,0x334455}
  7.                 },
  8.                 Run = (function(et)
  9.                         touch.tap(100,100)
  10.                 end)
  11.         },
  12. }
  13. _Do(run)
复制代码

* Color参数可使用抓色器XXTStudio来得到

例子2

假如我需要循环,如:
  1. while true do
  2.         if screen.is_colors({
  3.                 {137,  60, 0x3498db},
  4.                 {100,  91, 0x3498db},
  5.                 { 51, 157, 0x304357},
  6.                 { 64, 195, 0xffffff},
  7.         }, 85) then
  8.                 touch.tap(69, 170)
  9.         end

  10.         if screen.is_colors({
  11.                 {120, 575, 0xefeff4},
  12.                 {160, 690, 0xefeff4},
  13.                 {260, 655, 0xefeff4},
  14.                 {237, 612, 0xefeff4},
  15.                 {155, 651, 0xefeff4},
  16.         }, 85) then
  17.                 touch.tap(255, 678, 50, 2000)
  18.                 app.input_text("123123")
  19.                 sys.msleep(2000)
  20.                 touch.tap(255, 678)
  21.         end
  22. end
复制代码

可以简写为
  1. local run = {
  2.         Name = "主流程"
  3.         {   
  4.                 Name = '满足条件1',
  5.                 Color = {
  6.                         {137,  60, 0x3498db},
  7.                         {100,  91, 0x3498db},
  8.                         { 51, 157, 0x304357},
  9.                         { 64, 195, 0xffffff},
  10.                 },
  11.                 Run = (function(et)
  12.                         touch.tap(69, 170)
  13.                 end)
  14.         },
  15.         {   
  16.                 Name = '满足条件2',
  17.                 Color = {
  18.                         {120, 575, 0xefeff4},
  19.                         {160, 690, 0xefeff4},
  20.                         {260, 655, 0xefeff4},
  21.                         {237, 612, 0xefeff4},
  22.                         {155, 651, 0xefeff4},
  23.                 },
  24.                 Run = (function(et)
  25.                         touch.tap(255, 678, 50, 2000)
  26.                         app.input_text("123123")
  27.                         sys.msleep(2000)
  28.                         touch.tap(255, 678)
  29.                 end)
  30.         },
  31.         csim = 85
  32. }

  33. _Do(run)
复制代码


拓展例子(复杂度过高)

_Do支持层套层但是层级关系复杂度过高个人不建议新手接触
  1. local Test = {
  2.     Name = '第一层',
  3.     {   
  4.         Name = '检测1',
  5.         Color = {{619,110,0x334455}},
  6.         Run = (function(et) touch.tap(100,100)  end)
  7.     },
  8.     {   
  9.         Name = '检测2',Color = {{619,110,0xffffff}},
  10.         Run = (function(et) return true --[[跳出]]    end),
  11.         ---[[---------------    当处理完测试2后激活第二层
  12.         layer = {
  13.             Name = '第二层',
  14.             {
  15.                 Name = '检测3',
  16.                 Color = {{619,110,0x334455}},
  17.                 Run = (function(et) touch.tap(100,100)  end),
  18.             },
  19.             Repeat = {
  20.                 n = 3,
  21.                 Run = (function(et) --[[重复]]    end),
  22.             },
  23.             timeout = {
  24.                 n = 60,
  25.                 Run = (function(et) --[[超时]]    end),
  26.             },
  27.             Begin = (function()     end),
  28.             End = (function()       end),
  29.             sleep = 800,
  30.             csim = 90
  31.         },
  32.         ---]]---------------
  33.         csim = 90,
  34.     },
  35.     Repeat = {
  36.         n = 3,
  37.         Run = (function(et) --[[重复]]    end),
  38.     },
  39.     timeout = {
  40.         n = 60,
  41.         Run = (function(et) --[[超时]]    end),
  42.     },
  43.     Begin = (function()     end),
  44.     End = (function()       end),
  45.     sleep = 800,
  46.     csim = 90
  47. }

  48. _Do(Test)
复制代码




回复

使用道具 举报

1

主题

18

帖子

142

积分

小码

Rank: 2

积分
142
发表于 2018-2-8 03:04:59 | 显示全部楼层
学习学习
回复

使用道具 举报

0

主题

11

帖子

350

积分

码工

Rank: 3Rank: 3

积分
350
发表于 2018-2-8 12:18:46 | 显示全部楼层
这种帖子是一定要支持的。但能否告之下,DO框架相比于其它方法。有什么优势吗?
回复

使用道具 举报

7

主题

13

帖子

136

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
136
QQ
 楼主| 发表于 2018-2-8 13:26:00 | 显示全部楼层
持风 发表于 2018-2-8 12:18
这种帖子是一定要支持的。但能否告之下,DO框架相比于其它方法。有什么优势吗? ...

优势取决于你
开源、逻辑与处理分离、效率……

以最简单、最快速的方式制作脚本。

你尝试下就明白优越
回复

使用道具 举报

0

主题

11

帖子

350

积分

码工

Rank: 3Rank: 3

积分
350
发表于 2018-2-9 13:47:44 | 显示全部楼层
chendbdb 发表于 2018-2-8 13:26
优势取决于你
开源、逻辑与处理分离、效率……

嗯,辛苦了。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|关于我们|XXTouch Inc. ( 湘ICP备15002722号-2 )

GMT+8, 2018-2-23 10:48

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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