這麼短短一句話即實現了最簡易的精靈對象捕獲,我們先來測試一下程序:
細心的朋友會發現,雖然是勉強實現了但這其實並不准確;因為當鼠標並不在怪物實體上時,鼠標仍然會顯示為1號光標(如下圖),是代碼出問題了嗎?
其實問題並非出在代碼上,這是因為精靈的圖片源是背景透明的PNG或GIF格式圖片,就拿上圖中的“絕對無敵”來說吧,它的每幀圖片為200*200尺寸(如下圖),
它的有效實體只是該圖片的中間區域,而它的旁邊有著比較大面積的透明無效區域,雖然在顯示上透明區域是不會顯示出來的,但是它整個作為200*200尺寸的Image類型控件而存在。因此當鼠標在游戲窗體上移動時,只要處於這200*200區域內時均會顯示為1號光標而並不會理睬它是否停留在精靈的有效實體部分。
精靈的圖片源均為位圖類型,目前我暫時還未發現在WPF/Silverlight中如何實現將位圖轉換成矢量圖的高效直接方法。因此目前解決這個問題的方式只有兩種,第一種為通過對當前拾取對象的圖片源進行點對點的顏色拾取,然後判斷當前鼠標的位置相對於圖片源中的點是否為透明,如果不透明則拾取該精靈,具體方法如下:
/// <summary>
/// 獲取圖片源某點顏色
/// </summary>
public static Color getImagePointColor(BitmapSource bitmapsource, int x, int y) {
CroppedBitmap crop = new CroppedBitmap(bitmapsource as BitmapSource, new Int32Rect(x, y, 1, 1));
byte[] pixels = new byte[4];
try {
crop.CopyPixels(pixels, 4, 0);
crop = null;
} catch (Exception ee) {
MessageBox.Show(ee.ToString());
}
//藍pixels[0] 綠pixels[1] 紅pixels[2] 透明度pixels[3]
return Color.FromArgb(pixels[3], pixels[2], pixels[1], pixels[0]);
}