天天看點

遊戲人生Silverlight(3) - 打蒼蠅[Silverlight 2.0(c#)]

<a href="http://down.51cto.com/data/101271" target="_blank">[源碼下載下傳]</a>

遊戲人生Silverlight(3) - 打蒼蠅[Silverlight 2.0(c#)]

介紹

使用 Silverlight 2.0(c#) 開發一個打蒼蠅的遊戲

玩法

用滑鼠控制瞄準鏡的移動,滑鼠左鍵開火

線上DEMO

思路

1、蒼蠅的移動軌迹用一個簡單的公式計算,即正弦波。正弦波的公式:y = A * sin(ωx + φ)

2、蒼蠅控件使用MVP(Model - View - Presenter)模式開發,其目的隻是為了說明如何在Silverlight中應用MVP模式

關鍵代碼

1、蒼蠅控件的Model

IFlyModel.cs

using System; 

using System.Net; 

using System.Windows; 

using System.Windows.Controls; 

using System.Windows.Documents; 

using System.Windows.Ink; 

using System.Windows.Input; 

using System.Windows.Media; 

using System.Windows.Media.Animation; 

using System.Windows.Shapes; 

namespace YYFly.Model 

        public interface IFlyModel 

        { 

                /// &lt;summary&gt; 

                /// 讓一隻蒼蠅開始飛 

                /// &lt;/summary&gt; 

                void Start(); 

                /// 讓一隻蒼蠅停止飛 

                void Stop(); 

                /// 計分方法 

                void Score(); 

                /// 蒼蠅改變位置所觸發的事件 

                event EventHandler&lt;FlyEventArgs&gt; FlyChanging; 

        } 

}

FlyModel.cs

using System.Windows.Threading; 

        public class FlyModel : IFlyModel 

                private DispatcherTimer timer; // 改變蒼蠅位置的計時器 

                private SineWave sineWave; // 蒼蠅的運動軌迹(正弦波)的參數 

                private FlyEventArgs evt; // 蒼蠅的位置參數 

                private Random random;    

                private double minX = -100, minY = 40, maxY = 300, minZ = 0.1, maxZ = 0.5; 

                private static readonly object objLock = new object(); 

                public FlyModel() 

                { 

                        timer = new DispatcherTimer(); 

                        timer.Tick += new EventHandler(timer_Tick); 

                        timer.Interval = new TimeSpan(0, 0, 0, 0, 33); 

                } 

                void InitData() 

                        random = new Random(); 

                        sineWave = new SineWave 

                        { 

                                A = random.Next(40, 60), 

                                OffsetY = random.Next((int)minY, (int)maxY), 

                                Omega = 1d / random.Next(20, 50), 

                                Phi = random.Next((int)minX * 2, (int)minX), 

                        }; 

                        evt = new FlyEventArgs() 

                                X = minX, 

                                Z = (minZ + maxZ) / 2, 

                                Z_Out = Convert.ToBoolean(random.Next(0, 2)) 

                void timer_Tick(object sender, EventArgs e) 

                        evt.X += Singleton&lt;Scorer&gt;.Instance.Level * 1.5; 

                        evt.Y = sineWave.OffsetY + sineWave.A * Math.Sin(sineWave.Omega * evt.X + sineWave.Phi); 

                        if (evt.Z_Out) 

                                if (evt.Z &lt; maxZ) 

                                        evt.Z += random.Next(0, 3) / 200d; 

                                else 

                                        evt.Z_Out = false; 

                        } 

                        else 

                                if (evt.Z &gt; minZ) 

                                        evt.Z -= random.Next(0, 3) / 200d; 

                                        evt.Z_Out = true; 

                        OnFlyChanging(evt); 

                public void Start() 

                        InitData(); 

                        timer.Start(); 

                public void Stop() 

                        timer.Stop(); 

                public void Score() 

                        try 

                                lock (objLock) 

                                { 

                                        Singleton&lt;Scorer&gt;.Instance.Score += 1; 

                                        Singleton&lt;Scorer&gt;.Instance.Level = (int)Singleton&lt;Scorer&gt;.Instance.Score / 10 + 1; 

                                } 

                        finally {} 

                public event EventHandler&lt;FlyEventArgs&gt; FlyChanging; 

                protected virtual void OnFlyChanging(FlyEventArgs e) 

                        EventHandler&lt;FlyEventArgs&gt; handler = FlyChanging; 

                        if (handler != null) 

                                handler(this, e); 

2、蒼蠅控件的View

IFlyView.cs

namespace YYFly.View 

        public interface IFlyView 

                /// 更新蒼蠅的位置 

                /// &lt;param name="x"&gt;X 軸坐标&lt;/param&gt; 

                /// &lt;param name="y"&gt;Y 軸坐标&lt;/param&gt; 

                /// &lt;param name="z"&gt;Z 軸方向上的縮放比例&lt;/param&gt; 

                void Update(double x, double y, double z); 

                /// 蒼蠅開始飛的事件處理器 

                event EventHandler Start; 

                /// 蒼蠅停止飛的事件處理器 

                event EventHandler Stop; 

                /// 打死蒼蠅後的計分事件 

                event EventHandler Score; 

Fly.xaml.cs

        public partial class Fly : UserControl, IFlyView 

                public Fly() 

                        InitializeComponent(); 

                        this.Loaded += new RoutedEventHandler(Fly_Loaded); 

                void Fly_Loaded(object sender, RoutedEventArgs e) 

                public void Update(double x, double y, double z) 

                        fly.SetValue(Canvas.LeftProperty, x); 

                        fly.SetValue(Canvas.TopProperty, y); 

                        st.ScaleX = st.ScaleY = z; 

                /// 打到蒼蠅後 

                /// &lt;param name="sender"&gt;&lt;/param&gt; 

                /// &lt;param name="e"&gt;&lt;/param&gt; 

                private void fly_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 

                        if (aniWing.GetCurrentState() != ClockState.Stopped) 

                                aniFlyDisappear.Begin(); 

                                OnScore(); 

                /// 蒼蠅消失的動畫結束後 

                private void aniFlyDisappear_Completed(object sender, EventArgs e) 

                        OnStop(); 

                /// 初始化蒼蠅的位置 

                public void InitPosition() 

                        fly.SetValue(Canvas.LeftProperty, -300d); 

                public event EventHandler Start; 

                public void OnStart() 

                        InitPosition(); 

                        aniFlyDisappear.Stop(); 

                        if (Start != null) 

                                Start(this, EventArgs.Empty); 

                public event EventHandler Stop; 

                public void OnStop() 

                        if (Stop != null) 

                                Stop(this, EventArgs.Empty); 

                public event EventHandler Score; 

                public void OnScore() 

                        if (Score != null) 

                                Score(this, EventArgs.Empty); 

3、蒼蠅控件的Presenter

FlyPresenter.cs

using YYFly.Model; 

using YYFly.View; 

namespace YYFly.Presenter 

        /// &lt;summary&gt; 

        /// Model - View - Presenter 模式中的 Presenter 

        /// &lt;/summary&gt; 

        public class FlyPresenter 

                public FlyPresenter(IFlyView flyView, IFlyModel flyModel) 

                        FlyView = flyView; 

                        FlyModel = flyModel; 

                        FlyView.Start += new EventHandler(FlyView_Start); 

                        FlyView.Stop += new EventHandler(FlyView_Stop); 

                        flyView.Score += new EventHandler(flyView_Score); 

                        FlyModel.FlyChanging += new EventHandler&lt;FlyEventArgs&gt;(FlyModel_FlyChanging); 

                void FlyView_Start(object sender, EventArgs e) 

                        FlyModel.Start(); 

                void FlyView_Stop(object sender, EventArgs e) 

                        FlyModel.Stop(); 

                void flyView_Score(object sender, EventArgs e) 

                        FlyModel.Score(); 

                void FlyModel_FlyChanging(object sender, FlyEventArgs e) 

                        FlyView.Update(e.X, e.Y, e.Z); 

                public IFlyView FlyView { get; set; } 

                public IFlyModel FlyModel { get; set; } 

OK

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/345626,如需轉載請自行聯系原作者

繼續閱讀