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的樣子吧!



                         

沒有留言: