開發中的自動化——按鍵精靈&AutoIt
遊戲開發中經常需要釋出版本給策劃測試,可以用svn或者ftp等來做為檔案傳輸的渠道。
我們這邊的流程一般如下:
1、在flash builder構建釋出版本。
2、用Beyond Compare(檔案對比工具)對比釋出目錄和策劃測試目錄裡面的程式,並且把新的檔案拷貝到測試目錄中。
3、對比遊戲資源目錄和策劃測試資源目錄,並且把新的資源拷貝過去。
4、提交測試目錄到svn。
這其中第1步有3次滑鼠操作和等待時間,第2步中有3次滑鼠操作和較短等待時間,第3步和第2步滑鼠操作一樣,但如果資源多的話就要等很久了。
每次都這樣點還要等太煩了,一鍵操作多方便的啊。
按鍵精靈被很多人用來做輔助程式,當然拿來做點自動化的小工具還是不錯的選擇。2011年的時候同事用按鍵精靈來處理flash cs做介面處理的重複操作,當時他並沒有編寫指令碼,而是用的錄製巨集的方式來處理的,實際中讓巨集迴圈執行時,還藉助了記事本來提供一些資料。
開始接觸AutoIt是大概2010年左右,原本想找一個類似shell的指令碼,來幫助我在編譯動態庫生成後拷貝檔案後,再提交svn。轉換動畫檔案轉換後自動拷貝資源,並且提交svn。但看到autoit語法太麻煩了還是沒有弄。
先用按鍵精靈實現了一個版本,要求flash builder和beyond compare已經啟動。如果讓指令碼來啟動程式再操作,感覺太麻煩了,還要配置路徑(同事電腦上面路徑可能不一樣),就手動先讓程式都跑起來。在beyond compare中選擇資料夾同步時是根據座標計算的,用文字識別來肯定好些,但是麻煩啊~
這個按鍵精靈的版本在2個同事電腦上面測試,一個正常一個不正常,估計是電腦計時引起的差異。用按鍵精靈可以直接用指令碼檔案跑,不必匯出小精靈,匯出小精靈還有廣告。有廣告太煩了,所以又用autoit照著寫了個。
[General] SyntaxVersion=2 BeginHotkey=121 BeginHotkeyMod=0 PauseHotkey=0 PauseHotkeyMod=0 StopHotkey=123 StopHotkeyMod=0 RunOnce=1 EnableWindow= MacroID=f3353dc6-1d9e-4d6d-abb5-77b2fcda5516 Description=同步到test Enable=1 AutoRun=0 [Repeat] Type=0 Number=1 [SetupUI] Type=2 QUI= [Relative] SetupOCXFile= [Comment] 【功能說明】 釋出程式時一鍵操作讓flash builder釋出版本,然後同步到test目錄 【使用說明】 先把flash builder和Beyond Compare開啟,然後執行等待完成就可以提交了 [Script] Call 構建釋出版() Call test同步() MessageBox "同步test完成" ///////////////////////////////////////////////////////////////////////////////////////// //構建釋出版 Sub 構建釋出版() HwndEx = Plugin.Window.Search("Flash Builder") MyArray = Split(HwndEx, "|") If UBound(MyArray)>=0 Then Hwnd = Clng(MyArray(0)) Call Plugin.Window.Max(Hwnd) Delay 100 Call Plugin.Window.Active(Hwnd) Delay 100 sRect = Plugin.Window.GetClientRect(Hwnd) MyArray = Split(sRect, "|") W1 = Clng(MyArray(0)) : H1 = Clng(MyArray(1)) // MsgBox "邊框大小: " & W1 & " " & H1 //選擇匯出 MoveTo W1+385, H1+15 Delay 100 LeftClick 1 Delay 100 //開始匯出 Do While True DochuHwnd = Plugin.Window.Foreground() If DochuHwnd <> Hwnd Then Delay 500 Exit Do End If Delay 100 Loop // sText = Plugin.Window.GetText(DochuHwnd) // MsgBox sText sRect = Plugin.Window.GetClientRect(DochuHwnd) MyArray = Split(sRect, "|") DochuW1 = Clng(MyArray(0)) : DochuH1 = Clng(MyArray(1)) // MsgBox "邊框大小:" & DochuW1 & "," & DochuH1 MoveTo DochuW1+475, DochuH1+630 Delay 100 LeftClick 1 Delay 100 //檢測匯出是否完成 Do While True WanchengHwnd = Plugin.Window.Foreground() If WanchengHwnd <> DochuHwnd Then Delay 500 Exit Do End If Delay 100 Loop sRect = Plugin.Window.GetClientRect(WanchengHwnd) MyArray = Split(sRect, "|") WanchengW1 = Clng(MyArray(0)) : WanchengH1 = Clng(MyArray(1)) // MsgBox "邊框大小:" & WanchengW1 & "," & WanchengH1 MoveTo WanchengW1+372, WanchengH1+134 Delay 500 LeftClick 1 Delay 100 Else Msgbox "未啟動flash builder" EndScript End If End Sub //同步資料夾 Sub 同步資料夾() Delay 100 //等待進入同步介面選擇同步 Do While True GetColor = GetPixelColor(W1 + 19, H1 + 41) //MsgBox W1 & H1 & GetColor If GetColor = "40D0FF" Then Delay 500 Exit Do End If Delay 100 Loop //MsgBox "開始同步" //等待對比同步完成 Do While True GetColor=GetPixelColor(W1+22, H1+308) If GetColor <> "2B53FD" Then Delay 500 Exit Do End If Delay 100 Loop // MsgBox "對比完成" //判斷是否需要同步 GetColor = GetPixelColor(W1 + 1267, H1 + 347) If GetColor = "2BBF6D" Then Delay 500 //點選同步 MoveTo W1 + 1267, H1 + 347 Delay 100 LeftClick 1 Delay 100 //等待同步完成 Do While True GetColor=GetPixelColor(W1+15, H1+462) If GetColor = "82DAF4" Then Delay 500 //MsgBox "同步完成" Exit Do End If Delay 100 Loop End If Delay 100 //返回 MoveTo W1+19, H1+41 Delay 100 LeftClick 1 Delay 100 End Sub Sub test同步() //對檔案進行拷貝 HwndEx = Plugin.Window.Search("Beyond Compare") MyArray = Split(HwndEx, "|") If UBound(MyArray)>=0 Then Hwnd = Clng(MyArray(0)) Call Plugin.Window.Max(Hwnd) Delay 100 Call Plugin.Window.Active(Hwnd) Delay 100 // sRect = Plugin.Window.GetWindowRect(Hwnd) sRect = Plugin.Window.GetClientRect(Hwnd) MyArray = Split(sRect, "|") W1 = Clng(MyArray(0)) : H1 = Clng(MyArray(1)) //確保在最開始介面返回 MoveTo W1+19, H1+41 Delay 100 LeftClick 1 Delay 100 //同步test程式 MoveTo W1+367, H1+444 Delay 100 LeftClick 1 Delay 20 LeftClick 1 Delay 100 Call 同步資料夾() //同步test資源 MoveTo W1+354, H1+427 Delay 100 LeftClick 1 Delay 20 LeftClick 1 Delay 100 Call 同步資料夾() Else Msgbox "未啟動Beyond Compare" EndScript End If End Sub
autoit版本的滑鼠移動是有軌跡移動的,不是瞬移,在按鍵的時候應該會好些。匯出一個exe隨便哪都可以用了。
;同步到test
BuildRelease()
SyncTest()
MsgBox(0,"提示","同步test完成")
;構建發行版本
Func BuildRelease()
Local $hwnd = WinGetHandle("[REGEXPTITLE:[\s\S]+Flash Builder]")
;MsgBox(0, "Details", WinGetTitle($hwnd))
If $hwnd <> "" Then
WinSetState($hwnd, "", @SW_MAXIMIZE)
Sleep(100)
WinActivate($hwnd)
Sleep(100)
Local $size = WinGetPos($hwnd)
;MsgBox(0, "Active window stats (x,y,width,height):", $size[0] & " " & $size[1] & " " & $size[2] & " " & $size[3])
Local $x=$size[0]
Local $y=$size[1]
;選擇匯出
MouseMove($x+396, $y+65,5)
Sleep(100)
MouseClick("left")
Sleep(100)
;開始匯出
WinWaitActive("匯出發行版")
$hwnd = WinGetHandle("匯出發行版")
;//MsgBox(0,"控制代碼",$hwnd)
$size = WinGetPos($hwnd)
$x=$size[0]
$y=$size[1]
MouseMove($x+473, $y+659,5)
Sleep(100)
MouseClick("left")
;檢測匯出是否完成
WinWaitNotActive($hwnd)
Local $wanchen = WinGetHandle("匯出發行版")
;//MsgBox(0,"控制代碼",$wanchen)
$size = WinGetPos($wanchen)
$x=$size[0]
$y=$size[1]
MouseMove($x+374, $y+167,5)
Sleep(100)
MouseClick("left")
Sleep(500)
Else
MsgBox(0,"錯誤","未啟動flash builder")
Exit
EndIf
EndFunc
;同步資料夾
Func SyncDir($x,$y,$hwnd)
;//等待進入同步介面選擇同步
Do
Sleep(100)
Local $Color=PixelGetColor($x+27, $y+71,$hwnd)
;MsgBox(0,"color",Hex($Color,6))
Until $Color==0xffd040
;//等待對比同步完成
Sleep(500)
Do
Sleep(100)
$Color=PixelGetColor($x+30, $y+338,$hwnd)
Until $Color<>0xfd532b
;//判斷是否需要同步
Sleep(500)
$Color=PixelGetColor($x+1275, $y+377,$hwnd)
If $Color==0x6dbf2b Then
;//點選同步
MouseMove($x+1275, $y+377,5)
Sleep(100)
MouseClick("left")
Sleep(500)
;//等待同步完成
Do
Sleep(100)
$Color=PixelGetColor($x+23, $y+492,$hwnd)
Until $Color==0xf4da82
EndIf
;//返回
MouseMove($x+27, $y+71,5)
Sleep(100)
MouseClick("left")
Sleep(100)
EndFunc
;test同步
Func SyncTest()
Local $hwnd = WinGetHandle("[REGEXPTITLE:[\s\S]+Beyond Compare]")
;MsgBox(0, "Details", WinGetTitle($hwnd))
If $hwnd <> "" Then
WinSetState($hwnd, "", @SW_MAXIMIZE)
Sleep(100)
WinActivate($hwnd)
Sleep(100)
Local $size = WinGetPos($hwnd)
;MsgBox(0, "Active window stats (x,y,width,height):", $size[0] & " " & $size[1] & " " & $size[2] & " " & $size[3])
Local $x=$size[0]
Local $y=$size[1]
;//確保在最開始介面返回
MouseMove($x+27, $y+71,0)
Sleep(100)
MouseClick("left")
Sleep(100)
;//同步test程式
MouseMove($x+375, $y+474)
Sleep(100)
MouseClick("left")
Sleep(20)
MouseClick("left")
Sleep(100)
SyncDir($x,$y,$hwnd)
;//同步test資源
MouseMove($x+362, $y+457)
Sleep(100)
MouseClick("left")
Sleep(20)
MouseClick("left")
Sleep(100)
SyncDir($x,$y,$hwnd)
Else
MsgBox(0,"錯誤","未啟動Beyond Compare")
Exit
EndIf
EndFunc
現在用著速度比人手工快多了。以後再也不用擔心釋出了~