【问题标题】:Observable.Interval only fires for the first instanceObservable.Interval 仅对第一个实例触发
【发布时间】:2019-09-17 08:52:41
【问题描述】:

我正在尝试将响应式扩展与 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 的每个实例都是不同的,每个实例都有自己的 observable,但只有第一个是触发事件!

有人告诉我这个:

我有点怀疑您的调度程序没有更新或 在调度程序的同一线程上阻塞不确定是否单声道游戏 会有一个dispatcher 调度器往往是一个非常Windows 的东西

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

【问题讨论】:

    标签: c# .net reactive-programming system.reactive monogame


    【解决方案1】:

    我已经解决了这个问题!你猜怎么了?它与 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,它可以工作!我想知道为什么没有它它会起作用。也许我只是幸运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      相关资源
      最近更新 更多