顯示具有 98363121 林鈺傑 標籤的文章。 顯示所有文章
顯示具有 98363121 林鈺傑 標籤的文章。 顯示所有文章

2012年6月23日 星期六

期末專案報告書

龍洞大冒險


        其實這個遊戲我花大部分的時間在構思遊戲玩法和構圖上面,大家專案的構想爭奇鬥艷,一個比一個有創意,讓我頗為苦惱,沒想到我的一句玩笑居然變成了遊戲。

首先我在程式的撰寫分為三大部分
Party1:
         利用課堂上教的程式碼開啟視訊,並使用相框作業的技巧加入我要讓玩家方便定位的相框。這裡面還有個比較特殊的功能是一開始看不到的,就是老師推薦給我的地圖製作功能,此功能是為了讓龍在碰到黃色邊框(遊戲中為勇者的祝福)時會被扣一點愛心,而愛心皆被扣光則結束遊戲。
相框:          
           if ((blackRGB[j][i][0] != 0)
             || (blackRGB[j][i][1] != 0)
             || (blackRGB[j][i][2] != 0)
上面程式碼為相框CallBack裡調整要被標記的顏色,從上而下分別是RGB。沒被被標記的顏色則會在視訊開始時成為擋在視訊畫面前的相框。

地圖:
          for (j=0;j<480;j++)
               {
                    ptrImage = (BYTE *)imBackground->Picture->Bitmap->ScanLine[j];
                    for (i=0;i<640;i++)
                   {
                      iB = ptrImage[i*3];
                      iG = ptrImage[i*3+1];
                      iR = ptrImage[i*3+2];
                      ucMapRGB[j][i][0] = (unsigned char) iB;
                      ucMapRGB[j][i][1] = (unsigned char) iG;
                      ucMapRGB[j][i][2] = (unsigned char) iR;
                      ucMapYUV[j][i][0] = (unsigned char) (((66*iR+129*iG+25*iB+128)>>8)+16);
                      ucMapYUV[j][i][1] = (unsigned char) (((-38*iR-74*iG+112*iB+128)>>8)+128);
                      ucMapYUV[j][i][2] = (unsigned char) (((112*iR-94*iG-18*iB+128)>>8)+128);
                    }
                }
此程式碼在讀入我用Image元件加入的相框圖片,因為我在Visible設為false所以開啟程式時會自動隱藏,imBackground為圖片名稱。



            // 將計數器歸零
iBlackCounter = 0;
           iOrangeCounter = 0;

            iYellowCounter = 0;
            // 開始統計該區塊哪個顏色最多?
            for (i=0;i<8;i++)
                {
                for (j=0;j<8;j++)
                    {
                        if ((ucMapRGB[m*8+j][n*8+i][0]==0)
                        &&(ucMapRGB[m*8+j][n*8+i][1]==255)
                        &&(ucMapRGB[m*8+j][n*8+i][2]==255))
                        iYellowCounter++;
if ((ucMap[m*8+j][n*8+i][0]==255)
                     &&(ucMap[m*8+j][n*8+i][1]==127)
                     &&(ucMap[m*8+j][n*8+i][2]==39))
                       iOrangeCounter++;

                    }
                }
             // 設定最大且超過一定數量的色彩區塊之對應值
             if ( (iOrangeCounter > iYellowCounter)
                  &&(iOrangeCounter > iBlackCounter)
                  && (iOrangeCounter > 25))
                  a = 1;
             //判斷是否結束

iYellowCounter = 0是用來計算原區塊有多少黃色,一旦有區塊OrangeCounter超過25且大於iYello和iBlack就判定碰到黃色邊框,然後設a為1,以方便後面判斷扣愛心一下。


Part2:
擷取背景:
        程式會先讀曲目前視訊三十張照片來計算平均影像,以達到讀取背景的目的,特別要注意的是讀取背景時,視訊畫面不可以改變,不然接下來的色彩差異會有所偏差。


色彩差異:
        會判斷擷取的背景和膚色差異來達到視訊互動的效果,因為時間不夠所以遊戲的玩法從人可以在虛擬的視訊中拿著劍砍龍,變成用手去推龍。(上圖為我畫了很久的劍,讓它露個面)




開始遊戲:

        Form1->MediaPlayer1->Close();              //關閉音效
        Form1->MediaPlayer1->FileName="C:\\02.wav";//開啟音效02
        Form1->MediaPlayer1->Notify=true;
        Form1->MediaPlayer1->Open();
        Form1->MediaPlayer1->Play();
用此程式碼在關閉封面的音效,開啟戰鬥畫面音效。


// 設定虛擬物件的大小
    iObjectWidth = 25;
    iObjectHeight = 25;
這邊讓我卡很久,就算經過老師提醒我還是回家後才解決問題,接下來程式會讀入我設定的橘色龍元件,但是執行時都會出現奇怪的顏色,就算更改iObjectWidth、iObjectWidth值也沒用,更改我原件的大小為25X25後才解決。


 iDeltaX = iDeltaX * -1;
 iDeltaY = iDeltaY * -1;
原本老師的程式碼是讓原件消失,這段程式碼的目的是在讓原件碰到手後有種反彈的感覺。
接下來就會開始遊戲搂!

Part3:
        遊戲的人性化設計,我覺得一個遊戲要玩得好玩,就是在人性化設計這一方面。如果你要開啟一個小遊戲還要東按一下西按一下,那誰會來玩呢?可是礙於我程式能力真的還不夠強,只能把開啟視訊、相框和地圖等放在一個Button裡,換句話說,就是一個Button我只能呼叫一個CallBackFuntion,如果按另一個按鈕前一個CallBackFuntion就會被自動關閉,這是我介面無法全部人性化的主因。



左圖有個結束的按鈕,是我設計在玩遊戲或是視訊偵測錯誤時,不用整個程式關掉就可以重新回到主標題,個人認為這功能是遊戲一定要有的,不然也太鳥了吧。



















第一次玩遊戲一定會摸不著頭緒吧,沒關西!只要去說明就可以找到完整的遊戲說明和貼心小提示唷。


心得:
        這次專案對我來說意義重大,因為我一直以為進入資工就是要製作遊戲,誰知道我現在天天和OS還有英文鬼混,學習到的程設計巧也多半找不到和遊戲的關連。但是,這次的期末專案真的讓我體會到製作遊戲的辛苦和我程設能力的不足,不僅僅是製作美觀的圖片,還要懂得如何設計出能達成你Idea的程式,還有就是要敢問敢做、肯花時間下去,沒有一個好玩的遊戲是三兩下就完成的。
        身為我第一個設計出來的遊戲,雖然還是未完成品,但我很以它為榮。將來一定會繼續把這遊戲完成,長大後讓我兒子玩的第一款電腦遊戲就是我設計的豈不美哉。
聽完我的廢話來看看程式實際RUN的樣子吧!



                         

2012年6月7日 星期四

期末專案構想

龍洞大冒險
這專案的構想是利用程式判斷手上紅色棒狀物體為勇士的劍,而勇者在龍洞裡會與到各式各樣的龍,如圖各種顏色的龍會從四面八方來襲擊勇者,要用劍來防禦龍的攻擊而龍將會被劍反彈,可以利用這點來讓龍因互相碰撞而死亡。


遊戲方式採過關制,每一關最後面都會有個魔王龍把關,而各種龍的攻擊性質和弱點也會有所不同,當然主角也會在擊殺龍後獲得一些分數。
角有三顆心可以抵擋龍的攻擊,當三顆心都沒了時就會直接跳到排行榜。


圖中的藍框為判斷是否受到攻擊的框框,會先偵測遊戲者並以肩膀為寬設定藍框的大小,被龍碰到或是被射出的火焰接觸到藍框皆會算扣血,到底勇者能不能順利逃脫龍洞呢?

2012年6月4日 星期一

HW03

Step 1:首先上網收尋一個SMILE的相框,卻發現相框中間是白色的和相框的邊邊一樣,老師說這樣程式會無法判斷,所以就用Photoshop把像框中間塗黑。
Photoshop存檔發現不能存BMP檔,於是我用小畫家打開再重存一次問題就輕鬆解決了。

Step 2:在BCB中新增一個 TImage 影像元件,讀入相框後再把"Proprotional"改成true讓畫面較美觀結果如圖。

Step 3:在全域變數宣告RGB[640][480][3]和YUV[640][480][3]的陣列。

Step 4: 在設定預覽回呼函數之前, 將影像色彩值讀入陣列之中。先設定視訊內容的高和寬設定為iObjectWidth = 640;iObjectHeight = 480;位置設定成iObjectX1 = 0;iObjectY1 = 0;龍珠的CALLBACK都有這些程式碼但是需要改一些。

Step 5: 在除錯後還剩一個上次就出現的問題"Linker Error"經過蔡振揚同學的細心檢查加GOOGLE,發現要刪掉N6Click這按鈕時不該直接到程式碼中移除,會造成LinkError的問題。

相框在執行時有發生顯示在視訊後面的現像,這問題讓我們在程式碼裡煩惱很久,後來發現是相框的塗黑部分並不是完全的黑色,且在蔡振揚瘋狂的Debug後終於成功摟!!!

點選背景顏色後接著去Color裡面更改背景顏色。


紅色感覺很可怕...

2012年4月23日 星期一

作業2 錄影


這次錄影的程式碼較為簡單,只要瞭解這段程式在幹嘛其它的就好做了。

capCaptureSequence(hwndVideo);開始錄影
capFileSetCaptureFile(hwndVideo,"錄影001.avi");儲存的影片檔名為:錄影001.avi

2012年3月20日 星期二

這次功課要把攝影機所擷取到的畫面放到Window顯示出來。
首先從工具新增一個TPanel,這個Panel是拿來當Window的。
接下來拉出MainMenu來新增選項,上面是完成圖。

使用CREATE創造一個Window,目前還沒有畫面。

CONNEC是把Window和視訊裝置的驅動程式連結起來。
ENABLE則是設定他的模式為Preview

接下來設定顯示的速率就可以來視訊了。

心得:老師一步步的解說程式碼,使我很容易理解這段程式碼在幹嘛。而且,把視訊鏡頭分解成abcd步驟也比較好理解視訊是如何運作,今天學會了把視訊鏡頭的畫面顯示出來,希望接下來能學到用鏡頭跟遊戲互動的課程,應該會很有趣。