開發(fā)環(huán)境
電腦:Windows 或 Mac
軟件:Lua 編輯器、抓色器(可以在官網(wǎng)下載)
手機(jī):觸動(dòng)精靈(iOS 或者安卓都可以)
工作原理
抓色器遠(yuǎn)程連接手機(jī)截圖,找到坐標(biāo)點(diǎn)和顏色值,作業(yè)部落上有使用教程。(https://www.zybuluo.com/miniknife/note/629913)。
通過 Lua 實(shí)現(xiàn)模擬點(diǎn)擊
網(wǎng)上分享的帖子不管是 python 還是其他語言基本都是安卓平臺(tái)的,其實(shí) iOS 也可以用 Lua 模擬點(diǎn)擊實(shí)現(xiàn)跳一跳自動(dòng)輔助。
前提是你的 iPhone 越獄了。
步驟:
- 安裝抓色器(用來截圖取點(diǎn))
- 越獄手機(jī)添加源:apt.touchsprite.com,安裝觸動(dòng)精靈
- 在手機(jī)上截取跳一跳界面,也可以用抓色器遠(yuǎn)程截圖:打開觸動(dòng)更多界面的局域網(wǎng)廣播開關(guān),手機(jī)和電腦在同一局域網(wǎng)就可以
-
在抓色器上打開截圖,鼠標(biāo)放到小人的底部中心點(diǎn),同時(shí)按下 CTRL 和鼠標(biāo),在周圍也取兩個(gè)點(diǎn)抓色器
- 生成代碼,插入到下面的代碼中(可以用觸動(dòng)精靈的編輯器,遠(yuǎn)程調(diào)試比較方便)
-
編輯器設(shè)備標(biāo)簽頁搜索連接設(shè)備(也要在同一個(gè)局域網(wǎng)),打開腳本點(diǎn)擊遠(yuǎn)程運(yùn)行(需要提前進(jìn)入游戲界面)
編輯器
代碼:
local screenWidth, screenHeight= getScreenSize();--獲取屏幕分辨率
local distanceTimeRate = 1.15--按壓時(shí)間與距離的系數(shù),數(shù)字越大表示蓄力時(shí)間越長,當(dāng)前為 6P 的系數(shù)local
local targetPositionOffset = screenHeight * 0.012--表示方塊最上方的點(diǎn),距離中心點(diǎn)的偏移
function Touch(x, y, millsSecond)
touchDown(x, y)
mSleep(millsSecond)
touchUp(x, y)
end
function main()
-- dialog("請?jiān)?秒內(nèi)打開游戲,并點(diǎn)擊開始按鈕", 0);
mSleep(1000)
DoLoop()
end
function DoLoop()
while true do
keepScreen(true);
if DoJump() == false then
keepScreen(false);
break
end
keepScreen(false);
mSleep(2000)
end
end
function DoJump()
local x, y = GetCalcSelfPosition()
if x == -1 or x == 0 then
return false
end
local endX = screenWidth-3 -- 1080 1920
local endY = screenHeight * 0.7
local startX = 0
local startY = screenHeight * 0.2
if x < screenWidth / 2 then
startX = screenWidth / 2
else
endX = screenWidth / 2
end
local targetX, targetY = GetTargetPosition(startX, startY, endX, endY)
local distance = math.sqrt( (x - targetX) * (x - targetX) + (y - targetY) * (y - targetY) )
local pressTime = CalcHoldTime(distance)
Touch(100,100, pressTime)
return true
end
function GetCalcSelfPosition()
x,y = findMultiColorInRegionFuzzy( 0x373860, "-2|-214|0x34353d,-42|-2|0x2b2b49,40|-4|0x393550", 98, 0, 0, screenWidth, screenHeight) -- 6p
-- x,y = findMultiColorInRegionFuzzy( 0x38365e, "-16|-6|0x35335a,13|-5|0x39375f", 98, 0, 0, screenWidth, screenHeight)
return x, y
end
function GetTargetPosition(startX, startY, endX, endY)
local step = 3
local r, g, b, rr, gg, bb
for y = startY , endY, step do
r, g, b = getColorRGB(1, y)
for x = startX, endX , step do
rr, gg, bb = getColorRGB(x, y)
if isColor(r, g, b, rr, gg, bb, 98) then
r = rr
g = gg
b = bb
else
return x, y + targetPositionOffset
end
end
end
return -1, -1
end
function isColor(rr, gg, bb, r, g, b ,s)
local fl,abs = math.floor,math.abs
s = fl(0xff*(100-s)*0.01)
if abs(r-rr)<s and abs(g-gg)<s and abs(b-bb)<s then
return true
end
return false
end
function CalcHoldTime(distance)
return distance * distanceTimeRate
end
main()
如果腳本跑的并不準(zhǔn)確,可以修改參數(shù)
distanceTimeRate:數(shù)字越大表示蓄力時(shí)間越長
targetPositionOffset:表示方塊最上方的點(diǎn),距離中心點(diǎn)的偏移
如果還是不行的話,那就算了吧...
思路
- 確定自己的當(dāng)前位置
直接查找像素就可以了 - 確定目標(biāo)點(diǎn)位置
可以通過自己當(dāng)前的位置判斷一個(gè)大致的范圍。
然后通過從左上,到右下角,依次遍歷像素。找到方塊最上方的像素點(diǎn)。
然后把y + 上一個(gè)大概的值來確定。 - 距離與時(shí)間轉(zhuǎn)換
游戲的公式是線性的,直接乘以系數(shù)就可以了
需要優(yōu)化的點(diǎn)
- 并沒有去精確的識(shí)別位置
- sleep 函數(shù)并不精確,需要一個(gè)更加精確的方式來控制
- 不同分辨率的屏幕,并沒有做完美的適配,需要各自截圖取小人底部的坐標(biāo)
- 距離時(shí)間的比率,不應(yīng)該粗暴的用一個(gè)值去控制,應(yīng)該用兩個(gè)值去分別乘以x,y的距離,然后再算距離(這得看游戲畫面本身的屏幕適配是如何做的)
- 性能差的機(jī)型,跑得并不穩(wěn)定(我用紅米2,跑了大概10次,最高跑到2000多分,最低只跑了幾百分),這有一部分是因?yàn)椤皟?yōu)化點(diǎn) 1”導(dǎo)致的。
本文源碼和原理參考自知乎 xtutu