我正在尝试将反应式扩展与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,
}));
使用观察器,它可以工作!我想知道为什么没有它它就有效。也许我只是运气好。