[英]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.