2014年6月27日 星期五

互動遊戲製作期末專案


這學期互動遊戲製作課的期末專案,
原本想說要做海帶拳電腦版,
因為之前另一堂媒體課做了猜拳電腦版,

可是開始製作後,
發現全身動作判斷的方法太複雜了,
後來決定改做
「雷電」
但在製作過程中發生太多問題,
遊戲過程會非常非常的延遲,
但最後有解決(後面討論),
卻又因為遊戲難度過高!
所以又臨時將遊戲改成這款經典遊戲
「敲兔子」



上面是控制程式的介面,

使用方式:
點選下方[Background Setting]
會截取30個畫面的平均圖

之後點選[Start Control]
即開始偵測與控制


勾選 8*8mode 可看到色彩差異辨識圖
(如下圖)




這次做這個專案最大的程式經驗收穫就是以下要討論的,

keybd_event(VK_RIGHT, 0, 0, 0);
keybd_event(VK_RIGHT, 0, KEYEVENTF_KEYUP, 0);

上面兩個指令分別是按下按鍵(下面簡稱(按))
以及放開按鍵(下面簡稱(彈))

最大的問題就是發生在這兩個按鈕

正常來說

if(條件){  (按) ;  (彈)  }

對於我一開始的理解是很快速的按了一個按鈕馬上放開,
但是我程式執行後,

不管怎樣我要控制的應用程式就是不理我,
但是程式本身沒有問題,
每行指令都有去執行到,

後來發現在執行過程中,
對電腦來說這個按加彈的速度,
已經快到對於程式來說完全沒意義,

所以 之後用了老師講的方法,

if(條件){  (按) ; Sleep(50) ; (彈) ; }

在彈按之間加入程式延遲指令,
執行後,
沒錯成功了!!
但是玩了雷電,
飛機每個動作後都會持續一段時間才可以繼續下一個動作,

但這樣在遊戲過程中非常不合理,
於是將Sleep()調到很小像是5、1甚至0.5,

結果開始後,
比較不延遲了,
但卻變成飛機一格一格的移動,
導致飛行速度緩慢,

後來想了很久覺得若是把(彈)放到 if 外,
也就是等判斷是結束後再把他彈起來,
測試後結果卻沒有好轉,
後來就測試了很多很多方法,

最後設個變數選用Switch來彈按鈕,
原先將Switch放在用來判斷的雙For迴圈後,
狀況依然發生,

但就在我把Switch拉到For迴圈前時,(如下兩圖)
奇蹟的成功了,
程式接受了模擬鍵盤的訊號,
而遊戲操作過程也變得合理了!
只差在程式先將後面事件做完後再回來的時間而已!

後來再執行雷電可以順利的進行遊戲,
但是因為這樣的操控方式讓遊戲難度變得太高,
所以最後改成相較比較簡單的敲兔子來發表!

以前上程式課程,
都會有程式執行時間的相關問題,
這次在寫這個專案真的是感受到了,
原來小小的執行順序導致的時間差,
我們再寫時感受不到,

但對於程式來說非常的重要,
這真的是這個專案最大的收穫了!!




<程式執行影片>



沒有留言: