1. 程式人生 > >開發中的自動化——按鍵精靈&AutoIt

開發中的自動化——按鍵精靈&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

現在用著速度比人手工快多了。以後再也不用擔心釋出了~