Observable.Interval 仅在第一个实例时触发



我正在尝试将反应式扩展与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的事情

所以我的问题是:如何修复此代码?

我已经解决了这个问题!你猜怎么着?它与宇宙飞船本身无关,而是与它们的生成方式有关!

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

使用观察器,它可以工作!我想知道为什么没有它它就有效。也许我只是运气好。

相关内容

  • 没有找到相关文章

最新更新