示例#1
0
        public void RunGame()
        {
            _logger.Start();

            var config = ConfigBuilder.GetDefault()
                         .Build();

            var componentRoot = TestHelper.GetGameRunner(_container, config);

            _messageBus   = _container.Resolve <IMessageBus>();
            _trace        = _container.Resolve <ITrace>();
            _tileListener = new DemoTileListener(_messageBus, _logger);

            // start game on default position
            componentRoot.RunGame(StartGeoCoordinate);

            _geoPositionObserver = _container.Resolve <ITileController>();
            _mapPositionObserver = _container.Resolve <ITileController>();

            _messageBus.AsObservable <GeoPosition>().Do(position =>
            {
                _trace.Debug(LogTag, "GeoPosition: {0}", position.ToString());
                _geoPositionObserver.OnNext(position.Coordinate);
            }).Subscribe();

            _messageBus.AsObservable <Vector2d>().Do(position =>
            {
                _trace.Debug(LogTag, "MapPosition: {0}", position.ToString());
                _mapPositionObserver.OnNext(position);
            }).Subscribe();
        }
示例#2
0
 public void RemoveObserver(IPositionObserver ob)
 {
     try
     {
         positionObservers.Remove(ob);
     }
     catch { }
 }
示例#3
0
        /// <summary> Runs game. </summary>
        /// <remarks> Do not call this method on UI thread to prevent its blocking. </remarks>
        /// <param name="coordinate">GeoCoordinate for (0,0) map point. </param>
        public void RunGame(GeoCoordinate coordinate)
        {
            var messageBus = _container.Resolve <IMessageBus>();
            // resolve actual position observers
            var tilePositionObserver = _container.Resolve <ITileController>();

            _mapPositionObserver = tilePositionObserver;
            _geoPositionObserver = tilePositionObserver;

            // notify about geo coordinate change
            _geoPositionObserver.OnNext(coordinate);
        }
示例#4
0
        private void Initialize()
        {
            // Setup main thread scheduler
            Scheduler.MainThread = new UnityMainThreadScheduler();

            // Create and register DebugConsole inside Container
            var container = new Container();

            // Create message bus class which is way to listen for ASM events
            _messageBus = new MessageBus();

            // Console is way to debug/investigate app behavior on real devices when
            // regular debugger is not applicable
            InitializeConsole(container);

            // Attach address locator which provides the way to get current address
            AttachAddressLocator();

            // ASM should be started from non-UI thread
            Scheduler.ThreadPool.Schedule(() =>
            {
                try
                {
                    // NOTE These services should be registered inside container before GameRunner is constructed.

                    // Trace implementation
                    container.RegisterInstance(_trace);
                    // Path resolver which knows about current platform
                    container.RegisterInstance <IPathResolver>(new WinPathResolver());
                    // Message bus
                    container.RegisterInstance(_messageBus);

                    // Create ASM entry point with settings provided and register custom plugin which adds
                    // custom logic or replaces default one
                    var gameRunner = new GameRunner(container, @"Config/settings.json")
                                     .RegisterPlugin <DemoBootstrapper>("demo", _messageBus, _trace);

                    // Store position observer which will listen for character movements
                    _positionObserver = gameRunner;

                    // Run ASM logic
                    gameRunner.RunGame(StartPosition);

                    _isInitialized = true;
                }
                catch (Exception ex)
                {
                    _console.LogMessage(new ConsoleMessage("Error running game:" + ex, RecordType.Error, Color.red));
                    throw;
                }
            });
        }
示例#5
0
        void Awake()
        {
            var appManager = ApplicationManager.Instance;
            _geoPositionObserver = appManager.GetService<ITileController>();
            _messageBus = appManager.GetService<IMessageBus>();
            _trace = appManager.GetService<ITrace>();

            var elevationProvider = appManager.GetService<IElevationProvider>();

            _messageBus.AsObservable<GeoPosition>()
                .SubscribeOn(Scheduler.ThreadPool)
                .Do(position =>
                {
                    _trace.Info(CategoryName, "GeoPosition: {0}", position.ToString());
                    // notify ASM about position change to process tiles
                    _geoPositionObserver.OnNext(position.Coordinate);
                    // calculate new world position
                    var mapPoint = GeoProjection.ToMapCoordinate(appManager.Coordinate, position.Coordinate);
                    var elevation = elevationProvider.GetElevation(position.Coordinate);
                    var worldPosition = new Vector3((float)mapPoint.X, elevation, (float)mapPoint.Y);
                    // set transform on UI thread
                    Observable.Start(() => transform.position = worldPosition, Scheduler.MainThread);

                }).Subscribe();

            _messageBus.AsObservable<TileLoadFinishMessage>()
                .Take(1)
                .ObserveOnMainThread()
                .Subscribe(_ =>
                {
                    Observable.Start(() =>
                    {
                        // read nmea file with gps data
                        using (Stream stream = new FileStream(GpsTrackFile, FileMode.Open))
                        {
                            _trace.Info(CategoryName, "start to read geopositions from {0}", GpsTrackFile);

                            _mocker = new NmeaPositionMocker(stream, _messageBus);
                            _mocker.OnDone += (s, e) => _trace.Info(CategoryName, "trace is finished");
                            _mocker.Start(Thread.Sleep);
                        }
                    }, Scheduler.ThreadPool);
                });
        }
示例#6
0
        void Awake()
        {
            var appManager = ApplicationManager.Instance;

            _geoPositionObserver = appManager.GetService <ITileController>();
            _messageBus          = appManager.GetService <IMessageBus>();
            _trace = appManager.GetService <ITrace>();

            var elevationProvider = appManager.GetService <IElevationProvider>();

            _messageBus.AsObservable <GeoPosition>()
            .SubscribeOn(Scheduler.ThreadPool)
            .Do(position =>
            {
                _trace.Info(CategoryName, "GeoPosition: {0}", position.ToString());
                // notify ASM about position change to process tiles
                _geoPositionObserver.OnNext(position.Coordinate);
                // calculate new world position
                var mapPoint      = GeoProjection.ToMapCoordinate(appManager.Coordinate, position.Coordinate);
                var elevation     = elevationProvider.GetElevation(position.Coordinate);
                var worldPosition = new Vector3((float)mapPoint.X, elevation, (float)mapPoint.Y);
                // set transform on UI thread
                Observable.Start(() => transform.position = worldPosition, Scheduler.MainThread);
            }).Subscribe();

            _messageBus.AsObservable <TileLoadFinishMessage>()
            .Take(1)
            .ObserveOnMainThread()
            .Subscribe(_ =>
            {
                Observable.Start(() =>
                {
                    // read nmea file with gps data
                    using (Stream stream = new FileStream(GpsTrackFile, FileMode.Open))
                    {
                        _trace.Info(CategoryName, "start to read geopositions from {0}", GpsTrackFile);

                        _mocker         = new NmeaPositionMocker(stream, _messageBus);
                        _mocker.OnDone += (s, e) => _trace.Info(CategoryName, "trace is finished");
                        _mocker.Start(Thread.Sleep);
                    }
                }, Scheduler.ThreadPool);
            });
        }
示例#7
0
 public void RegisterObserver(IPositionObserver ob)
 {
     positionObservers.Add(ob);
 }
示例#8
0
 public LocateCommand(ITileController controller)
 {
     _geoPositionObserver = controller;
     _mapPositionObserver = controller;
 }
示例#9
0
 public SearchCommand(ITileController controller, ISearchEngine searchEngine)
 {
     _tileController      = controller;
     _geoPositionObserver = controller;
     _searchEngine        = searchEngine;
 }