Silverlight 游戲開發小技巧:動感小菜單2

作者: nowpaper  來源: 博客園  發布時間: 2011-02-14 23:02  閱讀: 706 次  推薦: 0   原文鏈接   [收藏]  

  動感小菜單其實是想模仿Apple的菜單按鈕設計制作,但是畫虎不成反類犬,看起來有點別扭,昨天各位園友提了這方面的建議,感覺太硬如果加入動畫可能更好,非常感謝各位,而今天這篇的動感小菜單2,讓按鈕更加動感“柔”順:)期望能做的更好吧。

0  我們可以直接借助昨天的工程,在上面的基礎上修改,打開昨天的工程(Silverlight 游戲開發小技巧:動感小菜單):

1  直接選定一個StackPanel的Group,然后按住Alt鍵復制一個,為了方便編程,這次我們將它制作成一個控件:

2  在結構里面直接選擇剛才Copy的組,點擊右鍵選擇Make Into UserControl,中文版是制作成為自定義用戶控件選項。

3  輸入一個名字,OK,就會自動進入到這個控件的編輯界面,關于自定義控件,我想其他的Blend教程有詳細介紹,這里只介紹技巧相關的內容。

11  現在我們進入到VS中編程,當然了,如果您喜歡在Blend里直接寫也可以,我個人比較習慣在VS里編輯:)

  你可以在工程中找到剛才制作的控件,選擇對應的cs文件開始寫代碼吧。

4  首先,要設定IconCard的圖像(請一定參看前一篇,本篇是在前一篇中進行的擴展)

  在Group3Control的構造函數中寫成這樣:

Code Snippet
  1. public Group3Control()
  2. {            
  3.     InitializeComponent();
  4.     for (int i = 0; i < Group3.Children.Count; i++)
  5.     {
  6.         var item = Group3.Children[i] as IconCard;
  7.         item.RenderTransformOrigin = new Point(0.5, 0.5);
  8.         item.RenderTransform = new ScaleTransform() { ScaleX = 1, ScaleY = 1 };
  9.         item.IconIndex = i;
  10.     }
  11. }

  前面看過的朋友應該不難理解,這時一個指定操作。

  下面重寫控件的MouseEnter和MouseLeave的函數。

Code Snippet
  1. protected override void OnMouseMove(MouseEventArgs e)
  2. {
  3.             
  4.     foreach (var item in Group3.Children)
  5.     {
  6.         var t = item as IconCard;
  7.         if (t == null)
  8.             continue;
  9.         double x = e.GetPosition(t).X - t.ActualWidth / 2;
  10.         double y = e.GetPosition(t).Y - t.ActualHeight / 2;
  11.         double mine = Math.Sqrt(x * x + y * y);
  12.         double mineZoom = Zoom(1.2, mine, 72);
  13.         (t.RenderTransform as ScaleTransform).ScaleX = mineZoom;
  14.         (t.RenderTransform as ScaleTransform).ScaleY = mineZoom;
  15.     }
  16.     base.OnMouseLeave(e);
  17. }
  18. protected override void OnMouseLeave(MouseEventArgs e)
  19. {
  20.     foreach (var item in Group3.Children)
  21.     {
  22.         var t = item as IconCard;
  23.         if (t == null)
  24.             continue;
  25.         (t.RenderTransform as ScaleTransform).ScaleX = 1;
  26.         (t.RenderTransform as ScaleTransform).ScaleY = 1;
  27.     }
  28.  
  29.     base.OnMouseLeave(e);
  30. }
  31. double Zoom(double m, double d, double s)
  32. {
  33.     if (d < s)
  34.     {
  35.         return (m * (d - s) * (d - s) / (s * s) + 1);
  36.     }
  37.     else
  38.     {
  39.         return 1.0;
  40.     }
  41. }

  具體意思是,當鼠標移入的時候,就會計算鼠標和控件的位置,并將所有的子元素遍歷修改放縮,由于通過算法得出,可以很好的讓小按鈕達到“柔”順的感覺:)

  非常感謝路毅提供的算法,使得我能夠更專注做關鍵的工作,特此感謝。本工程中有一段是注釋掉的內容,就是他之前的實現效果,有興趣的朋友可以把注釋去掉,看看是什么樣子。

  本篇工程源代碼下載地址如下:點擊直接下載

0
0
 
標簽:Silverlight
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()