程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(二十五)(2)

C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(二十五)(2)

編輯:關於C語言
如鼠標經過的對象是QXSpirit類型,則鼠標的光標變為1號,其他情況時,鼠標光標變為0號。這種效果對於做習慣了.Net網站開發的朋友們來說再熟悉不過了,好比導航欄上的鼠標懸停圖片切換CSS或JS效果。

這麼短短一句話即實現了最簡易的精靈對象捕獲,我們先來測試一下程序:

細心的朋友會發現,雖然是勉強實現了但這其實並不准確;因為當鼠標並不在怪物實體上時,鼠標仍然會顯示為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]);

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved