2012年6月23日 星期六

期末專案報告

有關於我的期末專案報告
首先得從我的專案構想靈感說起
但是有鑑於已經有發過一篇構想
所以在此直接引用!!
http://hwshow-vgc.blogspot.tw/2012/06/blog-post.html
最後的DEMO作品其實跟我的理想還有點差距

這算是我目前設計的最完整的一支程式
所以在程式的完整度上比較執著
但是反而使遊戲性上的完整度較低了

以下是我這次設計的互動視訊遊戲
根據了上面引用的構想設計的
原本的理想是所有的觸碰點都同時觸控才進入下一關
但是遊戲的規則稍有改變

這是最後完成品的遊戲規則
1.不必同時觸碰,但同樣必須所有觸碰點皆觸碰過也可以通關
2.遊戲有時間限制,所以同時將所有觸碰點同時觸碰可以加速通關速度
3.關卡無上限,但是通關數越多分數越高
所以結合以上3種規則
時間內通關數越多分數自然越高

但是最後DEMO的作品還少了時間的限制


這是DEMO時的遊戲介面
龍珠為觸碰點
但是DEMO時發現龍珠的距離還不夠遠
達不到我所想的觸碰所有出現的龍珠需要誇張的大動作的效果



上面的兩張圖
第一張是玩家的站立準備位置
第二張是所有可能出現的觸碰點位置


接著這張圖要介紹的
是為了DEMO所顯示的所有偵測畫面
由左到右分別是Background,Difference,BinaryDifference,BinaryDifference-Block


接下來要說的是這次設計所碰到的問題

第一點:
在同時出現的觸碰點中,分別觸碰沒有問題
但是在同時觸碰的情況下
只有編號最前面的一個會被觸碰
原因是我每次回呼時就會重置一次觸碰點boolin變數的true or false
解決的辦法是當所有出現的觸碰點接被觸碰,也就是false
才會重置觸碰點

第二點:
第一點的問題解決後能夠正常的進行遊戲
但是所有觸碰點接觸碰也就是通關後
畫面會立刻重置造成下一關的準備時間不足
造成在觸碰動作還未收回前已經進入下一關
直接觸碰到下一關的觸碰點
而在為了解決這個問題的部分
我嘗試了幾種方法

Sleep( milisecond );

其中
milisecond = 1000 為1秒
milisecond = 2000 為2秒
依此類推...

這是讓程式休息 milisecond 時間後才繼續直行
但是這個方法會讓整個程式停頓而不是我要的等待效果
接下來我使用另一種方法

if( iTimeBefore != 0 )
    iTimeBefore = clock();
iTimeAfter = clock();
while(iTimeAfter - iTimeBefore != milisecond )


但是發現這段程式的雖然寫法不同
但是跟Sleep的結果一模一樣
最後是我最終的解決方法


if( iTimeBefore != 0 )
    iTimeBefore = clock();
iTimeAfter = clock();
if( iTimeAfter - iTimeBefore != milisecond )
{
    重置遊戲畫面( 進入下一關 );
    iTimeBefore = 0;
}

這樣的話程式不但不會停頓
而且還會在等待 milisecond 後才進入下一關
讓玩家有機會收回動作後
等待下一關的觸碰點出現


最後就是大家在成果展上看到的實際DEMO
在這門課上其實真的學到很多遊戲設計上實用的經驗
雖然過程中常常讓我有很累很疲憊
甚至有不想繼續修課的想法
但是做出來的成果讓我覺得這學期修這門課很值得

沒有留言: