2020年7月3日 星期五

05360552 葉玟廷 捕捉糰子

一、遊戲介紹

  遊戲名稱:捕捉糰子。
  遊戲內容就是觸碰在畫面中隨機出現的糰子,只要一段時間沒抓到他,他就會馬上換位置。每抓到一次就會立刻出現另一隻糰子在畫面的其他地方,看看能在時間內捕捉幾顆糰子!
  遊戲方法:觸碰畫面中隨機出現的糰子便可增加1分,時間限時60秒,沒有扣分機制。

二、遊戲操作說明及畫面

  1. 遊戲畫面
    
    開啟程式後便會自動補捉視訊畫面並且呈現鏡像畫面,如上圖。
    左下角是遊戲時間,限時60秒,右邊為分數,代表在這時間內總共抓了幾顆糰子的數量。

  2. 取背景

    點選畫面中紅色箭頭所指的按鈕(Game選單中的Video),靜待幾秒後便可取得當前背景,以利接下來的遊戲互動。

  3. 遊戲畫面

    點選右下角的Play按鈕便可開始遊戲,每觸碰到一次圖中的紫色糰子,Score便會+1,左邊的Time則是遊戲的剩餘時間,時間歸零後遊戲便結束。

  4. 結束遊戲


    遊戲結束時會跳出"Game Over !"以及最後總成績。

三、心得

  在製作過程中因為時間緊湊的關係只能做到這樣的程度,最初的構想與最後呈現的結果差了許多,原本想加的許多功能(例如按鍵控制與音樂)因為不擅長使用BCB以及時間關係所以最後都省略,這點若以後有機會會繼續嘗試。
  在構想這個成品的時候,也有許多想法,像是觸碰到糰子時變換表情或是發出聲音等,但在前面debug關於鏡像畫面的時候花太多時間,最後也只好省略這部分。
  基本上這算是最簡單的遊戲,但從中還是能夠學到很多技巧,像是背景相減、以及利用相減後的差異來觸碰畫面中的圖示。很高興能夠有這個機會來製作自己的一個小遊戲,以後也會多加注意關於所有時間的分配比例。

四、影片

背影音樂為免費音樂:Lovable_Clown_Sit_Com。

06360426 鍾誌杰 Fingerball


     

一、遊戲介紹
        整個遊戲的核心概念是要踢出畫面中的黃球,使球命中畫面另一端的紅色矩形。當我們觸碰到黃球時,黃球會根據觸碰到黃球的方向往反方向開始移動,而紅色矩形則是會根據時間的變化有規律的改變位置,因此玩家需要看準時機將球踢出。


        (一)、遊戲沒有限時,開始時有五條命,成功命中紅色矩形會獎勵一條命;反之未命中則扣除一條命。

        (二)、遊戲總共有十個難度,紅色矩形改變位置的頻率會隨著難度提升而逐漸變高。

二、操作說明
        黃球有三個方向的碰撞判定,分別為左方、下方以及右方,球會根據觸碰到的方位往反方向移動,未命中紅色矩形(即碰到視窗上方邊界)則算失敗。
        由於物件的尺寸不大,因此觸碰時要稍微注意,否則觸碰判定的方向容易出現問題。

三、實作過程
        為了實現來自不同方向的碰撞判定,需要判斷實體物件接觸到虛擬物件的區塊是哪一個,於是參考了教材 11-Interaction in Augmented Reality 中的第30張投影片,如何改變移動方向的圖片開始實作,將球切割出了左、下、右三個判定點,但是由於物件尺寸太小,觸碰時仍須注意不可太過野蠻,導致觸碰判定失準。
     
        而加快紅色矩形移動頻率的設計是用 BCB 中的 Timer 物件來進行設計,Timer 中的一個叫做 Interval 的 Property ,是控制執行 Timer 內的程式碼的頻率,若設定為1000則為每1000毫秒執行一次。於是每當難度提升一次,就將 Interval 的值減少100,因此產生了紅色矩形改變位置越來越快的情況。

四、影片


五、心得
        修遠坤老師的課學到很多實用的知識以及實作技巧,像上個學期的影像處理一樣,在影像處理課程中學到的濾波器,在我學習專研題目中,利用深度學習轉換影像風格裡,對於如何使用濾波器處裡影像資料時給予了很大的幫助。
        今年雖然期末專案做得不甚理想,但依然撰寫了上千行的程式,讓自己對於如何開發視訊應用軟體有了初步的認識,我覺得修老師的課特別的地方在於,老師會一步步帶我們去討論實作某些功能時可能遇到的問題,從這點切入帶我們認識更多以前很少思考的問題,以及該如何解決,我很喜歡這種老師鼓勵我們自己思考,再跟同學及老師一起討論的方式。
        只不過今年有可能是最後一次修老師的實作課,因為四上會卡到畢業門檻,如果四下還有新的選修課再來跟老師學習,感謝老師。

06360533 陳子恒 割草機

概念發想:每個人小的時候,都有一個充滿電腦小遊戲的世界,而這個除草機小遊戲,我在小的時候根本沒玩過,直到最近朋友傳給我,於是決定透過視訊完成控制除草機的控制。


遊戲玩法 : 透過左右按鍵操控角色來閃避障礙物一款遊戲,因此,做了兩個虛擬分別模擬左與右。透過差異偵測,判斷物體是否有碰到畫面中的 trigger,如下圖所示:


接著將滑鼠遊標移到遊戲畫面中的適當位置,接著就能會動你的手手開始遊玩囉!



製作困難處:
試著尋找可以真正模擬按鍵敲擊的函式並正確使用。一開始嘗試使用 Keybd_event ,但是它雖然能夠控制網頁的瀏覽等等動作,遊戲卻毫無反應。因此,改用 SendInput 後就明顯改善很多,然而這個函式使用起來並不是很方便,如果按鍵在瞬間被按下的下個指令為放開時,遊戲也偵測不到。於是將按下按鈕時,讓程式 Sleep 幾毫秒的時間就行了。


06360134 彭柏淵 金幣 : 快來抓我喔!

 06360134 彭柏淵 金幣 : 快來抓我喔!

一、遊戲簡介

       遊戲名稱叫做金幣 : 快來抓我喔!,是一款抓金幣的遊戲。這款遊戲的程式概念就是將範例作業裡的抓Gecko程式跟選擇不同星星數的龍珠展示在畫面的程式結合在一起,藉由龍珠的程式,可以選擇不同樣式的金幣當作你要抓取的虛擬物件(金幣),接著用跟Gecko互動的程式,實現跟金幣互動,使金幣消失且會有金幣掉落聲,讓你享受擁有許多金幣的聲音。

二、遊戲操作說明及操作畫面

1.開啟並執行程式。



2.點擊 WebCam 裡的 AutoCreate 開啟攝像頭的畫面。



3.接著點擊 Preview Callback Function 裡的 Background,便可以成功取得背景畫面。



4.點擊 Preview Callback Function Difference Detection 裡的 8*8 Block Mode 檢查並調整 Threshold 的值。



5.點擊 Interaction 裡的 Game Play,預設的第一枚金幣就會出現在畫面,然後背景音樂就會開始播放。



6.然後你可以選取旁邊其他類型的金幣,有8種不一樣的金幣(老鼠、楓葉、熊貓、豬......)。


7.當你的手碰觸到金幣後,它就會消失,且發出金幣掉落的音效。消失後,立馬在畫面上隨機產生金幣的位置並且顯示金幣的模樣



8.除了這個背景畫面之外,也以點選畫面右下方的 8*8 Block Display,那他的畫面就會變成黑白的,但是這部分的程式和 Game Play 的程式是獨立的,所以背景音樂會重新播放,然後會出現預設的第一枚金幣,而不是剛剛出現的位置跟選擇的金幣。


