public MapLayer(Game game, LayerServiceConfig config) : base(game, config) { Transform = Matrix.Transformation(Vector3.Zero, Quaternion.Identity, Vector3.One, Vector3.Zero, Quaternion.Identity, Vector3.Zero); sb = Game.GetService<SpriteBatch>(); RegisterMapSources(); CurrentMapSource = MapSources[0]; //Game.InputDevice.MouseMove += InputDeviceOnMouseMove; InitShaderAndBuffer(); }
public override void Update(GameTime gameTime) { var rs = Game.GraphicsDevice; Vector3 scale, translation; Quaternion rotation; Transform.Decompose(out scale, out rotation, out translation); Offset = new Vector2(translation.X, translation.Y); Zoom = scale.X * 1280; //rs.DebugStrings.Add("Offset :" + Offset); //rs.DebugStrings.Add("Zoom :" + Zoom); var oldProj = CurrentMapSource.Projection; CurrentMapSource.Update(gameTime); CurrentMapSource = MapSources[(int)Config.MapSource]; if (!oldProj.Equals(CurrentMapSource.Projection)) { if (OnProjectionChanged != null) { OnProjectionChanged.Invoke(this); } } var ms = Game.InputDevice.GlobalMouseOffset; int wheelDelta = Game.InputDevice.TotalMouseScroll - oldMouseScroll; if (wheelDelta > 0) { ZoomMap(new Vector2(ms.X, ms.Y), 1.1f); } else if (wheelDelta < 0) { ZoomMap(new Vector2(ms.X, ms.Y), 0.9f); } oldMouseScroll = Game.InputDevice.TotalMouseScroll; int vw = rs.DisplayBounds.Width; int vh = rs.DisplayBounds.Height; CenterPositionScreen = new Vector2(vw / 2, vh / 2); CenterPositionMercator = (CenterPositionScreen - Offset) / Zoom; if (CurrentMapSource is YandexMap) { //CenterPositionWorld = MercatorProjectionYandex.Instance.TileToWorldPos((double)CenterPositionMercator.X * 256.0, (double)CenterPositionMercator.Y * 256.0, 0); } else { CenterPositionWorld = GeoHelper.TileToWorldPos(CenterPositionMercator.X, CenterPositionMercator.Y, 0); } DragToCenterPositionWorld(); float currentLevel = Zoom / CurrentMapSource.TileSize; Level = (float)Math.Log(currentLevel, 2); base.Update(gameTime); }