遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本?

遊戲掛機一段時間,號子上的揹包滿了怎麼辦?我們需要清理揹包,該分解的分解該賣的賣。

清理揹包第一步:遍歷揹包

     第二步:判斷揹包格里是否有物品

     第三步:判斷物品的名稱等級

     第四步:執行清包操作。

具體該怎麼操作呢?我們一起來學習下。

工具/原料

按鍵精靈2014

方法/步驟

第一步:單重循環搞定揹包遍歷

遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本

以dnf遊戲為例,小編的號,揹包格數是 8*4 總共32格

單重循環遍歷大致思路:

1、取第一格揹包的中心點座標。

2、獲取一格揹包的寬度和高度是多少。

3、 遍歷公式:第二格揹包中心x座標=揹包第一格中心X座標 + (2 mod 揹包總列數) * 每格寬

第二格揹包中心y座標=揹包第一格中心Y座標 + (2\ 揹包總列數) * 每格高

注意:為什麼x座標添加的每隔寬用 mod取餘呢? 因為揹包橫向走的時候,x座標是在變化,而揹包豎向走的時候,也就是從第一行最後一格跳轉到第二行第一格的時候,x座標是不變的。如圖:

遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本

單重循環遍歷揹包代碼:

Call 橫向自上往下揹包遍歷(1, 32, 8, 489, 277, 30, 30)//調用揹包遍歷

Sub 橫向自上往下揹包遍歷(開始格數,結束格數,揹包總列數,揹包第一格中心X座標,揹包第一格中心Y座標,每格寬,每格高)

For i = 開始格數-1 To 結束格數-1 //因為數組下標是0起始,所以這裡開始格數要減去1

MoveTo 揹包第一格中心X座標 + (i mod 揹包總列數) * 每格寬, 揹包第一格中心Y座標 + (i \ 揹包總列數) * 每格高

TracePrint (揹包第一格中心X座標 + (i mod 揹包總列數) * 每格寬)&","&(揹包第一格中心Y座標 + (i \ 揹包總列數) * 每格高)

Delay 500

//移動到這格後,這裡寫你在這格要做的事情的代碼

Next

End Sub

第二步:判斷當前揹包格子裡是否有物品

遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本

遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本

我們觀察上面兩張圖,如果格子裡沒有物品,鼠標移動上去之後是沒有物品屬性顯示的。所以,裝備兩個字可以看見。如果格子裡有物品,那麼裝備兩個字就會被遮擋。(遊戲裡不變的參照物是很多的,童鞋們也可以取其他的參照物來代替裝備兩個字)

好了,我們發現這個特點之後,就可以進行判斷,找到裝備兩個字就說明格子裡沒有物品,反之則有物品。

小編使用的是,大漠插件來找字。

首先,建立一個字庫。DNF遊戲的字體是系統字體,小編的系統是宋體9號字。

遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本

然後,按照圖裡的步驟建立好字庫以後,將字庫文件添加到按鍵精靈附件中。

判斷當前揹包是否有物品代碼:

Call 橫向自上往下揹包遍歷(1, 32, 8, 489, 277, 30, 30)//調用揹包遍歷

Sub 橫向自上往下揹包遍歷(開始格數,結束格數,揹包總列數,揹包第一格中心X座標,揹包第一格中心Y座標,每格寬,每格高)

For i = 開始格數-1 To 結束格數-1//因為數組下標是0起始,所以這裡開始格數要減去1

j=j+1//記錄當前遍歷到的格數

MoveTo 揹包第一格中心X座標 + (i mod 揹包總列數) * 每格寬, 揹包第一格中心Y座標 + (i \ 揹包總列數) * 每格高

TracePrint (揹包第一格中心X座標 + (i mod 揹包總列數) * 每格寬)&","&(揹包第一格中心Y座標 + (i \ 揹包總列數) * 每格高)

Delay 500

w = dm.Ocr(478, 238, 511,253,"ffffb8",1.0)

If w= "裝備" Then //找裝備字眼,如果沒有找到,說明揹包格子裡有東西

TracePrint "第"& j & "格沒物品"

Else

TracePrint "第" & j & "格有物品"

End If

Next

End Sub

第三步,判斷物品名稱

要如何判斷物品名稱呢?遍歷揹包的時候,發現格子裡有物品的時候,我們開始判斷物品的名稱。但是,這些物品的屬性窗口並不是固定顯示在一個地方

遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本

遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本

細心的童鞋很快就能發現,這裡的物品屬性框有兩種,一種顯示的是當前物品的信息,一種顯示的是角色現在穿戴物的物品屬性。

而且,“穿戴中的物品"這幾個字是沒有變化的

遊戲輔助:用按鍵精靈製作DNF遍歷揹包賣物腳本

判斷物品名稱大致思路:

1、 用大漠插件找字,找“穿戴中的物品” 這幾個字,找到之後記錄它的座標值。所以這裡不使用dm.ocr找字,使用dm.FindStr來找字。

拓展知識:dm.ocr找字,是在你不知道要找什麼字的情況下,通過定義查找範圍和字體顏色去找字,返回值就是找到的文字。

dm.FindStr找字,是你知道你要找什麼字,然後定義查找範圍和字體顏色去找字,返回值是文字所在的座標。

2、 通過“穿戴中的物品”這幾個字所在的座標,計算物品名稱的出現的範圍。

3、 用dm.ocr找字在獲取到的物品名稱範圍內進行找字。

4、 找到之後,可以繼續查找物品的其他屬性,耐久屬性等等,來判斷出售分解還是其他,由於種類很多,小編就不寫這類代碼了。

注意:如果身上並沒有穿戴裝備,那麼物品屬性就只會顯示當前物品屬性,“穿戴中的物品”這幾個字無法找到,這樣的情況可以在代碼裡繼續做判斷,找不到“穿戴中的物品”時,可以去找物品重量後面的單位KG(為什麼前面不找KG呢?因為當有兩個物品屬性窗口的時候,當前物品屬性窗口和穿戴中的物品屬性窗口中都有KG字樣,有兩個的話,就無法確定位置。)

全部代碼:

call register()

PutAttachment "G:\test", "DNF.txt" //釋放字庫文件到G:\test文件夾裡

dm_ret = dm.SetDict(0, "G:\test\DNF.txt") //加載字庫文件

hwnd= Plugin.Window.Find("地下城與勇士", 0)

Call Plugin.Window.Size(hwnd,800,600)

Call Plugin.Window.move(hwnd, 0, 0)

Call Plugin.Window.Active(hwnd)

Delay 1000

KeyPress "I", 1

Call 橫向自上往下揹包遍歷(1, 32, 8, 489, 277, 30, 30)//調用揹包遍歷

Sub 橫向自上往下揹包遍歷(開始格數,結束格數,揹包總列數,揹包第一格中心X座標,揹包第一格中心Y座標,每格寬,每格高)

For i = 開始格數 - 1 To 結束格數 - 1

j=i+1

MoveTo 揹包第一格中心X座標 + (i mod 揹包總列數) * 每格寬, 揹包第一格中心Y座標 + (i \ 揹包總列數) * 每格高

TracePrint (揹包第一格中心X座標 + (i mod 揹包總列數) * 每格寬)&","&(揹包第一格中心Y座標 + (i \ 揹包總列數) * 每格高)

Delay 500

w = dm.Ocr(478, 238, 511,253,"ffffb8",1.0)

If w= "裝備" Then //找裝備字眼,如果沒有找到,說明揹包格子裡有東西

TracePrint "第"& j & "格沒物品"

Else

TracePrint "第" & j & "格有物品"

dm_ret = dm.FindStr(423, 22, 771, 342, "穿戴中的物品", "e8cda4", 1.0, intX, intY)//查找穿戴中的物品,找到之後獲取它的座標,以它的座標為基點去找當前物品的名稱。

If intX >= 0 and intY >= 0 Then

s = dm.Ocr( intX-300,intY,intX-60,intY+50, "68d5ed b36bff", 1.0)//藍色裝備和粉色裝備都找

MessageBox s

End if

End If

Next

End Sub

Sub register() //註冊大漠

Set ws = createobject("Wscript.Shell")

ws.run "regsvr32 atl.dll /s"

Set ws = nothing

PutAttachment "G:\test", "dm.dll"

PutAttachment ".\Plugin" ,"RegDll.dll"

call Plugin.RegDll.Reg ( "G:\test\dm.dll")

Set dm = createobject("dm.dmsoft")

ver = dm.ver()

If len(ver) = 0 Then

MessageBox "插件註冊失敗,檢查系統是否禁用了vbs腳本權限"

EndScript

End If

End Sub

物品, 腳本, 按鍵精靈, 揹包,
相關問題答案