三、遊戲可改進的地方

1.讓多枚金幣同時出現在畫面裡。
2.每種不同的金幣給它不同的音效。
3.可以增設它的遊戲時間以及得分方式,還有終止設定。
4.設置炸彈之類的來干擾出手以增加趣味性。
5.讓金幣可以不規則的在畫面上動。

四、心得分享

    這學期的一開始,我其實並沒有選這門課,只是因為我其中一個選修課程被我的重修課程擋到了,為了補這個學分,我在加選的時候,選了這門課。第一禮拜上這門課的時候,老師播了動畫片 - 電腦線圈來開始這學期的課程。我一開始以為這門課很輕鬆,但到了期中考時,我才發覺這門課其實不是那麼輕鬆,因為有範例作業要寫,明明是看著老師給的步驟以及程式碼寫的,但卻總是跑出程式錯誤,在加上其中考考得不太理想,於是產生想要退選的念頭,但期中考後,老師講了只要有把期末專案做出來,並且有展示出來,那你一定過的了這門課,而且展示專案的那天,還有免費的麥當勞可以吃,所以我決定還是留下來了。到了期末,我又開始陷入掙扎,在期末展示的前二天,我好不容易做好了範例作業,結果跑出一個錯誤,而我始終找不到錯誤在哪,請了同學來幫忙,但依舊沒有找到,於是我前一天早上重新把作業弄好,導致我的專案還沒有任何進展,而且時間所剩不多,因此將專案的設計簡化些,透過範例作業裡的程式去進行搭配,但先是因為找的金幣圖片的檔案類型不符合,導致程式無法順利去跑,在來是無法在我的筆記型電腦上跑,甚至一度 Point2 View跟電腦裡攝像鏡頭會衝突到,總之作這個專案,問題一個一個冒出來,差點交不出成果來。最後成功地把專案做好,卻在展示的時候,沒有把音檔的位置給設定好,導致沒有出現金幣掉落的音效,著實可惜,不過有把作品呈現出來,我還蠻開心的,總算是結束。從這門課裡,我學到了很多,同時,這也是第一次自己做出一個專案出來,當然也有同學的幫忙,幫助我順利地將專案做出,不過依靠自己完成這個專專案,感覺挺特別。

五、遊戲影片

06360984 翁明緯 星期三猴子不爬山

星期三猴子不爬山

一、遊戲簡介

      星期三猴子不爬山是一款生存遊戲,玩家將操作不小心惹怒山神的角色,躲避憤怒山神的攻擊,看誰能生存的時間比較久。
      肚子餓的小猴子跑到山上採香蕉吃,一不小心就惹怒了山神,為了活下去,必須躲避山神的攻擊,看誰能存活得比較久!

二、遊戲介紹

  介面介紹

      這個是我的遊戲介面,所有的設定都可以在介面上直接做更改。

  功能介紹

    1.切換角色:這個功能是透過點擊下方圖片來切換成指定角色
切換為火箭

切換為方塊賽車

切換為孫悟空
    2.背景顯示:使用Radiogroupe來做為選擇工具,在不同選項時切換成不同背景

全黑背景
將手的部分已8*8的黑色方塊做顯示


把背景設為雲的圖樣
    3.角色移動:使用差異偵測抓取差異點中最上面的中心做為角色的位置,並利用Checkbox來達到控制角色的移動模式。角色的移動模式有兩種,一種是角色可以四處自由走動,另外一種則是把角色固定在Y軸為280處,X軸則一樣由操縱者控制。
將猴子固定在 y=280處

    4.難度:這個部分花了比較多的時間在思考要怎麼讓山不要過於密集的掉落。當離頂端最近的山掉距離頂點大於100時會產生使用者設定難度相對應數量的山。

難度為1,所以山的數量叫少

難度為3,所以山的數量很多
    5.時間:用來現在存活計時間和最常存活時間


三、示範影片(記得開啟字幕)

