遊戲人生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
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
    
{
        
/// <summary>
        
/// 讓一隻蒼蠅開始飛
        
/// </summary>

        void Start();
        
/// <summary>
        
/// 讓一隻蒼蠅停止飛
        
/// </summary>

        void Stop();
        
/// <summary>
        
/// 計分方法
        
/// </summary>

        void Score();

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

        event EventHandler<FlyEventArgs> FlyChanging;
    }

}


FlyModel.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;
using System.Windows.Threading;

namespace YYFly.Model
{
    
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(000033);
        }


        
void InitData()
        
{
            random 
= new Random();

            sineWave 
= new SineWave
            
{
                A 
= random.Next(4060),
                OffsetY 
= random.Next((int)minY, (int)maxY),
                Omega 
= 1d / random.Next(2050),
                Phi 
= random.Next((int)minX * 2, (int)minX),
            }
;

            evt 
= new FlyEventArgs()
            
{
                X 
= minX,
                Z 
= (minZ + maxZ) / 2,
                Z_Out 
= Convert.ToBoolean(random.Next(02))
            }
;
        }


        
void timer_Tick(object sender, EventArgs e)
        
{
            evt.X 
+= Singleton<Scorer>.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 < maxZ)
                    evt.Z 
+= random.Next(03/ 200d;
                
else
                    evt.Z_Out 
= false;
            }

            
else
            
{
                
if (evt.Z > minZ)
                    evt.Z 
-= random.Next(03/ 200d;
                
else
                    evt.Z_Out 
= true;
            }


            OnFlyChanging(evt);
        }


        
public void Start()
        
{
            InitData();
            timer.Start();
        }


        
public void Stop()
        
{
            timer.Stop();
        }


        
public void Score()
        
{
            
try
            
{
                
lock (objLock)
                
{
                    Singleton
<Scorer>.Instance.Score += 1;
                    Singleton
<Scorer>.Instance.Level = (int)Singleton<Scorer>.Instance.Score / 10 + 1;
                }

            }

            
finally {}
        }


        
public event EventHandler<FlyEventArgs> FlyChanging;
        
protected virtual void OnFlyChanging(FlyEventArgs e)
        
{
            EventHandler
<FlyEventArgs> handler = FlyChanging;
            
if (handler != null)
                handler(
this, e);
        }

    }

}



2、蒼蠅控件的View
IFlyView.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.View
{
    
public interface IFlyView
    
{
        
/// <summary>
        
/// 更新蒼蠅的位置
        
/// </summary>
        
/// <param name="x">X 軸座標</param>
        
/// <param name="y">Y 軸座標</param>
        
/// <param name="z">Z 軸方向上的縮放比例</param>

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

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

        event EventHandler Start;
        
/// <summary>
        
/// 蒼蠅停止飛的事件處理器
        
/// </summary>

        event EventHandler Stop;
        
/// <summary>
        
/// 打死蒼蠅後的計分事件
        
/// </summary>

        event EventHandler Score;
    }

}


Fly.xaml.cs
using System;
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.View
{
    
public partial class Fly : UserControl, IFlyView
    
{
        
public Fly()
        
{
            InitializeComponent();

            
this.Loaded += new RoutedEventHandler(Fly_Loaded);
        }


        
void Fly_Loaded(object sender, RoutedEventArgs e)
        
{
            
        }


        
/// <summary>
        
/// 更新蒼蠅的位置
        
/// </summary>
        
/// <param name="x">X 軸座標</param>
        
/// <param name="y">Y 軸座標</param>
        
/// <param name="z">Z 軸方向上的縮放比例</param>

        public void Update(double x, double y, double z)
        
{
            fly.SetValue(Canvas.LeftProperty, x);
            fly.SetValue(Canvas.TopProperty, y);
            st.ScaleX 
= st.ScaleY = z;
        }


        
/// <summary>
        
/// 打到蒼蠅後
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void fly_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        
{
            
if (aniWing.GetCurrentState() != ClockState.Stopped)
            
{
                aniFlyDisappear.Begin();

                OnScore();
            }

        }


        
/// <summary>
        
/// 蒼蠅消失的動畫結束後
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void aniFlyDisappear_Completed(object sender, EventArgs e)
        
{
            OnStop();
        }


        
/// <summary>
        
/// 初始化蒼蠅的位置
        
/// </summary>

        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()
        
{
            InitPosition();

            
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 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;

using YYFly.Model;
using YYFly.View;

namespace YYFly.Presenter
{
    
/// <summary>
    
/// Model - View - Presenter 模式中的 Presenter
    
/// </summary>

    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<FlyEventArgs>(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 getset; }
        
public IFlyModel FlyModel getset; }
    }

}



OK
[源碼下載]
發佈了6 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章