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;
}
}