簡體   English   中英

Observable.Interval僅針對第一個實例觸發

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM