public NextBubblesViewModel( BubbleView.Factory bubbleViewFactory, BoardView boardView, BoardViewModel boardViewModel, GameConfig.BoardSettings boardSettings) { _bubbleViewFactory = bubbleViewFactory; _boardView = boardView; _boardViewModel = boardViewModel; _boardSettings = boardSettings; _nextBubbles = new ReactiveCollection <BubbleViewModel>().AddTo(Disposer); _serialDisposable = new SerialDisposable().AddTo(Disposer); FillNextBubbles(); NextBubbles.ObserveAnyChange() .OncePerFrame() .Subscribe(_ => FillNextBubbles()) .AddTo(Disposer); }
public BoardViewModel(GameConfig.BoardSettings boardSetting, BubbleView.Factory bubbleViewFactory, AudioService audioService) { _minBounds = boardSetting.Min; _maxBounds = boardSetting.Max; _maxSpawnExponent = boardSetting.InitialMaxSpawnExponent + 2; _minNumberOfBubbles = boardSetting.MinNumberOfBubbles; _explosionExponent = boardSetting.ExplosionExponent; _bubbleViewFactory = bubbleViewFactory; _audioService = audioService; _isInitialized = new ReactiveProperty <bool>().AddTo(Disposer); _isMerging = new ReactiveProperty <bool>().AddTo(Disposer); _currentTopGridY = new ReactiveProperty <int>().AddTo(Disposer); _bubbleViewModels = new ReactiveDictionary <Vector2Int, BubbleViewModel>().AddTo(Disposer); _mergeSubscriptionDisposer = new CompositeDisposable().AddTo(Disposer); _bubbleAddedSerialDisposable = new SerialDisposable().AddTo(Disposer); IsInitialized .IfTrue() .Subscribe(_ => UpdateConnectedToCeiling()).AddTo(Disposer); BubbleViewModels .ObserveAnyChange() .OncePerFrame() .Where(_ => IsInitialized.Value) .DelayFrame(1) .Subscribe(_ => OnBubblesCountChanged()).AddTo(Disposer); CurrentTopGridY .SkipLatestValueOnSubscribe() .Where(_ => IsInitialized.Value) .OncePerFrame() .Subscribe(OnCurrentTopYChanged).AddTo(Disposer); IsMerging .SkipLatestValueOnSubscribe() .IfFalse() .OncePerFrame() .Subscribe(_ => TriggerExplosions()) .AddTo(Disposer); }