如何在课堂上添加“点击事件”?在C#中

时间:2016-11-19 11:22:15

标签: c# events xna click monogame

所以这就是我有多远。 (我知道的不多)但我有这样的事情: 一个叫做“SplashScreen”的课程

private DynamicButton dynButton;

public override void Init(ContentManager Content)
    {
        base.Init(Content);

        dynButton = new DynamicButton("Test", new Vector2(450, 100), Color.White);} 

private void Dyn_Click(object sender, EventArgs e)
    {
        dynButton.ObjColor = Color.DarkOrange; //I want to do stuff here
    }

public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
        dynButton.Update(gameTime);
        dynButton.Click += Dyn_Click;
    }

在我的Dynamic Button类中,如下所示:

   public event EventHandler Click;

   public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
        this.Click += DynamicButton_Click;
    }

    private void DynamicButton_Click(object sender, EventArgs e)
    {

    }

我真的不知道如何正确使用Click事件。所以就像我必须用鼠标检查对象的边界,这就是我所知道的,但我怎样才能使事件发生。我只想打电话像dynButton.Click + = myMethod,在这个方法中我会做的事情。希望你明白我的意思。(我很新)

1 个答案:

答案 0 :(得分:0)

Xna和Monogame在正常情况下(基于设备)每秒调用Update方法30到60次。

这意味着,如果你想使用事件;在方法本身上订阅它们是一个非常糟糕的主意,因为每次都会获得新的订阅。在您发布的代码中,您每秒订阅该事件60次!

public event EventHandler Click;

public override void Update(GameTime gameTime)
{
    base.Update(gameTime);
    this.Click += DynamicButton_Click; // Called 60 times per frame on a PC!
}

我不是说你不应该订阅这种方法,你可以根据条件。永远不要自由。

话虽如此,您想要的是在安全的地方订阅活动,然后在满足条件时启动它。在您的场景中,订阅将在Splash屏幕上进行:

public override void Init(ContentManager Content)
{
    base.Init(Content);

    dynButton = new DynamicButton("Test", new Vector2(450, 100), Color.White);
    dynButton.Click += SomeoneClicked;
} 

private void SomeoneClicked(object sender, EventArgs e)
{
    // Your code here.
}

动态按钮是负责触发事件的按钮(但不响应事件本身)。

public event EventHandler Click;

public override void Update(GameTime gameTime)
{
    base.Update(gameTime);
    if(this.Click != null)
        Click(null, null);
}

您可以在MSDN上找到有关EventHandlers的更多信息。 最后一点,我认为这是你面临的最大问题;你需要知道什么时候发射事件。根据您的评论,您需要根据鼠标的位置检查特定条件,这可以通过MouseState provided methods轻松完成:

MouseState ms = Mouse.GetState();
var positionX = ms.X;
var positionY = ms.Y;