我需要这样做,以便当我的布尔值更改为任何它不是,一些事情发生了几秒钟,然后停止,即使布尔没有改变回来。
我还没想出办法让事情发生几秒钟。检查也在不断地进行,所以一旦布尔值发生变化,运动就会开始,而不会停止。
我可能听起来不太清楚所以你可以问更具体的问题..。
编辑:因为有几个人问我,我特别需要一些游戏对象向下移动几秒钟,然后停下来,回到水平移动(想想太空入侵者)。
发布于 2014-05-03 21:32:10
您应该通过使用一个处理逻辑的公共访问器和一个私有备份字段来查看属性。
public bool Enabled
{
get {
return enabled;
}
set {
if (value != enabled)
{
//Do Something if it changes
}
enabled = value;
}
}
private bool enabled;当您获得属性(Ex:bool isEnabled = Enabled)时,将执行get代码,而当您设置属性(Ex:Enabled = false)时,将调用set。注意,value是在向属性赋值时传递的新值。
既然您已经知道了如何在值更改时检查和执行代码,我们就可以继续讨论您想要做的“事情”几秒钟了。
您可以使用在Timer中找到的System.Timers (教程)以间隔运行代码(在X间隔之后停止),也可以使用StopWatch反复运行代码,直到它到达某个时间为止。举例如下:
Timer timer = new Timer(3000);
timer.Elapsed += (object sender, ElapsedEventArgs e) => { Console.WriteLine("Something"); };
timer.Enabled = true;Stopwatch stopWatch = new Stopwatch();
stopWatch.Restart();
while (true)
{
//If 3 seconds have elapsed, stop the operation
if (stopWatch.ElapsedMilliseconds > 3000)
{
stopWatch.Stop();
break;
}
//Do stuff repeatedly
Console.WriteLine("Something");
}所有这些代码都可以放在一个方法中,并从set块中调用。(如果需要使用该属性值,则应将其作为参数传递,否则如果发生更改,可能会遇到问题)
编辑:我没有看到这是XNA游戏,在这种情况下,您需要设置开始移动的时间,并一直移动到当前时间超过开始时间,加上X值:
示例:
有一个名为enabledChanged或其他什么的第三个值,您可以在稍后的Update方法中使用该值,以便知道如何开始移动。获取开始移动并将更改后的标志设置为false的时间。然后继续移动,直到当前GameTime超过所需的时间为止。
private bool enabledChanged;
private double startTime;
...
protected void Update(GameTime gameTime)
{
if (enabledChanged) //If we should start moving
{
enabledChanged = false;
startTime = gameTime.TotalGameTime.TotalSeconds;
}
if (gameTime.ElapsedGameTime.TotalSeconds <= startTime + 3) //If time is less than start time, plus 3 seconds, move
{
//Move object
}
}这确实取决于你想要做什么,但这是一个通用的解决方案。(因为你的意思是在时间结束之前运行一些东西,完全停止操作?或者重复一次行动直到时间结束?)
https://stackoverflow.com/questions/23449992
复制相似问题