C# 中的飞镖盘用户控件






4.70/5 (15投票s)
2003年10月27日
2分钟阅读

97670

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 个事件:NoScoreThrown
、SingleScoreThrown
、DoubleScoreThrown
和 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 );
基本上就是这样。玩得开心!