Silverlight C# 遊戲開發:草動系統(三)隨鼠而動

隨風而動是一種感覺,能夠很好的展現就已經可以,很多朋友提出了各種方法可以使得隨風而動更加自然,相信都能夠實現,而且效果比我的還好,寫此文之目的就是開拓一下思路,能夠用一些簡單的方法,組合出來讓人興奮的效果,而這次,咱們讓草跟着鼠標而動,彷彿是有一個無形的手在撥開草叢:)

這次我們仍然還是使用網格的區塊劃分,判定鼠標的經過路線,然後對草產生撥動的邏輯,請參看示意圖:

這樣看起來好像很簡單,同樣還是爲了增加效率,只是對應網格上的草纔會執行邏輯,鼠標移動那裏就會觸發,我管這個叫觸動(touch),所以爲了達到相應的效果,首先要對Grass01控件的動畫進行改造,添加如下的代碼到XAML當中的UserControl.Resources當中,這是一段touch效果的動畫

Ani_Touch代碼
  1. <Storyboard x:Name="Ani_Touch" AutoReverse="False"> 
  2. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="LayoutRoot"> 
  3. <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
  4. <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="-1.839"/> 
  5. <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.1"/> 
  6. <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0"/> 
  7. </DoubleAnimationUsingKeyFrames> 
  8. </Storyboard> 
 

然後爲Grass01控件增加公用GrassTouch()方法,這個方法裏僅僅加入了Ani_Touch.Begin()的執行。

現在針對於整個的邏輯添加對應的行爲,我們可以參照上一篇的方法,再寫一套Touch的邏輯比如叫GrassTouchLogic實現,但是那不是很麻煩了嗎?我們發現網絡數據的組成方法和基礎的功能和GrassLogic很一致,所以,我們以繼承GrassLogic,獲得它的特性,這樣僅僅將一些需要的操作數據寫成protected的就可以了。

現在實現一個GrassLogicTouch的類,從GrassLogic繼承:

GrassLogicTouch類代碼
  1. public class GrassLogicTouch : GrassLogic  
  2. {  
  3. DispatcherTimer TouchTimer = new DispatcherTimer();  
  4.  
  5. public GrassLogicTouch(int arrayW, int arrayH, int rangeW, int rangeH)  
  6. :base(arrayW, arrayH, rangeW, rangeH)  
  7. {  
  8. TouchTimer.Tick += new EventHandler(TouchTimer_Tick);  
  9. TouchTimer.Interval = TimeSpan.FromMilliseconds(10);  
  10. }  
  11.  
  12. void TouchTimer_Tick(object sender, EventArgs e)  
  13. {  
  14. TouchTimer.Stop();  
  15. }  
  16.  
  17. public void ITouchGrass(Point pt)  
  18. {  
  19. if (!TouchTimer.IsEnabled)  
  20. {  
  21. TouchTimer.Start();  
  22. if (pt.X > RangeW || pt.Y > RangeH || pt.X < 0 || pt.Y < 0)  
  23. return;  
  24. int tx = (int)pt.X / (base.RangeW / base.ArrayW);  
  25. int ty = (int)pt.Y / (base.RangeH / base.ArrayH);  
  26. List<Grass01> items = GrassBuffArray[ty, tx];  
  27. if (items != null)  
  28. {  
  29. foreach (var item in items)  
  30. {  
  31. item.GrassTouch();  
  32. }  
  33. }  
  34. }  
  35. }  
  36. }  
  37.    
  38.  
這裏其實很簡單,我們使用ITouchGrass來完成觸動邏輯,傳入的參數就是鼠標的座標點,但是爲了避免鼠標移動的過於頻繁,而造成不停的觸發事件,我們加入了一個間隔爲10毫秒TouchTimer來控制,達到在10毫秒內再觸發的時候是無效的,這個方法一般用於類似鼠標雙擊的判定,但是很好用,能夠降低鼠標產生的額外開銷,可以修改這個值看看效果。

現在對MainPage進行一下修改:

_GrassLogic從GrassLogic變成GrassLogicTouch類

構造函數中_GrassLogic.StartWave();去掉

加入鼠標的移動事件:

  1. this.MouseMove += new MouseEventHandler(MainPage_MouseMove);  
  2.  
  3. void MainPage_MouseMove(object sender, MouseEventArgs e)  
  4. {  
  5. _GrassLogic.ITouchGrass(e.GetPosition(_Image));  
  6. }  
  7.  

很好,可能還有一些小的修改,但是大體上就只有這些,然後運行一下看看吧:

源代碼下載地址在這裏:草動系統(三)隨鼠而動

到此草動效果已經寫,也許還有更多豐富的效果,比如人走過的時候會觸動草,使用技能的時候會觸動草,這樣的延伸之效果完全取決我們的想象力,好的事物並不一定複雜,複雜的事物不一定就是好,當我們寫下長長代碼的時候,是否靜下心來想想這些有趣的小玩意呢?細節決定成敗,至此特別向深藍色右手錶示深切的感謝,讓我們將Silverlight之光炫耀起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章