繁体   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