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

這次我們仍然還是使用網格的區塊劃分,判定滑鼠的經過路線,然後對草産生撥動的邏輯,請參看示意圖:
這樣看起來好像很簡單,同樣還是為了增加效率,隻是對應網格上的草才會執行邏輯,滑鼠移動那裡就會觸發,我管這個叫觸動(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類代碼
public class GrassLogicTouch : GrassLogic
{
DispatcherTimer TouchTimer = new DispatcherTimer();
public GrassLogicTouch(int arrayW, int arrayH, int rangeW, int rangeH)
:base(arrayW, arrayH, rangeW, rangeH)
TouchTimer.Tick += new EventHandler(TouchTimer_Tick);
TouchTimer.Interval = TimeSpan.FromMilliseconds(10);
}
void TouchTimer_Tick(object sender, EventArgs e)
TouchTimer.Stop();
public void ITouchGrass(Point pt)
if (!TouchTimer.IsEnabled)
TouchTimer.Start();
if (pt.X > RangeW || pt.Y > RangeH || pt.X < 0 || pt.Y < 0)
return;
int tx = (int)pt.X / (base.RangeW / base.ArrayW);
int ty = (int)pt.Y / (base.RangeH / base.ArrayH);
List<Grass01> items = GrassBuffArray[ty, tx];
if (items != null)
foreach (var item in items)
item.GrassTouch();
這裡其實很簡單,我們使用ITouchGrass來完成觸動邏輯,傳入的參數就是滑鼠的坐标點,但是為了避免滑鼠移動的過于頻繁,而造成不停的觸發事件,我們加入了一個間隔為10毫秒TouchTimer來控制,達到在10毫秒内再觸發的時候是無效的,這個方法一般用于類似滑鼠輕按兩下的判定,但是很好用,能夠降低滑鼠産生的額外開銷,可以修改這個值看看效果。
現在對MainPage進行一下修改:
_GrassLogic從GrassLogic變成GrassLogicTouch類
構造函數中_GrassLogic.StartWave();去掉
加入滑鼠的移動事件:
this.MouseMove += new MouseEventHandler(MainPage_MouseMove);
void MainPage_MouseMove(object sender, MouseEventArgs e)
_GrassLogic.ITouchGrass(e.GetPosition(_Image));
很好,可能還有一些小的修改,但是大體上就隻有這些,然後運作一下看看吧:
到此草動效果已經寫,也許還有更多豐富的效果,比如人走過的時候會觸動草,使用技能的時候會觸動草,這樣的延伸之效果完全取決我們的想象力,好的事物并不一定複雜,複雜的事物不一定就是好,當我們寫下長長代碼的時候,是否靜下心來想想這些有趣的小玩意呢?細節決定成敗,至此特别向深藍色右手表示深切的感謝,讓我們将Silverlight之光炫耀起來。
本文轉自nowpaper 51CTO部落格,原文連結:http://blog.51cto.com/nowpaper/712369