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(); }
public void RemoveObserver(IPositionObserver ob) { try { positionObservers.Remove(ob); } catch { } }
/// <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); }
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; } }); }
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); }); }
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); }); }
public void RegisterObserver(IPositionObserver ob) { positionObservers.Add(ob); }
public LocateCommand(ITileController controller) { _geoPositionObserver = controller; _mapPositionObserver = controller; }
public SearchCommand(ITileController controller, ISearchEngine searchEngine) { _tileController = controller; _geoPositionObserver = controller; _searchEngine = searchEngine; }