AnkuLua 發表於 Oct 14, 2015 14:35:09 GMT
AnkuLua提供在特殊情況和使用狀況下的一些特殊的函數。
zoom(pt1StartX, pt1StartY, pt1EndX, pt1EndY, pt2StartX, pt2StartY, pt2EndX, pt2EndY, step)
代表已指定的step次數,一根手指從 (pt1StartX, pt1StartY) 移動到 (pt1EndX, pt1EndY) 的同時,另一根手指從 (pt2StartX, pt2StartY) 移動到(pt2EndX, pt2EndY)
例如,下面腳本會縮小畫面(zoom out)
continueClick(x, y, xRandom, yRandom, times)
該函數將連續點擊(X,Y)到(X + xRandom,Y + yRandom)這一範圍指定的次數。
通常情況下,單擊函數並不快。
如果你真的想在某個區域內快速點擊,使用continueClick函數。
請參考腳本 Tap Titans Click
continueClick(PSMRL, times [,timeout])
函數continueClick還支持PSRML和timeout參數。
沒有返回值。
continueClick可以被直接呼叫,或是由Region呼叫。
continueClick 的時間行為可以藉由setContinueClickTiming設定
setContinueClickTiming(downMs, intervalMs)
int downMs: 按下幾毫秒
int intervalMs: 相鄰的click 間隔幾毫秒
continueMultiTouch(table of PSMRL, times [,timeout])
這個函數可以拿來模擬multi touch,他會輪流點擊PSMRL table 裡的每一個物件,每一個分別點擊times 次
如果是PS (Pattern 或 String),則每一個會搜尋 timeout 時間
如果不給timeout值,則會搜尋默認時間
continueMultiTouch不支援由Region呼叫
continueMultiTouch的時間行為同樣由setContinueClickTiming設定
longClick(PSMRL [,seconds])
stopLongClick()
函數longClick會持續按住目標;如果提供時間(seconds)參數,會按住指定秒數。
如果沒有秒參數,該longClick將持續至下一個觸摸相關命令或stopLongClick() 。
numberOCR( region, imagePrefix)
numberOCR函數會對region 區域做基本的數字 OCR
這些數字的圖形被命名為imagePregix0.png,imagePrefix1.png ... imagePrefix9.png,並儲存在文件夾image 中
若region內沒有任何數字,則會丟出exception
參考 Heroes Charge: Booty Cave.
可以看到在第15行中
numberOCRNoFindException(region, imagePrefix)
功能與numberOCR 相同,但是如果region 內找不到任何數字不會丟exception
同時,此函數返回兩個值,第一個同樣是辨識到的數字,第二個則是成功與否的布林值(成功為true)
charOCR( region, charTable)
numberOCR函數會對region 區域做基本的數字 OCR
腳本需要提供一個圖檔和文字對應的表格
如果region內找不到文字,則會丟出exception.
範例如下
charOCRNoFindException(region, imagePrefix)
功能與charOCR 相同,但是如果region 內找不到任何數字不會丟exception
此函數返回兩個值,第一個同樣是辨識到的字串,第二個則是成功與否的布林值(成功為true)
getColor(PSMRL [, seconds])
這個函數會傳回目標位置的R, G, B 三個顏色值
為了更好的效率,AnkuLua 在做圖形辨識前會先將圖轉成灰階
因此,AnkuLua 無法辨識一個圖是不是彩色
但是,在有些遊戲裡,一個按鈕很可能只是變成灰色來代表另一個意思
這時候,我們就能用這個函數來檢查是否為彩色
getTouchEvent()
等待使用者碰觸螢幕,並將結果傳回。getTouchEvent() 傳回下列三值
action(string): AnkuLua判斷的使用者動作,可能是 "click"、"longClick"、"swipe"、"dragDrop" 四者之一
location(Location (Table)): 如果action 是"click"或"longClick",傳回點擊位置。如果是"swipe"或"dragDrop",傳回含起始與結束兩個位置的表格
touchList (Table): 實際發生的碰觸資料。表格內每一資料格式為{touchType, time, locaiton}
touchType: 整數值,分別表示落下(1)、舉起(2)、移動(2)
time: 從落下開始算的時間
location: 發生位置
因為AnkuLua 只做簡單判斷,如有需要,腳本可以用touchList做出更複雜的對應
注意:getTouchEvent() 執行是會將螢幕上的碰觸攔截,下層遊戲不會收到;因此腳本需要作適當的處理。
為了讓使用者知道現在腳本是可以接受碰觸的,getTouchEvent()在執行時會將螢幕罩上一成半透明顏色,此以顏色可以用setTouchEventStyle(color)設定,color 的格式是ARGB。
playMusic(file, loop)
播放該指定音樂檔一次(loop = false),或是在循環播放(loop = true)。此函數僅限專業版。
請將音樂檔放在 music 目錄裡,然後file不必加目錄
stopMusic()
停止播放音樂。此函數僅限專業版。
vibrate(seconds)
振動設備指定的時間。此函數僅限專業版。
setVolumeDetect(boolean)
根據布林值啟用或禁用音量檢測。函數isVolumeUp()和isVolumeDown()只有當音量檢測啟用才能正確作用。如果禁用音量檢測,isVolumeUp()和isVolumeDown()始終返回false。
isVolumeUp() and isVolumeDown()
isVolumeUp()和 isVolumeDown()檢查音量改變(包括音樂和鈴聲音量)。此函數僅限專業版。
注意:對於某些設備,第一次按音量鍵只顯示當前的音量,也沒有音量變化。因此,你需要再次按下它才能生效。
Timer
使用Timer 物件,使用者就可以知道在一段腳本所使用的時間。
Timer 提供以下的方法
set()
重置時間
返回值: 從Timer 建立或上次呼叫set() 到此次set() 所經過的秒數
check()
返回值: 從Timer 建立或上次呼叫set() 到此次set() 所經過的秒數
setScanInterval(seconds), setScanRate(frequency), getScanInterval(), getScanRate()
這些函數可以設定截圖間隔或頻率。間隔是頻率的倒數
例如要設定每四秒截圖一次,可以用下列兩者之一
getScanInterval() and getScanRate() 返回對應的數值 return the corresponding values.
注意: 這些Scan 相關函數在試用版裡是時間限定的
setBrightness(value), getBrightness()
設定與獲得螢幕亮度,value 需要為0~255 的整數
注意: setBrightness函數在試用版裡是時間限定的
getNetworkTime()
返回網路時間伺服器的時間(long)
請參照下列網頁來了解lua 裡時間表示方式
www.twblogs.net/a/5bf588ccbd9eee37a1434111
注意: 在lua裡網路時間是以秒為單位,但getNetworkTime() 是以微秒為單位
您可以使用下列腳本將網路時間轉換成當地時間
scriptExit(String message)
立刻跳出腳本,並將message 秀在結果對話框中
setStopMessage(String message)
當腳本結束時(不論是正常結束,手動結束,遇到scriptExit() 或是因為例外),會將message秀在結果對話框中
如果多次呼叫此函數,新的message 值會蓋掉舊的
此函數可以用來秀腳本最終結果
例如,下面腳本只會再對話框出現 "Win 2, lose 0".
typeOf()
因為lua 判斷變數類別的type()函數已經被拿來用在輸入字串到螢幕上了
如果需要判斷變數類別 可以改用typeOf()
或者可以利用下列方式將type() 改回lua 原本用途,並將輸入字串改成keyin()
chargerConnected()
返回USB充電線是(true)否(false)插上。
batteryLevel()
返回電池目前剩餘電量百分比(1~100)。
isEmulator()
返回裝置是(true)否(false)為模擬器。
startApp(String packageName)
killApp(String packageName)
執行(startApp)或停止(killApp) package name 為 packageName 的App.
Package name 是google play 裡App 網址在id 後的字串
例如, AnkuLua 試用版網址為
play.google.com/store/apps/details?id=com.appautomatic.ankulua.trial
package name 就是 com.appautomatic.ankulua.trial
startApp("com.appautomatic.ankulua.trial")
注意: startApp函數在試用版裡是時間限定的
unzip(String fileName[, String directory [, String encoding])
將檔案fileName 解壓縮到目錄directory;如果指定encoding 則會將解壓出的檔名以encoding 方式編碼
directory: 解壓的目地目錄;如果沒提供,則解壓到執行腳本所在目錄
一般建議檔名只用英文,不要有其他文字;如果您使用了繁體中文檔名,encoding 可以設為BIG5
isRecoveredFromKilled()
檢查是否從被Android殺掉並自動重新開始執行腳本,如果是將返回true,否則返回false
如果是從被Android殺掉而自動執行腳本,dialogShow()和dialogShowFullScreen()將不會等待使用者回復
而是直接使用前次設定值 (不是預設值)
setRecoveredFromKilled()
強制設定成被Android殺掉並自動重新開始執行腳本
可以用來測試這種情形下腳本是否可以正常執行
halfCompareDimension()()
檢查是否腳本是在一半比較維度下執行,如果是返回true
網路相關函數
setHttpTimeout(Int seconds)
設定網路連結超時時間,預設值為三秒
注意: 若要使用下列網路相關函數,使用者必須先在設定裡啟用網路相關函數
httpGet(String url)
httpGet() 會返回url網頁的字串
httpPost(String url, Table param)
httpPost() 會以Post方式與網站溝通
參數須要建立於表格
關於Get 與Post 的差異,請自行google
httpDownload(String url, String fileName)
httpDownload() 會下載url 指定的檔案並儲存到指定的檔案
openUrl(String url)
openUrl() 會使用瀏覽器(預設Chrome)開啟 url
注意: openUrl() 會詢問使用者是否要拜訪 url 網站,腳本也會停止
sendEmail(String subject, String message)
sendEmail() 會發送email 到設定裡的接收者
email 的標題和內容由參數設定
使用前清先至AnkuLua 設定裡做適當設定
注意:
* 各email伺服器參數設定請自行google
Gmail 使用者:
* gmail 如果有開啟兩階段認證,請申請應用程式密碼
support.google.com/mail/answer/185833?hl=zh-Hant
* 如果沒有開啟兩階段認證,請"允許低安全性應用程式存取您的帳戶"
myaccount.google.com/lesssecureapps
setExceptionEmail(String subject, String message)
setExceptionEmail() 會再腳本發生Exception 停止時發送email
email 內容除了函數設定以外,也會一併將對話框訊息寄出
和sendEmail 一樣,使用前清先至AnkuLua 設定裡做適當設定
setRewardAccount(String rewardAccount)
setRewardAccount() 設定使用Pro2執行腳本時,會將執行時間的十分之一給予帳號授權,當作獎勵。
獎勵要符合下列條件才會發生
1. 執行腳本的app 不可以是試用版AnkuLua
2. 獎勵帳號必須與執行腳本的帳號不同
3. 獎勵帳號必須還有授權。如果獎勵帳號有多個未到期授權,AnkuLua 伺服器會自動延長最近到期的授權。
[下一頁]: 編譯腳本
[上一頁]: 使用者介面函數
[首頁]: AnkuLua介紹
zoom(pt1StartX, pt1StartY, pt1EndX, pt1EndY, pt2StartX, pt2StartY, pt2EndX, pt2EndY, step)
代表已指定的step次數,一根手指從 (pt1StartX, pt1StartY) 移動到 (pt1EndX, pt1EndY) 的同時,另一根手指從 (pt2StartX, pt2StartY) 移動到(pt2EndX, pt2EndY)
例如,下面腳本會縮小畫面(zoom out)
-- ========== Settings ================
Settings:setCompareDimension(true, 1280)
Settings:setScriptDimension(true, 1280)
-- ========== main program ===========
zoom(50, 350, 330, 350, 1200, 350, 350, 350, 300)
continueClick(x, y, xRandom, yRandom, times)
該函數將連續點擊(X,Y)到(X + xRandom,Y + yRandom)這一範圍指定的次數。
通常情況下,單擊函數並不快。
如果你真的想在某個區域內快速點擊,使用continueClick函數。
local p = find("target.png")
continueClick(p:getX(), p:getY(), 1, 1, 100)
請參考腳本 Tap Titans Click
continueClick(PSMRL, times [,timeout])
函數continueClick還支持PSRML和timeout參數。
沒有返回值。
continueClick可以被直接呼叫,或是由Region呼叫。
continueClick 的時間行為可以藉由setContinueClickTiming設定
setContinueClickTiming(downMs, intervalMs)
int downMs: 按下幾毫秒
int intervalMs: 相鄰的click 間隔幾毫秒
continueMultiTouch(table of PSMRL, times [,timeout])
這個函數可以拿來模擬multi touch,他會輪流點擊PSMRL table 裡的每一個物件,每一個分別點擊times 次
如果是PS (Pattern 或 String),則每一個會搜尋 timeout 時間
如果不給timeout值,則會搜尋默認時間
continueMultiTouch不支援由Region呼叫
continueMultiTouch的時間行為同樣由setContinueClickTiming設定
-- example for calculator plus
png7 = find("7.png")
loc1 = find("1.png"):getTarget()
list = {Pattern("6.png"), png7, "8.png", loc1}
continueMultiTouch(list, 2)
-- the result is 67816781
longClick(PSMRL [,seconds])
stopLongClick()
函數longClick會持續按住目標;如果提供時間(seconds)參數,會按住指定秒數。
如果沒有秒參數,該longClick將持續至下一個觸摸相關命令或stopLongClick() 。
longClick("target.png", 2) -- target will be clicked for 2 seconds
longClick("target.png") -- target will be clicked and the click last
-- do anything except touch related methods
--
stopLongClick() -- now the click on target is released
longClick("target.png") -- target will be clicked and the click last
click("target2.png") -- click on target is reatarget2 is clicked
numberOCR( region, imagePrefix)
numberOCR函數會對region 區域做基本的數字 OCR
這些數字的圖形被命名為imagePregix0.png,imagePrefix1.png ... imagePrefix9.png,並儲存在文件夾image 中
若region內沒有任何數字,則會丟出exception
參考 Heroes Charge: Booty Cave.
可以看到在第15行中
local p = numberOCR(r,"power")
數字圖形 power0.png,power1.png ... power9.png儲存在子文件夾中image 。numberOCRNoFindException(region, imagePrefix)
功能與numberOCR 相同,但是如果region 內找不到任何數字不會丟exception
同時,此函數返回兩個值,第一個同樣是辨識到的數字,第二個則是成功與否的布林值(成功為true)
charOCR( region, charTable)
numberOCR函數會對region 區域做基本的數字 OCR
腳本需要提供一個圖檔和文字對應的表格
如果region內找不到文字,則會丟出exception.
範例如下
local charTable = { {target = "a.png", char = "a"},
{target = "A.png", char = "A"},
{target = "b.png", char = "b"},
{target = "B.png", char = "B"},
} -- add as many as you want
string = charOCR(reg, charTable)
charOCRNoFindException(region, imagePrefix)
功能與charOCR 相同,但是如果region 內找不到任何數字不會丟exception
此函數返回兩個值,第一個同樣是辨識到的字串,第二個則是成功與否的布林值(成功為true)
getColor(PSMRL [, seconds])
這個函數會傳回目標位置的R, G, B 三個顏色值
為了更好的效率,AnkuLua 在做圖形辨識前會先將圖轉成灰階
因此,AnkuLua 無法辨識一個圖是不是彩色
但是,在有些遊戲裡,一個按鈕很可能只是變成灰色來代表另一個意思
這時候,我們就能用這個函數來檢查是否為彩色
r, g, b = getColor("target.png")
if (r == b and r == g) then -- it's grayscale
getTouchEvent()
等待使用者碰觸螢幕,並將結果傳回。getTouchEvent() 傳回下列三值
action(string): AnkuLua判斷的使用者動作,可能是 "click"、"longClick"、"swipe"、"dragDrop" 四者之一
location(Location (Table)): 如果action 是"click"或"longClick",傳回點擊位置。如果是"swipe"或"dragDrop",傳回含起始與結束兩個位置的表格
touchList (Table): 實際發生的碰觸資料。表格內每一資料格式為{touchType, time, locaiton}
touchType: 整數值,分別表示落下(1)、舉起(2)、移動(2)
time: 從落下開始算的時間
location: 發生位置
因為AnkuLua 只做簡單判斷,如有需要,腳本可以用touchList做出更複雜的對應
注意:getTouchEvent() 執行是會將螢幕上的碰觸攔截,下層遊戲不會收到;因此腳本需要作適當的處理。
為了讓使用者知道現在腳本是可以接受碰觸的,getTouchEvent()在執行時會將螢幕罩上一成半透明顏色,此以顏色可以用setTouchEventStyle(color)設定,color 的格式是ARGB。
action, locTable, touchTable = getTouchEvent()
print (action)
if (action == "click" or action == "longClick") then
print (locTable)
else
print (locTable[1])
print (locTable[2])
end
for i, t in ipairs(touchTable) do
print (string.format("%s: %fs, %s", t[1], t[2], t[3]:toString()))
end
playMusic(file, loop)
播放該指定音樂檔一次(loop = false),或是在循環播放(loop = true)。此函數僅限專業版。
請將音樂檔放在 music 目錄裡,然後file不必加目錄
playMusic("music.mp3", false)
stopMusic()
停止播放音樂。此函數僅限專業版。
vibrate(seconds)
振動設備指定的時間。此函數僅限專業版。
setVolumeDetect(boolean)
根據布林值啟用或禁用音量檢測。函數isVolumeUp()和isVolumeDown()只有當音量檢測啟用才能正確作用。如果禁用音量檢測,isVolumeUp()和isVolumeDown()始終返回false。
isVolumeUp() and isVolumeDown()
isVolumeUp()和 isVolumeDown()檢查音量改變(包括音樂和鈴聲音量)。此函數僅限專業版。
注意:對於某些設備,第一次按音量鍵只顯示當前的音量,也沒有音量變化。因此,你需要再次按下它才能生效。
setVolumeDetect(true)
while (true) do
if (isVolumeUp()) then toast("Volume up") end
if (isVolumeDown()) then toast("Volume down") end
end
Timer
使用Timer 物件,使用者就可以知道在一段腳本所使用的時間。
Timer 提供以下的方法
set()
重置時間
返回值: 從Timer 建立或上次呼叫set() 到此次set() 所經過的秒數
check()
返回值: 從Timer 建立或上次呼叫set() 到此次set() 所經過的秒數
t = Timer()
wait(1)
print(t:check())
wait(1.2)
print(t:check())
wait(1.3)
print(t:set())
wait(1.5)
print(t:check())
setScanInterval(seconds), setScanRate(frequency), getScanInterval(), getScanRate()
這些函數可以設定截圖間隔或頻率。間隔是頻率的倒數
例如要設定每四秒截圖一次,可以用下列兩者之一
setScanInterval(4)
setScanRate(1/4)
getScanInterval() and getScanRate() 返回對應的數值 return the corresponding values.
注意: 這些Scan 相關函數在試用版裡是時間限定的
setBrightness(value), getBrightness()
設定與獲得螢幕亮度,value 需要為0~255 的整數
注意: setBrightness函數在試用版裡是時間限定的
getNetworkTime()
返回網路時間伺服器的時間(long)
請參照下列網頁來了解lua 裡時間表示方式
www.twblogs.net/a/5bf588ccbd9eee37a1434111
注意: 在lua裡網路時間是以秒為單位,但getNetworkTime() 是以微秒為單位
您可以使用下列腳本將網路時間轉換成當地時間
local temp = os.date("*t", getNetworkTime() / 1000)
print (temp.year)
print (temp.month)
print (temp.day)
print (temp.hour)
scriptExit(String message)
立刻跳出腳本,並將message 秀在結果對話框中
setStopMessage(String message)
當腳本結束時(不論是正常結束,手動結束,遇到scriptExit() 或是因為例外),會將message秀在結果對話框中
如果多次呼叫此函數,新的message 值會蓋掉舊的
此函數可以用來秀腳本最終結果
例如,下面腳本只會再對話框出現 "Win 2, lose 0".
setStopMessage("Win 1, lose 0")
......
setStopMessage("Win 2, lose 0")
scriptExit("Exit")
typeOf()
因為lua 判斷變數類別的type()函數已經被拿來用在輸入字串到螢幕上了
如果需要判斷變數類別 可以改用typeOf()
或者可以利用下列方式將type() 改回lua 原本用途,並將輸入字串改成keyin()
keyin = type
type = typeOf
chargerConnected()
返回USB充電線是(true)否(false)插上。
batteryLevel()
返回電池目前剩餘電量百分比(1~100)。
isEmulator()
返回裝置是(true)否(false)為模擬器。
startApp(String packageName)
killApp(String packageName)
執行(startApp)或停止(killApp) package name 為 packageName 的App.
Package name 是google play 裡App 網址在id 後的字串
例如, AnkuLua 試用版網址為
play.google.com/store/apps/details?id=com.appautomatic.ankulua.trial
package name 就是 com.appautomatic.ankulua.trial
startApp("com.appautomatic.ankulua.trial")
注意: startApp函數在試用版裡是時間限定的
unzip(String fileName[, String directory [, String encoding])
將檔案fileName 解壓縮到目錄directory;如果指定encoding 則會將解壓出的檔名以encoding 方式編碼
directory: 解壓的目地目錄;如果沒提供,則解壓到執行腳本所在目錄
一般建議檔名只用英文,不要有其他文字;如果您使用了繁體中文檔名,encoding 可以設為BIG5
isRecoveredFromKilled()
檢查是否從被Android殺掉並自動重新開始執行腳本,如果是將返回true,否則返回false
如果是從被Android殺掉而自動執行腳本,dialogShow()和dialogShowFullScreen()將不會等待使用者回復
而是直接使用前次設定值 (不是預設值)
setRecoveredFromKilled()
強制設定成被Android殺掉並自動重新開始執行腳本
可以用來測試這種情形下腳本是否可以正常執行
halfCompareDimension()()
檢查是否腳本是在一半比較維度下執行,如果是返回true
網路相關函數
setHttpTimeout(Int seconds)
設定網路連結超時時間,預設值為三秒
注意: 若要使用下列網路相關函數,使用者必須先在設定裡啟用網路相關函數
httpGet(String url)
httpGet() 會返回url網頁的字串
result = httpGet("http://google.com") -- always add the http in url
注意: url 必須以http 或 https 開頭httpPost(String url, Table param)
httpPost() 會以Post方式與網站溝通
參數須要建立於表格
關於Get 與Post 的差異,請自行google
params = {param1="Parameter1", param2="This is parameter 2" }
result = httpPost("http://httpbin.org/post", params)
print (result)
httpDownload(String url, String fileName)
httpDownload() 會下載url 指定的檔案並儲存到指定的檔案
httpDownload("https://www.google.com.tw/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png", "/sdcard/google.png")
openUrl(String url)
openUrl() 會使用瀏覽器(預設Chrome)開啟 url
注意: openUrl() 會詢問使用者是否要拜訪 url 網站,腳本也會停止
sendEmail(String subject, String message)
sendEmail() 會發送email 到設定裡的接收者
email 的標題和內容由參數設定
使用前清先至AnkuLua 設定裡做適當設定
sendEmail("標題", "內容")
注意:
* 各email伺服器參數設定請自行google
Gmail 使用者:
* gmail 如果有開啟兩階段認證,請申請應用程式密碼
support.google.com/mail/answer/185833?hl=zh-Hant
* 如果沒有開啟兩階段認證,請"允許低安全性應用程式存取您的帳戶"
myaccount.google.com/lesssecureapps
setExceptionEmail(String subject, String message)
setExceptionEmail() 會再腳本發生Exception 停止時發送email
email 內容除了函數設定以外,也會一併將對話框訊息寄出
和sendEmail 一樣,使用前清先至AnkuLua 設定裡做適當設定
setExceptionEmail("標題", "內容")
setRewardAccount(String rewardAccount)
setRewardAccount() 設定使用Pro2執行腳本時,會將執行時間的十分之一給予帳號授權,當作獎勵。
獎勵要符合下列條件才會發生
1. 執行腳本的app 不可以是試用版AnkuLua
2. 獎勵帳號必須與執行腳本的帳號不同
3. 獎勵帳號必須還有授權。如果獎勵帳號有多個未到期授權,AnkuLua 伺服器會自動延長最近到期的授權。
setRewardAccount("abc@gmail.com") -- 請將abc@gmail.com 換成您的帳號
[下一頁]: 編譯腳本
[上一頁]: 使用者介面函數
[首頁]: AnkuLua介紹