這次期末專案的構想是來自以前在網路上玩到的一個小遊戲
遊戲畫面
遊戲畫面2
碰到子彈後,出現的分數畫面
這次的期末專案要製作的是擴充實境的互動小遊戲,擴充實境就是將實物和虛擬物件做基本的互動,例如碰觸後消失、拖拉物件、將物件放大或縮小等等都是擴充實境,而這次我所做的專案將以上述的小遊戲做為範本來製作。
以下是我的遊戲介面
一開始進入的遊戲介面
賤兔與追他的子彈
碰到賤兔後出現的結束視窗
原本的構想是玩家利用頭去控制中央的賤兔,閃躲從四面八方來的子彈,時間撐最久者獲勝,但這種普通的Webcam要找出人頭的話,必須使用Open CV來偵測,因此一開始我就遇上這道難關。後來想說改利用顏色偵測來讓賤兔跟著顏色差異的點移動,例如瀏海貼或胸針之類的物品來控制,但想想似乎又不太可行,因為我們所認知的點和電腦所認知的點差很多,我們想像的點在電腦的認知裡可能是一大堆點的集合,如下圖
偵測到紅筆的畫面
紅筆的UV值範圍(感謝李佳芳同學提供)
可以看到電腦找到的幾乎都是一大片的範圍,因此賤兔到底要跟著哪一個"點"移動就是一項很大的問題了。因此經過同學的建議之下,我決定利用控制項來控制賤兔的移動,但由於時間不足,最後還是沒能將其完成,這是第一個賤兔的移動方式所碰到的問題。
接著遇到的問題是如何將子彈亂數產生在畫面上,一開始修改老師的程式碼時是用很笨的方法,一個物件就宣告一個變數,但這樣我的子彈數量就會是固定的,而且程式碼會變的又臭又長,後來問了廖宗育同學之後,他交了我一個辦法,就是利用一個for迴圈,將子彈的編號全部跑過一次,如下:
for(iDragonBallID=0;iDragonBallID<=6;iDragonBallID++)
for(iDragonBallID=0;iDragonBallID<=6;iDragonBallID++)
利用這行就能將所有的子彈都叫出來,但位置都要從新調整過,否則會全部疊在一起,而我是先將所有子彈以亂數rand()的方法出現在畫面上,如下
iObjectX1 = rand() % 590;
iObjectY1 = rand() % 430;
iObjectY1 = rand() % 430;
要注意的是,如果要使用rand(),要先在最上面#include <time.h>才可以使用。
亂數子彈產生圖
但這種亂數產生的方式和我所要的追蹤賤兔效果不太一樣,但既然都做出來了,就將它變成另外一種模式了。而追蹤賤兔的演算法在詢問過老師之後,大致了解該怎麼運行,就是將追蹤者的座標扣掉被追蹤者的座標後,再利用
iDeltaX = 5;
iDeltaY = 5;
控制追蹤的位移大小,也就是速度,將追蹤者的位移大小設定的比被追蹤者大,感覺就會像是在追一樣,且還可以利用Track Bar元件讓玩家自己控制追蹤的速度,但這些想法卻都因為時間不足只好停留在我的腦袋裡了。
心得與反省:其實這次專案的製作過程很特別,不是在家裡一個人完成,而是像夏令營的方式,利用一個禮拜的時間在學校和同學老師討論過後,再將專案"生"出來。可惜的是, 我因為暑修課程時間剛好卡到,導致5天的夏令營我只到了3天,其中兩天還是下午才到,甚至還錯過最重要的第6次範例程式講解,縱使我全心全力想把專案做出來,但這種對程式一知半解的後果當然是淒慘無比,真的就像老師說的,我們都太天真以為只要熬夜個一兩天就能做出來。而且心裡其實還有很多想法想加進這次的專案,例如我本來還想要玩家邊玩時,一邊錄影,這樣在遊戲結束之後就可以看到剛剛玩遊戲時自己的糗樣,但卻因為會造成遊戲的停格而做罷,雖然這次我是屬於沒有完成的那一部分,但我所學到不比完成專案的同學們少,不管是在程式碼或是在自己的態度上都要做很大的修正,如果當下碰到不會的地方,真的要立刻問同學或老師,而不是坐在那邊看著螢幕一個下午還Debug不出來,否則在DEMO完後,就會像我一樣有很多的不甘心與遺憾,同時也謝謝老師在第四天颱風天還陪我們到晚上10點,雖然電腦關機了,但回家後被你教的部分真的很快就code出來了,這次未完成版的DEMO影片會在之後更新成完整版的,就在給你上過課之後。
沒有留言:
張貼留言