Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当布尔值更改但未更改回布尔值时,使某些事情发生_C#_Timer_Xna_Boolean_Xna 4.0 - Fatal编程技术网

C# 当布尔值更改但未更改回布尔值时,使某些事情发生

C# 当布尔值更改但未更改回布尔值时,使某些事情发生,c#,timer,xna,boolean,xna-4.0,C#,Timer,Xna,Boolean,Xna 4.0,我需要这样做,当我的布尔值变为非布尔值时,会发生几秒钟的事情,然后停止,即使布尔值没有变回 我还没有想出一个办法让事情发生几秒钟。检查也在不断发生,所以一旦布尔值发生变化,运动就会开始,而不会停止 我可能听起来不太清楚,所以请随意问更具体的问题 编辑:因为有几个人问,我特别需要我的一些游戏对象向下移动几秒钟,然后停止并返回水平移动(想想空间入侵者)。你应该使用一个处理逻辑的公共访问器和一个私人支持字段来查看 public bool Enabled { get { retu

我需要这样做,当我的布尔值变为非布尔值时,会发生几秒钟的事情,然后停止,即使布尔值没有变回

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

我可能听起来不太清楚,所以请随意问更具体的问题

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

你应该使用一个处理逻辑的公共访问器和一个私人支持字段来查看

public bool Enabled
{
    get {
        return enabled;
    }
    set {
        if (value != enabled)
        {
            //Do Something if it changes
        }
        enabled = value;
    }
}
private bool enabled;
获取属性时执行
get
代码(例如:
bool isEnabled=Enabled
),设置属性时调用
set
(例如:
Enabled=false
),请注意,
是向属性赋值时传递的新值

既然您知道了如何在值更改时检查和执行代码,那么我们可以继续讨论几秒钟您想做的“事情”

您可以使用在
System.Timers
()中找到的计时器以一定的间隔运行代码(并在X个间隔后停止),也可以使用
秒表反复运行代码,直到到达某个时间。下面提供的例子

Timer timer = new Timer(3000);
timer.Elapsed += (object sender, ElapsedEventArgs e) => { Console.WriteLine("Something"); };
timer.Enabled = true;

所有这些代码都可以放入一个方法中,并从
set
块调用。(如果需要使用属性的值,则应将其作为参数传递,否则,如果属性发生更改,则可能会遇到问题)

编辑:我没有看到这是一个XNA游戏,在这种情况下,您需要设置开始移动的时间,并一直移动,直到当前时间超过开始时间,加上X数量:

例如:

第三个值名为
enabledChanged
或其他任何值,您可以稍后在
Update
方法中使用该值,以便知道如何开始移动。获取开始移动的时间,并将更改的标志设置回false。然后继续移动,直到当前
游戏时间
超过所需时间

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
     }
}
private bool enabledchange;
私人双星时间;
...
受保护的无效更新(游戏时间游戏时间)
{
if(enabledChanged)//如果我们应该开始移动
{
enabledChanged=false;
startTime=gameTime.TotalGameTime.TotalSeconds;
}

如果(gameTime.ElapsedGameTime.TotalSeconds正确,您可以保存布尔值的最后一个值,如果它不等于当前值,则将新的布尔值设置为true

bool myBool = false;
bool lastValue = myBool;
bool doRunning = false;    

// Your loop
while (true) {
   .....
   if (myBool != lastValue) {
       doRunning = true;
       lastValue = myBool;
   }
}

我怀疑这个问题的解决方案相当依赖于“某事”到底是什么……巴里克,我需要游戏对象向下几秒钟,然后停止并返回水平移动。作为“当前”值,还是第二次更改时的实际状态?@barrick当“某物”被更改时,它将不会再次更改happening@FTE“某物”具体是什么?如果我知道你想做什么,我可能会写一个更好的答案。@Cyral我需要游戏对象向下移动几秒钟,然后停止并返回水平移动。@Cyral好吧,我最初把C#/XNA放在标题中,但人们不停地删除它,所以这不是经常运行吗?你必须更详细地解释它。
bool myBool = false;
bool lastValue = myBool;
bool doRunning = false;    

// Your loop
while (true) {
   .....
   if (myBool != lastValue) {
       doRunning = true;
       lastValue = myBool;
   }
}