四、心得

      累!超級累!其實原本的主題是小朋友上樓梯,但是後來發現許多遊戲中的加速度或是一些動畫都有一些困難,後來改朝類似gameboy的賽車遊戲製作,才逐漸變成現在這個遊戲,所以角色中才有一台方塊賽車。
       這次因為學校的關係,可以製作時間從5天大幅縮短到2天,為了趕出來,2天內在電腦前的時間應該超過20個小時了吧!雖然嘴巴一直喊累,但是看到自己寫的程式碼一段一段被成功執行,成就感逐漸的上升,心理想著要做更多的功能,只可惜時間不夠去完成。但很開心最後的展出可以順順利利的!也學到了很多東西,也吃到了麥當勞,更體會到辛苦做出來的東西,記憶會更深刻這句話!我永遠不會忘記這段經驗的。

06360321 鄭子輿 方塊獵人

方塊獵人


--------------------------------------------------------------------------------------------------------------------

一、遊戲介紹
        在時間範圍內盡可能碰到越多綠色得分方塊,同時也要閃避紅色扣分方塊。


--------------------------------------------------------------------------------------------------------------------

二、實作簡介

--------------------------------------------------------------------------------------------------------------------

(一)、綠色得分方塊
        下圖 1 綠色框內的綠色方塊為得分方塊,碰到時綠色方塊會消失,同時右方Get Score和Total Score會加1分。綠色方塊在每1/4秒會隨機取影像中的位置誕生,每個方塊的移動方式也不相同。
圖 1
1. 隨機誕生方塊
        首先需要在Tool Palette拉一個Timer元件,此元件內有一個整數屬性Interval,這個屬性是讓Timer元件每Interval毫秒來執行一次,將Interval設定成250代表每250毫秒執行一次(1/4秒),而方塊誕生的位置則是用rand()函數隨機取水平和垂直做標的位置。
voGetScore是一個stVirtualObject的變數陣列,分別存放不同得分方塊的屬性。
// 用rand()函數隨機取水平和垂直座標位置
// vo為voGetScore的index,將voGetScore的第vo的方塊物件水平和垂直做標位置取亂數
voGetScore[vo].iX1 = rand()%600;
voGetScore[vo].iY1 = rand()%400;

2. 方塊移動
        讓方塊移動的方式首先要在stVirtualObject內新增兩個整數變數iMoveX和iMoveY,分別為水平移動速度和垂直移動速度,然後在誕生方塊物件時給這兩個變數隨機取-20~20之間的值。
// 用rand()函數隨機取水平和垂直座標移動速度
// vo為voGetScore的index,將voGetScore的第vo的方塊物件水平和垂直做標位置取亂數
voGetScore[vo].iMoveX = rand()%41-20;
voGetScore[vo].iMoveY = rand()%41-20;

--------------------------------------------------------------------------------------------------------------------

(二)、紅色得分方塊
        下圖 2 紅色框內的紅色方塊為得分方塊,碰到時右方Lose Score和Total Score會扣2分,不過紅色方塊不會消失。紅色方塊每隔一段時間會增加一個。
圖 2
1. 隨機誕生方塊
        誕生方式跟上面綠色方塊相同,只是紅色方塊是每隔一段時間誕生,因此用了一個整數變數iBornTime來存取間隔時間,而方塊誕生的位置則是跟綠色方塊一樣用rand()函數隨機取水平和垂直做標的位置。
voGetScore是一個stVirtualObject的變數陣列,分別存放不同得分方塊的屬性。
// 用rand()函數隨機取水平和垂直座標位置
// vo為voLoseScore的index,將voLoseScore的第vo的方塊物件水平和垂直做標位置取亂數
voLoseScore[vo].iX1 = rand()%600;
voLoseScore[vo].iY1 = rand()%400;

2. 方塊移動
        與綠色方塊相同,不過速度範圍調整在-10~10之間,目的是降低遊戲難度,使玩家比較好閃躲紅色方塊。
