游戏人生Silverlight(3) - 打苍蝇[Silverlight 2.0(c#)]

[源码下载]


游戏人生Silverlight(3) - 打苍蝇[Silverlight 2.0(c#)]


作者: webabcd


介绍
使用 Silverlight 2.0(c#) 开发一个打苍蝇的游戏


玩法
用鼠标控制瞄准镜的移动,鼠标左键开火


在线DEMO



思路
1、苍蝇的移动轨迹用一个简单的公式计算,即正弦波。正弦波的公式:y = A * sin(ωx + φ)
2、苍蝇控件使用MVP(Model - View - Presenter)模式开发,其目的只是为了说明如何在Silverlight中应用MVP模式


关键代码
1、苍蝇控件的Model
IFlyModel.cs
InBlock.gif using System; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Ink; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif namespace YYFly.Model 
InBlock.gif
InBlock.gif         public  interface IFlyModel 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 让一只苍蝇开始飞 
InBlock.gif                 /// </summary> 
InBlock.gif                 void Start(); 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 让一只苍蝇停止飞 
InBlock.gif                 /// </summary> 
InBlock.gif                 void Stop(); 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 计分方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 void Score(); 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 苍蝇改变位置所触发的事件 
InBlock.gif                 /// </summary> 
InBlock.gif                 event EventHandler<FlyEventArgs> FlyChanging; 
InBlock.gif        } 
InBlock.gif}
 
FlyModel.cs
InBlock.gif using System; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Ink; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif using System.Windows.Threading; 
InBlock.gif 
InBlock.gif namespace YYFly.Model 
InBlock.gif
InBlock.gif         public  class FlyModel : IFlyModel 
InBlock.gif        { 
InBlock.gif                 private DispatcherTimer timer;  // 改变苍蝇位置的计时器 
InBlock.gif                 private SineWave sineWave;  // 苍蝇的运动轨迹(正弦波)的参数 
InBlock.gif                 private FlyEventArgs evt;  // 苍蝇的位置参数 
InBlock.gif                 private Random random;    
InBlock.gif                 private  double minX = -100, minY = 40, maxY = 300, minZ = 0.1, maxZ = 0.5; 
InBlock.gif 
InBlock.gif                 private  static  readonly  object objLock =  new  object(); 
InBlock.gif 
InBlock.gif                 public FlyModel() 
InBlock.gif                { 
InBlock.gif                        timer =  new DispatcherTimer(); 
InBlock.gif                        timer.Tick +=  new EventHandler(timer_Tick); 
InBlock.gif                        timer.Interval =  new TimeSpan(0, 0, 0, 0, 33); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void InitData() 
InBlock.gif                { 
InBlock.gif                        random =  new Random(); 
InBlock.gif 
InBlock.gif                        sineWave =  new SineWave 
InBlock.gif                        { 
InBlock.gif                                A = random.Next(40, 60), 
InBlock.gif                                OffsetY = random.Next(( int)minY, ( int)maxY), 
InBlock.gif                                Omega = 1d / random.Next(20, 50), 
InBlock.gif                                Phi = random.Next(( int)minX * 2, ( int)minX), 
InBlock.gif                        }; 
InBlock.gif 
InBlock.gif                        evt =  new FlyEventArgs() 
InBlock.gif                        { 
InBlock.gif                                X = minX, 
InBlock.gif                                Z = (minZ + maxZ) / 2, 
InBlock.gif                                Z_Out = Convert.ToBoolean(random.Next(0, 2)) 
InBlock.gif                        }; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void timer_Tick( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                        evt.X += Singleton<Scorer>.Instance.Level * 1.5; 
InBlock.gif                        evt.Y = sineWave.OffsetY + sineWave.A * Math.Sin(sineWave.Omega * evt.X + sineWave.Phi); 
InBlock.gif 
InBlock.gif                         if (evt.Z_Out) 
InBlock.gif                        { 
InBlock.gif                                 if (evt.Z < maxZ) 
InBlock.gif                                        evt.Z += random.Next(0, 3) / 200d; 
InBlock.gif                                 else 
InBlock.gif                                        evt.Z_Out =  false
InBlock.gif                        } 
InBlock.gif                         else 
InBlock.gif                        { 
InBlock.gif                                 if (evt.Z > minZ) 
InBlock.gif                                        evt.Z -= random.Next(0, 3) / 200d; 
InBlock.gif                                 else 
InBlock.gif                                        evt.Z_Out =  true
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                        OnFlyChanging(evt); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  void Start() 
InBlock.gif                { 
InBlock.gif                        InitData(); 
InBlock.gif                        timer.Start(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  void Stop() 
InBlock.gif                { 
InBlock.gif                        timer.Stop(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  void Score() 
InBlock.gif                { 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                 lock (objLock) 
InBlock.gif                                { 
InBlock.gif                                        Singleton<Scorer>.Instance.Score += 1; 
InBlock.gif                                        Singleton<Scorer>.Instance.Level = ( int)Singleton<Scorer>.Instance.Score / 10 + 1; 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                         finally {} 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  event EventHandler<FlyEventArgs> FlyChanging; 
InBlock.gif                 protected  virtual  void OnFlyChanging(FlyEventArgs e) 
InBlock.gif                { 
InBlock.gif                        EventHandler<FlyEventArgs> handler = FlyChanging; 
InBlock.gif                         if (handler !=  null
InBlock.gif                                handler( this, e); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
2、苍蝇控件的View
IFlyView.cs
InBlock.gif using System; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Ink; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif namespace YYFly.View 
InBlock.gif
InBlock.gif         public  interface IFlyView 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 更新苍蝇的位置 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="x">X 轴坐标</param> 
InBlock.gif                 /// <param name="y">Y 轴坐标</param> 
InBlock.gif                 /// <param name="z">Z 轴方向上的缩放比例</param> 
InBlock.gif                 void Update( double x,  double y,  double z); 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 苍蝇开始飞的事件处理器 
InBlock.gif                 /// </summary> 
InBlock.gif                 event EventHandler Start; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 苍蝇停止飞的事件处理器 
InBlock.gif                 /// </summary> 
InBlock.gif                 event EventHandler Stop; 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 打死苍蝇后的计分事件 
InBlock.gif                 /// </summary> 
InBlock.gif                 event EventHandler Score; 
InBlock.gif        } 
InBlock.gif}
 
Fly.xaml.cs
InBlock.gif using System; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Ink; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif namespace YYFly.View 
InBlock.gif
InBlock.gif         public partial  class Fly : UserControl, IFlyView 
InBlock.gif        { 
InBlock.gif                 public Fly() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                         this.Loaded +=  new RoutedEventHandler(Fly_Loaded); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void Fly_Loaded( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 更新苍蝇的位置 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="x">X 轴坐标</param> 
InBlock.gif                 /// <param name="y">Y 轴坐标</param> 
InBlock.gif                 /// <param name="z">Z 轴方向上的缩放比例</param> 
InBlock.gif                 public  void Update( double x,  double y,  double z) 
InBlock.gif                { 
InBlock.gif                        fly.SetValue(Canvas.LeftProperty, x); 
InBlock.gif                        fly.SetValue(Canvas.TopProperty, y); 
InBlock.gif                        st.ScaleX = st.ScaleY = z; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 打到苍蝇后 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="sender"></param> 
InBlock.gif                 /// <param name="e"></param> 
InBlock.gif                 private  void fly_MouseLeftButtonDown( object sender, MouseButtonEventArgs e) 
InBlock.gif                { 
InBlock.gif                         if (aniWing.GetCurrentState() != ClockState.Stopped) 
InBlock.gif                        { 
InBlock.gif                                aniFlyDisappear.Begin(); 
InBlock.gif 
InBlock.gif                                OnScore(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 苍蝇消失的动画结束后 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="sender"></param> 
InBlock.gif                 /// <param name="e"></param> 
InBlock.gif                 private  void aniFlyDisappear_Completed( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                        OnStop(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 初始化苍蝇的位置 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  void InitPosition() 
InBlock.gif                { 
InBlock.gif                        fly.SetValue(Canvas.LeftProperty, -300d); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  event EventHandler Start; 
InBlock.gif                 public  void OnStart() 
InBlock.gif                { 
InBlock.gif                        InitPosition(); 
InBlock.gif 
InBlock.gif                        aniFlyDisappear.Stop(); 
InBlock.gif 
InBlock.gif                         if (Start !=  null
InBlock.gif                                Start( this, EventArgs.Empty); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  event EventHandler Stop; 
InBlock.gif                 public  void OnStop() 
InBlock.gif                { 
InBlock.gif                        InitPosition(); 
InBlock.gif 
InBlock.gif                         if (Stop !=  null
InBlock.gif                                Stop( this, EventArgs.Empty); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  event EventHandler Score; 
InBlock.gif                 public  void OnScore() 
InBlock.gif                { 
InBlock.gif                         if (Score !=  null
InBlock.gif                                Score( this, EventArgs.Empty); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
3、苍蝇控件的Presenter
FlyPresenter.cs
InBlock.gif using System; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Ink; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif using YYFly.Model; 
InBlock.gif using YYFly.View; 
InBlock.gif 
InBlock.gif namespace YYFly.Presenter 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// Model - View - Presenter 模式中的 Presenter 
InBlock.gif         /// </summary> 
InBlock.gif         public  class FlyPresenter 
InBlock.gif        { 
InBlock.gif                 public FlyPresenter(IFlyView flyView, IFlyModel flyModel) 
InBlock.gif                { 
InBlock.gif                        FlyView = flyView; 
InBlock.gif                        FlyModel = flyModel; 
InBlock.gif 
InBlock.gif                        FlyView.Start +=  new EventHandler(FlyView_Start); 
InBlock.gif                        FlyView.Stop +=  new EventHandler(FlyView_Stop); 
InBlock.gif                        flyView.Score +=  new EventHandler(flyView_Score); 
InBlock.gif 
InBlock.gif                        FlyModel.FlyChanging +=  new EventHandler<FlyEventArgs>(FlyModel_FlyChanging); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void FlyView_Start( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                        FlyModel.Start(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void FlyView_Stop( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                        FlyModel.Stop(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void flyView_Score( object sender, EventArgs e) 
InBlock.gif                { 
InBlock.gif                        FlyModel.Score(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void FlyModel_FlyChanging( object sender, FlyEventArgs e) 
InBlock.gif                { 
InBlock.gif                        FlyView.Update(e.X, e.Y, e.Z); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public IFlyView FlyView { get; set; } 
InBlock.gif                 public IFlyModel FlyModel { get; set; } 
InBlock.gif        } 
InBlock.gif}
 




     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/345626 ,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值