/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { if (!this.IsActive) { lostFocus = true; return; } TVUserInput.Update(); if (lostFocus) { // if the previous call was in inactive mode, we do want TVUserInput to be updated, but we will only // act on it the next round. To make sure moving the mouse to other locations and back is influencing // the location visible in trackviewer. lostFocus = false; return; } fontManager.Update(GraphicsDevice); if (DrawTrackDB != null) { // when update is called, we are not searching via menu DrawTrackDB.ClearHighlightOverrides(); } // First check all the buttons that can be kept down. if (this.drawPathChart.IsActived) { if (TVUserInput.IsDown(TVUserCommands.ShiftLeft)) { drawPathChart.Shift(-1); skipDrawAmount = 0; } if (TVUserInput.IsDown(TVUserCommands.ShiftRight)) { drawPathChart.Shift(1); skipDrawAmount = 0; } if (TVUserInput.IsDown(TVUserCommands.ZoomIn)) { drawPathChart.Zoom(-1); skipDrawAmount = 0; } if (TVUserInput.IsDown(TVUserCommands.ZoomOut)) { drawPathChart.Zoom(1); skipDrawAmount = 0; } } else { if (TVUserInput.IsDown(TVUserCommands.ShiftLeft)) { DrawArea.ShiftLeft(); skipDrawAmount = 0; } if (TVUserInput.IsDown(TVUserCommands.ShiftRight)) { DrawArea.ShiftRight(); skipDrawAmount = 0; } if (TVUserInput.IsDown(TVUserCommands.ShiftUp)) { DrawArea.ShiftUp(); skipDrawAmount = 0; } if (TVUserInput.IsDown(TVUserCommands.ShiftDown)) { DrawArea.ShiftDown(); skipDrawAmount = 0; } if (TVUserInput.IsDown(TVUserCommands.ZoomIn)) { DrawArea.Zoom(-1); skipDrawAmount = 0; } if (TVUserInput.IsDown(TVUserCommands.ZoomOut)) { DrawArea.Zoom(1); skipDrawAmount = 0; } } if (TVUserInput.Changed) { skipDrawAmount = 0; } if (TVUserInput.IsPressed(TVUserCommands.Quit)) { this.Quit(); } if (TVUserInput.IsPressed(TVUserCommands.ReloadRoute)) { this.ReloadRoute(); } if (TVUserInput.IsPressed(TVUserCommands.ShiftToMouseLocation)) { DrawArea.ShiftToLocation(DrawArea.MouseLocation); } if (TVUserInput.IsPressed(TVUserCommands.ZoomInSlow)) { DrawArea.Zoom(-1); } if (TVUserInput.IsPressed(TVUserCommands.ZoomOutSlow)) { DrawArea.Zoom(1); } if (TVUserInput.IsPressed(TVUserCommands.ZoomToTile)) { DrawArea.ZoomToTile(); } if (TVUserInput.IsPressed(TVUserCommands.ZoomReset)) { DrawArea.ZoomReset(DrawTrackDB); drawAreaInset.ZoomReset(DrawTrackDB); // needed in case window was resized } if (DrawPATfile != null && Properties.Settings.Default.showPATfile) { if (TVUserInput.IsPressed(TVUserCommands.ExtendPath)) { DrawPATfile.ExtendPath(); } if (TVUserInput.IsPressed(TVUserCommands.ExtendPathFull)) { DrawPATfile.ExtendPathFull(); } if (TVUserInput.IsPressed(TVUserCommands.ReducePath)) { DrawPATfile.ReducePath(); } if (TVUserInput.IsPressed(TVUserCommands.ReducePathFull)) { DrawPATfile.ReducePathFull(); } if (TVUserInput.IsDown(TVUserCommands.ShiftToPathLocation)) { DrawArea.ShiftToLocation(DrawPATfile.CurrentLocation); } } if (PathEditor != null && Properties.Settings.Default.showTrainpath) { if (TVUserInput.IsPressed(TVUserCommands.ExtendPath)) { PathEditor.ExtendPath(); } if (TVUserInput.IsPressed(TVUserCommands.ExtendPathFull)) { PathEditor.ExtendPathFull(); } if (TVUserInput.IsPressed(TVUserCommands.ReducePath)) { PathEditor.ReducePath(); } if (TVUserInput.IsPressed(TVUserCommands.ReducePathFull)) { PathEditor.ReducePathFull(); } if (TVUserInput.IsDown(TVUserCommands.ShiftToPathLocation)) { DrawArea.ShiftToLocation(PathEditor.CurrentLocation); } if (TVUserInput.IsPressed(TVUserCommands.EditorUndo)) { PathEditor.Undo(); } if (TVUserInput.IsPressed(TVUserCommands.EditorRedo)) { PathEditor.Redo(); } if (TVUserInput.IsMouseXButton1Pressed()) { PathEditor.Undo(); } if (TVUserInput.IsMouseXButton2Pressed()) { PathEditor.Redo(); } } if (PathEditor != null && PathEditor.EditingIsActive) { if (TVUserInput.IsMouseRightButtonPressed()) { PathEditor.OnLeftMouseRelease(); // any action done with left mouse is cancelled now PathEditor.PopupContextMenu(TVUserInput.MouseLocationX, TVUserInput.MouseLocationY); } if (TVUserInput.IsDown(TVUserCommands.EditorTakesMouseClick)) { if (TVUserInput.IsMouseLeftButtonPressed()) { PathEditor.OnLeftMouseClick(TVUserInput.MouseLocationX, TVUserInput.MouseLocationY); } if (TVUserInput.IsMouseLeftButtonDown()) { PathEditor.OnLeftMouseMoved(); // to make sure it is reactive enough, don't even care if mouse is really moved } if (TVUserInput.IsMouseLeftButtonReleased()) { PathEditor.OnLeftMouseRelease(); } } if (TVUserInput.IsReleased(TVUserCommands.EditorTakesMouseClick)) { PathEditor.OnLeftMouseCancel(); } drawPathChart.DrawDynamics(); } if (!TVUserInput.IsDown(TVUserCommands.EditorTakesMouseClick) && !this.MenuHasMouse && !this.drawPathChart.IsActived) { if (TVUserInput.IsMouseMoved() && TVUserInput.IsMouseLeftButtonDown()) { DrawArea.ShiftArea(TVUserInput.MouseMoveX(), TVUserInput.MouseMoveY()); } } if (TVUserInput.IsMouseWheelChanged()) { int mouseWheelChange = TVUserInput.MouseWheelChange(); if (!this.drawPathChart.IsActived) { if (TVUserInput.IsDown(TVUserCommands.MouseZoomSlow)) { DrawArea.Zoom(mouseWheelChange > 0 ? -1 : 1); } else { DrawArea.Zoom(-mouseWheelChange / 40); } } } DrawArea.Update(); drawAreaInset.Update(); drawAreaInset.Follow(DrawArea, 10f); if (TVUserInput.IsPressed(TVUserCommands.ToggleZoomAroundMouse)) { menuControl.MenuToggleZoomingAroundMouse(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowTerrain)) { menuControl.MenuToggleShowTerrain(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowDMTerrain)) { menuControl.MenuToggleShowDMTerrain(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowPatchLines)) { menuControl.MenuToggleShowPatchLines(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowSignals)) { menuControl.MenuToggleShowSignals(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowSidings)) { menuControl.MenuToggleShowSidings(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowSidingNames)) { menuControl.MenuToggleShowSidingNames(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowPlatforms)) { menuControl.MenuToggleShowPlatforms(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowPlatformNames)) { menuControl.MenuCirculatePlatformStationNames(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowSpeedLimits)) { menuControl.MenuToggleShowSpeedLimits(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowMilePosts)) { menuControl.MenuToggleShowMilePosts(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowTrainpath)) { menuControl.MenuToggleShowTrainpath(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleShowPatFile)) { menuControl.MenuToggleShowPatFile(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleHighlightTracks)) { menuControl.MenuToggleHighlightTracks(); } if (TVUserInput.IsPressed(TVUserCommands.ToggleHighlightItems)) { menuControl.MenuToggleHighlightItems(); } if (TVUserInput.IsPressed(TVUserCommands.Debug)) { runDebug(); } base.Update(gameTime); }