[英]Observable.Interval only fires for the first instance
我正在尝试在MonoGame中使用反应式扩展。 我不知道这是新事物还是有人在我之前尝试过,但结果好坏参半。
我的情况如下。 我有一堆SpaceShips
,每2秒投下一颗炸弹。 这是我的工作:
class SpaceShip
{
private IDisposable bombDropper;
public SpaceShip()
{
bombDropper = Observable.Interval(TimeSpan.FromSeconds(2))
.ObserveOn(Dispatcher.CurrentDispatcher)
.Subscribe(_ =>
{
if (Top + Height + 20 < Constants.GroundTop)
{
Stage.AddRelative(new Bomb(), this, RelativePosition.Bottom);
}
});
}
}
问题在于只有第一个太空船投下炸弹。 为什么? 每个SpaceShip
实例都不相同,每个实例都有其自己的可观察性,但只有第一个是触发事件!
有人告诉我:
我有点怀疑您的调度程序没有更新或在调度程序的同一线程上阻塞,不确定单机游戏是否会有调度程序调度程序往往是Windows的事情。
所以我的问题是:我该如何解决此代码?
我已经解决了这个问题! 你猜怎么了? 它与SpaceShip本身无关,但是与它们的生成方式有关!
enemyAdder = Observable.Interval(TimeSpan.FromSeconds(3)).Subscribe(_ => this.Add(new Ship()
{
Top = Utils.Random.Next((int) Constants.GroundTop),
Left = width,
}));
此订阅生成的空间每3秒发送一次,但由于某种原因,我忘记了ObserveOn
部分。
这是固定版本:
enemyAdder = Observable.Interval(TimeSpan.FromSeconds(3)).ObserveOn(Dispatcher.CurrentDispatcher).Subscribe(_ => this.Add(new Ship()
{
Top = Utils.Random.Next((int) Constants.GroundTop),
Left = width,
}));
使用ObserveOn,它可以工作! 我不知道为什么没有它会起作用。 也许我只是幸运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.