2010年9月21日 星期二

簡單談用BitmapData.compare來做手畫路徑比對

有一種遊戲類型,就是電腦指定一個形狀路徑,例如一個圓,或一個方型,然後要使用者去"畫出"這個形狀。畫路徑這個比較常見,就是用一些Flash的繪圖API把路徑畫在Sprite.graphics。那畫完之後要怎麼跟指定的路徑去比對呢?可以把原有路徑(先做好圖,設定visible = false藏起來)以及user畫的路徑的BitmapData取出來,再使用BitmapData.compare去比對兩個BitmapData,就可以去做判斷。

首先,我們可以先把電腦出題的路徑圖先準備好,用一個底色,例如黃色,然後用白色來畫出路徑。而遊戲中,則是讓user在一個Sprite.graphics。這裡有個小技巧:讓user畫出來的路徑,同時記錄到兩個Sprite.graphics裡。第一個是讓user看得到的效果,透明背景,畫出來的路徑可以是各種顏色,甚至加上濾鏡等等效果;另一個是隱藏起來的,底色填一個跟電腦出題路徑不一樣的顏色(不能只有alpha值不一樣,而是要RGB值不一樣),不填色(透明色)的話當然也跟剛剛的黃色不一樣。而user畫的路徑設定跟電腦出題的顏色白色一樣。當user畫完後我們取兩張圖的BitmapData,這邊注意兩張圖範圍的長寬要一樣才能比對。接著用
resultObj = bitmapData1.compare(bitmapData2);
來比對,其中resultObj是一個Object,當兩個BitmapData一模一樣時會等於0,不過照我們剛剛的設定不可能發生。如果兩張圖的寬高不一樣,分別會回傳-3與-4,若剛剛取BitmapData時設定寬高一樣的話,也不會發生。其他情形,就會回傳一個新的BitmapData,每個pixel的顏色就是bitmapData1減去bitmapData2的顏色。
所以我們可以寫迴圈將resultObj的每個pixel取出來,檢查顏色可以知道:
1.0代表兩張圖顏色相同的點,也就是該畫白色路徑的地方,user有畫到了。這就是成功的pixel。
2.顏色值如果是第一張圖的底色減去第二張圖的底色,就代表不該畫也沒有畫的點。
3.顏色值如果是第一張圖的底色減去白色,就代表不該畫但畫了的點,也就是失敗的點。
4.顏色值如果是白色減去第二張圖的底色,就代表該畫而沒畫到的點。

那要如何斷定成功或失敗?只要1.的成功點超過一定的量,而且3.的失敗點小於一定的量,就算成功。這個量是多少,可以由實際測試去決定。畢竟遊戲難度還是要看實際畫出來的感覺去調整。之所以要考量失敗點,是為了防止user將整張圖都塗滿了來作弊,而之所以要讓兩張圖的底色不一樣,也是為了要判斷出失敗點。

沒有留言:

張貼留言