2011年6月24日 星期五

期末專案:太空軍校生 Windows彈珠台!!

 前陣子整理VMware上安裝的XP時,心血來潮玩個接龍,
忽然注意到這款,僅在XP上內建的微軟小遊戲--windows立體彈珠台。

 還記得小時候逛夜市時 那總能讓小孩子玩得不亦樂乎的整排彈子台??
結合著視訊,現在就來讓大家重新回味一下這款,映入絲絲童年的小遊戲。

Windows彈珠台



視訊主程式畫面

 老師教導的作法是,先擷取建立一張背景圖,
再讓後面的影像做對比來判斷出畫面內有無動作。

 不過個人想說,這種做法受到背景變動的影響很大,
所以寫這程式時,背景圖與對照圖是以時間差的方式在做更新,
因此程式一開始不用擷取背景,直接按一下 Button [Now is Off]
即開始判斷WebCam所拍攝的場景裡,有無東西在動。



 畫面的中間的[Hide],可以隱藏背景組跟對照組,
這時會出現一個框框[Mouse Place],那是執行按鍵輸出功能的判斷開關。
將滑鼠移進那範圍,程式才會開始判斷左右手的舉起與否,
輸出遊戲左右桿動作的指令。

 這算是一個安全鎖的功能,防止不小心跳出遊戲畫面時,
對其他程式亂輸出指令。


 至於視訊程式,對於動作的判斷,因為想要讓動作自由、直覺些 ,
偵測到大動作(如:抬起左手)即作出指令輸出(揮動左桿),
不用緊盯著視訊畫面,一邊猜測那判斷區塊在空中的位置。

 而因為這遊戲指令比較簡單,只需輸出左桿跟右桿的動作,
所以沒有用複雜的計算,就只是判斷黑框的左邊三分之一與右邊三分之一,
其白點所占畫面比例,來判斷是否觸發動作。

 如覺得判斷不靈活,程式右上角[White Point] 可自訂輸入判定百分比例,
讓其判斷更靈敏、或是更穩重。



遊戲與視訊程式執行畫面


實際執行影片


 這次寫作時,卡住了許多地方。
因為研讀老師的範例程式碼不確實,漏掉幾行參數,
結果後面的一些功能怎嚜試都總是出錯,
最後還是花大量時間重新從以前程式碼一步一步做修正與理解...

 至於自己更改的部分功能,像是:背景影像與對照影像的同步更新,
原本是想要把截圖丟進callback function定時截圖,不過試驗失敗,
後來就想到換個方法,連背景部分都是用同步視訊擷取視窗連結,
只要抓好時間差,就可以抓到中間的間隔,判斷出動作。

 白點判定範圍,一開始是想可能要寫大量演算式,
後來想到其實遊戲功能並不複雜,那不如設個參數來統計,
左半與右半邊的白點數量,再設定一個門檻,只要超過就判定有動作輸出,
這部分很快即完成。

 其中弄最久的部分,是個不起眼的keybd_event( x,0,0,0) 輸出鍵盤事件。
剛開始程式寫好後在記事本上做測試,都可以正常執行,
不過換到遊戲上後,不知為何接受到指令後就沒動作了。
最後才注意到,忽略了keybd_event( x,0,KEYEVENTF_KEYUP,0)
鍵盤彈起事件....



結語與期末回顧

 這學期過的散散漫漫,沒有做好學習,弄到最後要寫期末專案,
這邊卡住那邊當機...
 期末專案雖然多是從老師的範例程式修修改改拼拼貼貼過來,
不過總想要試著自己添加些不同的元素,讓其慢慢變成自己的東西。
但真的說要完全自立寫出來,以現在的功力實在是很有待加強,各種方面...
 三十分鐘新增幾個小功能,後面要花三個小時以上Debug,想說
學到的經驗、得到的結論,大概不是什嚜Debug、寫作的技巧,
而是對學習態度的懺悔...
 一邊感謝著老師平日的教導、同學的幫忙,
(尤其謝謝李翼豪學同學,李大師細心指導哀!!)
沒有這些幫助這個總結整學期精華的作品恐怕沒辦法這嚜順利生產出來;
(雖然其實也沒多順利...)
一邊也總要反省:是不是該好好認真了,再這樣混下去,問題可會不少....

沒有留言: