65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的飞镖盘用户控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (15投票s)

2003年10月27日

2分钟阅读

viewsIcon

97670

downloadIcon

2835

展示了一个可以点击并返回投掷得分的飞镖盘。

引言

我和朋友们在家玩飞镖时,我们都会带上一台笔记本电脑来记录分数和统计数据。我们之前用 Excel 完成这项工作,但后来我被鼓励构建一个更复杂的解决方案。因此,我想到通过点击飞镖盘图片来计算投掷的分数和统计数据。所以这篇文章展示了用户控件以及我使用的委托/事件。

使用代码

这个挑战中有两个有趣的部分

  • 如何根据在飞镖盘上的某个位置的点击来确定分数;
  • 使用委托和事件;

对于第一部分,我将公牛的中心(即图片的中心)作为我的基准点 (0,0)。由于我知道 X 和 Y 坐标,我可以使用 atan() 函数来计算角度。

double  dblHoekInRadians  = System.Math.Atan2(  posY ,  posX  );
double  dblHoekInGraden  = dblHoekInRadians * 180 / System.Math.PI;

当我了解角度时,我就知道点击了哪个数字。飞镖盘有 20 个大小相等的扇区。因此,每个扇区为 360 / 20 = 18 度。请记住,中心是我的基准点,所以数字 13 位于 9 和 27 度之间,数字 4 位于 27 和 45 度之间。

接下来要做的是检查点击了哪个环(公牛、三倍、双倍或其他只是单倍)。我计算了从基准点 (0,0) 到点击的 X,Y 坐标的距离。现在,毕达哥拉斯要登场了!

double  dblLengte  = System.Math.Sqrt(  posX * posX  +  posY * posY );
int  intLengte  = (int)System.Math.Floor(  dblLengte  );

好吧,这部分比较难。

接下来是开发一些要引发的事件。我选择使用 4 个事件:NoScoreThrownSingleScoreThrownDoubleScoreThrown TripleScoreThrown。我这样声明它们

public event NoScoreThrownEventHandler  NoScoreThrown ;
protected virtual void OnNoScoreThrown( DartbordEventArgs  e  )
{
  if(  NoScoreThrown  != null )
  {
    NoScoreThrown( this,  e  );
  }
}

对于这些事件,我使用了 4 个委托

//Declare the delegates for each event
public delegate void NoScoreThrownEventHandler( object  sender , 
  DartbordEventArgs  e  );
public delegate void SingleThrownEventHandler( object  sender , 
  DartbordEventArgs  e  );
public delegate void DoubleThrownEventHandler( object  sender , 
  DartbordEventArgs  e  );
public delegate void TripleThrownEventHandler( object  sender , 
  DartbordEventArgs  e  );

我还定义了我自己的 EventArgs ,其中包含有关分数和投掷的特定数据。

  /// <SUMMARY>
  /// Holds data about the score and throw
  /// </SUMMARY>
  public class  DartbordEventArgs  : EventArgs
  {
    private readonly int  mintScore ;
    private readonly string  mstrScore ;
    private readonly int  mintThrow ;

    //Constructor
    public DartbordEventArgs( int  Score , string  ScoreText , int  Throw  )
    {
      this.mintScore =  Score ;
      this.mstrScore =  ScoreText ;
      this.mintThrow =  Throw ;
    }

    #region Properties
    public int  Score 
    {
      get
      {
        return mintScore;
      }
    }

    public string  ScoreText 
    {
      get
      {
        return mstrScore;
      }
    }

    public int  Throw 
    {
      get
      {
        return mintThrow;
      }
    }
    #endregion

  }

根据投掷的分数,我引发相应的事件。我使用了一个类变量(boolean)来知道我是否击中了单倍、双倍、三倍或没有得分。

//Raise the event(s)
DartbordEventArgs  dea  = new DartbordEventArgs(  mintScore ,  
  mstrScoreText ,  mintThrow  );

if(  mIsTriple  ) OnTripleThrown( dea );
if(  mIsDouble  ) OnDoubleThrown( dea );
if(  mIsSingle  ) OnSingleThrown( dea );
if(  mIsNoScore  ) OnNoScoreThrown( dea );

基本上就是这样。玩得开心!

© . All rights reserved.