// 用rand()函數隨機取水平和垂直座標移動速度
// vo為voLoseScore的index,將voLoseScore的第vo的方塊物件水平和垂直做標位置取亂數
voLoseScore[ivo].iMoveX = rand()%21-10;
voLoseScore[ivo].iMoveY = rand()%21-10;

--------------------------------------------------------------------------------------------------------------------

{三)、方塊個數調整
        下圖 3黑色框內可以調整綠色得分方塊和紅色得分方塊的個數,當玩家更改ComboBox內的值時分別用兩個整數變數iGetCount和iLoseCount來儲存個數數量。
圖 3

--------------------------------------------------------------------------------------------------------------------

(四)、時間設置
        下圖 4黑色方塊內可以設定遊玩時間長度,當玩家更改ComboBox內的值時用一個整數變數iTimes來儲存時間。
圖 4

--------------------------------------------------------------------------------------------------------------------

(五)、更改背景
        下圖 5黑色方塊內可以選擇是否要將背景改成黑白背景,當使用者勾選黑白區塊顯示時,將視訊視窗內容依照差異偵測結果顯示。
圖 5

--------------------------------------------------------------------------------------------------------------------

三、遊玩影片

--------------------------------------------------------------------------------------------------------------------

四、心得
        上完這堂課後我才知道原來要做一個視訊應用軟體或遊戲的前置作業是非常複雜的,而且在製作遊戲過程中更加困難,物件位置設定和移動設定要謹慎一點,一不小心就可能會超出邊界,還有哪些物件要在什麼時間出現也要判斷等等,花費了不少時間,雖然辛苦,但是也讓我學到很多東西,雖然以前參加了不少程式的競賽,但是使用這整合開發環境來獨自開發出一個專案還是全新的體驗,讓我感覺受益良多。







06363031 楊文慶 貪吃蛇

貪吃蛇

遊戲規則


        透過綠色的蛇來吃到紅的蘋果,每吃到一次得一分,同時蛇會變長一點。
吃到蘋果前
吃到蘋果後
        當吃到5顆蘋果時即獲得勝利,當碰到邊界或是碰觸自己身體時即輸了。

操作方式

        當上下左右的框框被感應到時,遊戲就開始並改變蛇的移動方向。每10偵時蛇會依照移動方向改變位址。

程式

        程式主要是依照老師實作教材6 PartB來做修改,我將程式分成三個部分。
        第一部分修改教材前半部分,在教材中會先掃過整張圖計算差異,我在計算差異時,同時把感應框框、蘋果、蛇依序化上去。
        第二部分修改教材後半部分,在教材的後半部會檢查壁虎是否會被擋到,我將他改成偵測移動方向,如果偵測到差異且移動時不會往反方向走就改變移動方向。
        最後部分我在程式最後面檢查每10偵時先計算蛇的身體移動位址開始依移動方向改變蛇的頭的位址,並檢查是否碰到蘋果、是否超過邊界、是否碰到身體。當吃到蘋果時增加身體長度。

移動及增加長度

        將身體用陣列的方式記錄,可以變身體很長時可以用迴圈處理。先用陣列記錄所有身體,當該身體要顯示時設1當身體反之設0。由於遊戲開始預設蛇只有3格所以身體0到2必須顯示,以後每當吃到一顆蘋果,分數加2的身體設為1(例如:吃到第一顆蘋果分數是一,必須啟動第四個身體,第四個身體對應到陣列為3)。
        每次移動時先移動身體在移動頭,因為所有身體只是向前面的身體的方向移動(例如:身體n每次移動時只是移動到身體n-1的座標),只有頭移動時需要搞慮到移動方向。引此程式用先用迴圈從最尾巴往頭檢查,先檢查該身體有沒有被啟動了,如果第n個身體被啟動了則n的座標為n-1的座標再往頭的方向檢查,最後頭在依身體的移動方向進行計算。

影片