所以这就是我有多远。 (我知道的不多)但我有这样的事情: 一个叫做“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,在这个方法中我会做的事情。希望你明白我的意思。(我很新)
答案 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;