首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当布尔值被更改,但不更改回时,使某些事情发生

当布尔值被更改,但不更改回时,使某些事情发生
EN

Stack Overflow用户
提问于 2014-05-03 21:24:29
回答 1查看 1K关注 0票数 0

我需要这样做,以便当我的布尔值更改为任何它不是,一些事情发生了几秒钟,然后停止,即使布尔没有改变回来。

我还没想出办法让事情发生几秒钟。检查也在不断地进行,所以一旦布尔值发生变化,运动就会开始,而不会停止。

我可能听起来不太清楚所以你可以问更具体的问题..。

编辑:因为有几个人问我,我特别需要一些游戏对象向下移动几秒钟,然后停下来,回到水平移动(想想太空入侵者)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-03 21:32:10

您应该通过使用一个处理逻辑的公共访问器和一个私有备份字段来查看属性

代码语言:javascript
复制
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反复运行代码,直到它到达某个时间为止。举例如下:

代码语言:javascript
复制
Timer timer = new Timer(3000);
timer.Elapsed += (object sender, ElapsedEventArgs e) => { Console.WriteLine("Something"); };
timer.Enabled = true;
代码语言:javascript
复制
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超过所需的时间为止。

代码语言:javascript
复制
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
     }
}

这确实取决于你想要做什么,但这是一个通用的解决方案。(因为你的意思是在时间结束之前运行一些东西,完全停止操作?或者重复一次行动直到时间结束?)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23449992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档